Merhabalar,
Bakiyeye göre pmax stratejisi için lütfen aşağıdaki linki inceleyiniz.
https://destek.matriksdata.com/?qa=2126/pmax-indikat%C3%B6r%C3%BCne-bakiye-ve-enstruman-say%C4%B1s%C4%B1-giri%C5%9Fi&show=2126#q2126
Hem kaldıraç kullanarak hem de bakiyenin tamamı ile işlem yapılamıyor.
Pmax Kaldıraçlı Strateji için ise lütfen inceleyiniz.
***STRATEJİLERİ TEST/DENEME ORTAMINDA SINAMADAN VE SİZİN İSTEDİĞİNİZ ŞEKİLDE ÇALIŞTIĞINA EMİN OLMADAN GERÇEK ORTAMDA HİÇBİR ZAMAN ÇALIŞTIRMAYINIZ ***
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
/*
___ Kripex ---
Gönderilen emir Binance kaynaklı timestamp hatasından dolayı iptal olduğunda
İptal olan emir aynı özelliklerle(Sembol,adet,fiyat,emir tipi,yönü ...) belirlenen süre sonra tekrar gönderilecektir.
Bu süreyi KacSaniyeSonraTekrarGonderilsin değişkeni ile ayarlanabilir. Süre saniye cinsindendir.
Bu işlem AyniEmirKacSeferGonderilsin değişkeni kadar tekrarlanabilir.
Bu işlemin çok fazla tekrarlanması Binance tarafından ban yenmesine neden olabilir.
*/
namespace Matriks.Lean.Algotrader
{
public class pmaxkaldırac : MatriksAlgo
{
// Strateji çalıştırılırken kullanacağımız parametreler. Eğer sembolle ilgili bir parametre ise,
// "SymbolParameter" ile, değilse "Parameter" ile tanımlama yaparız. Parantez içindeki değerler default değerleridir.
[SymbolParameter("BTC_USDT_BIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(5)]
public decimal BuyOrderQuantity;
[Parameter(5)]
public decimal SellOrderQuantity;
[Parameter(10)]
public int ATRPeriod;
[Parameter(10)]
public int MovPeriod;
[Parameter(3)]
public decimal Coefficient;
[Parameter(MovMethod.E)]
public MovMethod MovMethod;
PMaxIndicator pmax;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
pmax = PMaxIndicators(Symbol, SymbolPeriod, ATRPeriod, MovPeriod, (decimal) Coefficient, MovMethod);
SendOrderSequential(true, Side.All);
WorkWithPermanentSignal(true);
// Gerekli - Timestamp
SetTimerInterval(1);
// #Gerekli - Timestamp
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
if (CrossAbove(pmax.KLine, pmax.StLine))
{
SendMarketOrder(Symbol, BuyOrderQuantity, OrderSide.Buy);
Debug("Alış Emri Gönderildi");
}
if (CrossBelow(pmax.KLine, pmax))
{
SendMarketOrder(Symbol, SellOrderQuantity, OrderSide.Sell);
Debug("Satış Emri Gönderildi");
}
}
// Gerekli - Timestamp
public class OrderListTimestamp
{
public string ID;
public string Sembol;
public decimal Adet;
public decimal Fiyat;
public OrdType EmirTipi;
public OrderSide orderSide;
public string EmirYonu;
public DateTime TetiklenmeZamani;
public int Sayac;
public bool AktifMI;
}
Dictionary<string, OrderListTimestamp> timestampDict = new Dictionary<string, OrderListTimestamp>();
[Parameter(3)]
public int AyniEmirKacSeferGonderilsin;
[Parameter(10)]
public int KacSaniyeSonraTekrarGonderilsin;
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
Debug("gerçekleşti");
if (timestampDict.ContainsKey(order.CliOrdID))
{
timestampDict.Remove(order.CliOrdID);
Debug("Timestamp hatasına takılan emriniz gerçekleşti.");
}
}
if (order.OrdStatus.Obj == OrdStatus.Rejected)
{
if (!timestampDict.ContainsKey(order.CliOrdID))
{
OrderListTimestamp orderList = new OrderListTimestamp();
orderList.ID = order.CliOrdID;
orderList.Sembol = order.Symbol;
orderList.Adet = order.OrderQty;
orderList.Fiyat = order.Price;
orderList.EmirTipi = order.OrdType;
orderList.TetiklenmeZamani = DateTime.Now;
orderList.Sayac = 0;
orderList.AktifMI = false;
if (order.Side.Obj == Side.Buy)
{
orderList.orderSide = OrderSide.Buy;
orderList.EmirYonu = "Alış";
}else
{
orderList.orderSide = OrderSide.Sell;
orderList.EmirYonu = "Satış";
}
timestampDict[order.CliOrdID] = orderList;
}
if (order.Text.Contains("Timestamp"))
{
if (timestampDict.ContainsKey(order.CliOrdID))
{
if (timestampDict[order.CliOrdID].Sayac < AyniEmirKacSeferGonderilsin)
{
timestampDict[order.CliOrdID].TetiklenmeZamani = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
timestampDict[order.CliOrdID].Sayac++;
timestampDict[order.CliOrdID].AktifMI = true;
Debug("Emir Timestamp hatasından dolayı iptal oldu tekrar gönderilecek");
}else
{
timestampDict.Remove(order.CliOrdID);
Debug("Aynı emir üst üste " + AyniEmirKacSeferGonderilsin + " defa gönderildi.");
}
}
}
}
}
string orderIDTimestamp = string.Empty;
public override void OnTimer()
{
var tutt = timestampDict.Where(x => x.Value.AktifMI == true && DateTime.Now >= x.Value.TetiklenmeZamani);
if (tutt.Count() >0)
{
foreach (var deger in tutt)
{
LastOrderSide.Obj = deger.Value.orderSide == OrderSide.Buy? Side.Sell:Side.Buy;
if (deger.Value.EmirTipi.Obj == OrdType.Limit)
{
orderIDTimestamp = SendLimitOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide, deger.Value.Fiyat);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}else if (deger.Value.EmirTipi.Obj == OrdType.Market)
{
orderIDTimestamp = SendMarketOrder(deger.Value.Sembol, deger.Value.Adet, deger.Value.orderSide);
Debug(deger.Value.EmirYonu + " emri tekrar gönderildi.");
}
deger.Value.ID = orderIDTimestamp;
deger.Value.AktifMI = false;
timestampDict[orderIDTimestamp] = deger.Value;
timestampDict.Remove(deger.Key);
}
}
}
// #Gerekli - Timestamp
}
}
İyi çalışmalar.