0 beğenilme 0 beğenilmeme
417 kez görüntülendi
Most İndikatörü ile

bir önceki barın (Low) % 70 üstünde alsın, bir önceki barın (High) %70 altında Satsın.

Times hasası verince tekrar emir göndersin

iptal yada red edilen limit emir olursa tekrar göndersin

aşagıda bir kod derledim ama hem eksik hemde hata veriyor.

düzenleyebilirmisiniz.



using System;

using System.Collections.Generic;

using System.Linq;

using Matriks;

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;

using Matriks.AI;

using Matriks.AI.AiParameters;

using Matriks.AI.Data;

using Matriks.Trader.Core.TraderModels;

 

namespace Matriks.Lean.Algotrader

{

public class BTC_USDT_BIN_Iz_Suren_HeikenAshi : MatriksAlgo

{

/// <summary>

///

///  #Gerekli - Timestamp yazan aralıkları ilgili yerlere eklendiğinde binance tarafından alınan timestamp hatasının kontrolünü eklemiş oluyoruz

/// emir tekrarlanarak yeniden gönderiliyor

/// strateji çalıştırılıken aynı emir kaç defa gönderilsin ve kaç saniye sonra tekrar gönderilsin parametrelerinin değiştirilmesine gerek yoktur.

/// sadece timestamp hatasına düştüğünde aynı emrin gerçekleşmesi adına 3 kere emir gönderimini deneyecektir

///

///  

/// </summary>

 

[SymbolParameter("BTC_BUSD_BIN")]

public string Symbol1;

[Parameter(SymbolPeriod.Min)]

public SymbolPeriod SymbolPeriod1;

[Parameter(3)]

public int MostPeriod1;

[Parameter(0.01)]

public decimal MostPercentage1;

[Parameter(MovMethod.Tsf)]

public MovMethod MostMovMethod1;

[Parameter(0.032)]

public decimal OrderQuantity1;

[Parameter(0.00567)]

public decimal StopLevel1;

 

 

MOST most;

MOST most1;

public override void OnInit()

{

var periodInfo = GetHeikinAshiPeriodInfo(SymbolPeriod1);

AddSymbol(Symbol1, periodInfo);

most = MOSTIndicator(Symbol1, periodInfo, OHLCType.WClose, MostPeriod1, MostPercentage1, MostMovMethod1);

most1 = MOSTIndicator(Symbol1, periodInfo, OHLCType.WClose, MostPeriod1, MostPercentage1, MostMovMethod1);

SendOrderSequential(true, Side.Buy);

WorkWithPermanentSignal(true);

 

// Gerekli - Timestamp

SetTimerInterval(1);

// #Gerekli - Timestamp

}

 

public override void OnDataUpdate(BarDataEventArgs barData)

{

var fiyat = GetBarData(Symbol1, SymbolPeriod1); // fiyat

 

if (CrossAbove(most, most, 1, 0))

{

//al için limit emir

SendLimitOrder(Symbol1, OrderQuantity1, OrderSide.Buy, GetSelectedValueFromBarData(fiyat, OHLCType.Low), includeAfterSession:false);

Debug("al limit emir gönderildi" + GetSelectedValueFromBarData(fiyat, OHLCType.Low));

 

}

if (CrossBelow(most, most1, 1, 0))

{

//sat için limit emir

SendLimitOrder(Symbol1, OrderQuantity1, OrderSide.Sell, GetSelectedValueFromBarData(fiyat, OHLCType.High), includeAfterSession:false);

TrailingStopLoss(Symbol1, SyntheticOrderPriceType.Percent, StopLevel1);

Debug("sat  limit emir gönderildi" + GetSelectedValueFromBarData(fiyat, OHLCType.High));

 

}

 

}

 

// Gerekli - Timestamp

public class OrderListTimestamp

{

public string ID;

public string Symbol;

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(10)]

public int AyniEmirKacSeferGonderilsin;

 

[Parameter(4)]

public int KacSaniyeSonraTekrarGonderilsin;

 

string orderIDTimestamp = string.Empty;

// #Gerekli - Timestamp

 

public override void OnTimer()

{

// Gerekli - Timestamp

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.Symbol, 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.Symbol, 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

// #İptal edilen Emitr Gönderimi

}

 

public override void OnOrderUpdate(IOrder order)

{

if (order.OrdStatus.Obj == OrdStatus.Rejected)

{

var adet = order.OrderQty;

 

if (order.Side.Obj == Side.Buy)

{

// Emirler sıralı gönderilmesi aktif ise tekrar alış göndermek için sıra değiştiriliyor.

LastOrderSide.Obj = Side.Sell;

SendMarketOrder(Symbol1, 2, OrderSide.Buy);

Debug("Alış emri tekrar gönderildi.");

}

else

{

LastOrderSide.Obj = Side.Buy;

SendMarketOrder(Symbol1, 2, OrderSide.Sell);

Debug("Satış emri tekrar gönderildi.");

 

 

 

// Gerekli - Timestamp

if (order.OrdStatus.Obj == OrdStatus.Filled)

{

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.Symbol = 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.");

}

}

}

}

}

}

// #Gerekli - Timestamp

 

 

}

}

}
Algoritmik Trading kategorisinde (90 puan) tarafından | 417 kez görüntülendi

1 cevap

1 beğenilme 0 beğenilmeme
En İyi Cevap
Merhabalar,

Akın Bey'e yönlendirdiğiniz mail üzerinden sizlere dönüş sağlanmıştır.

Dilerseniz stratejinizi mail üzerinden gönderip, takibini yapabilirsiniz.

İyi çalışmalar.
(11,059 puan) tarafından
tarafından seçilmiş
Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.



8,639 soru
8,593 cevap
4,826 yorum
19,832 kullanıcı