Merhaba,
Aşağıdaki şablonu kullanabilirsiniz.
Bu şablonda iptal olan tüm emirler belirlenen saniyede bir belirlenen sayı kadar tekrar ederek aynı emri iletir.
Varsayılan olarak iptal olan emir her 10 saniye de bir tekrar iletilir bu işlem toplamda 3 sefer olur.
Eğer iptal olan emir bir sefer gönderilmesini istiyorsanız AyniEmirKacSeferGonderilsin değişken değerini 1 yapıp deneyebilirsiniz.
Uygulama:
// ------------------------------------------------------------------
// ------------ IPTAL OLAN EMİRLERİ TEKRAR GÖNDER
// ------------------------------------------------------------------
Örnek stratejide yukarıdaki açıklama satırından son satıra kadar kopyalayınız. Kendi stratejinizdeki son 2 süslü ( } ) parantezi silip kopyalanan satırları yapıştırınız.
OnInit() metoduna
OnInit_SablonIptalOlanEmriTekrarGonder(true);
OnOrderUpdate() metoduna
OnOrderUpdate_SablonIptalOlanEmriTekrarGonder(order);
OnTimer() metoduna da aşağıdaki fonksiyonları eklemeniz yeterli olur
OnTimer_SablonIptalOlanEmriTekrarGonder();
iyi çalışmalar.
Örnek:
/*
▂ ▃ ▅ ▆ █ KRİPEX █ ▆ ▅ ▃ ▂
Gönderilen emir iptal olursa belirlenen sayı kadar tekrar gönderilmesi sağlanır.
*/
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;
namespace Matriks.Lean.Algotrader
{
public class SablonIptalOlanEmriTekrarGonder : MatriksAlgo
{
[SymbolParameter("BNB_USDT_BIN")]
public string Symbol;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod;
public override void OnInit()
{
AddSymbol(Symbol, SymbolPeriod);
SendOrderSequential(true, Side.Buy);
WorkWithPermanentSignal(true);
OnInit_SablonIptalOlanEmriTekrarGonder(true);
}
public override void OnOrderUpdate(IOrder order)
{
OnOrderUpdate_SablonIptalOlanEmriTekrarGonder(order);
}
public override void OnTimer()
{
OnTimer_SablonIptalOlanEmriTekrarGonder();
}
// ------------------------------------------------------------------
// ------------ IPTAL OLAN EMİRLERİ TEKRAR GÖNDER
// ------------------------------------------------------------------
int KacSaniyeSonraTekrarGonderilsin = 10;
int AyniEmirKacSeferGonderilsin = 3;
Dictionary<string, IOrder> RejectedOrderList = new Dictionary<string, IOrder>();
bool SablonIptalOlanEmriTekrarGonderDurum = false;
public void OnInit_SablonIptalOlanEmriTekrarGonder(bool AktifMI)
{
if (AktifMI)
{
SetTimerInterval(1);
SablonIptalOlanEmriTekrarGonderDurum = AktifMI;
}
}
public void OnTimer_SablonIptalOlanEmriTekrarGonder()
{
if (SablonIptalOlanEmriTekrarGonderDurum)
{
var sorgu = RejectedOrderList.Where(x => x.Value.BitmexPostOnly == true && DateTime.Now >= x.Value.ExpireDate && x.Value.MinPosition>0);
var oncekiYon = LastOrderSide.Obj;
foreach (var deger in sorgu)
{
var order = deger.Value;
LastOrderSide.Obj = Side.All;
var orderID = SendOrder(order.Symbol, order.OrderQty, order.Price, order.Side, order.OrdType, order.TimeInForce, order.TransactionType, order.ChartIcon);
order.MinPosition--;
order.BitmexPostOnly = false;
order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
order.CliOrdID = orderID;
Debug("İptal olan emir tekrar gönderildi. Detay -> CliOrdID: " + order.CliOrdID + " Yon: " + order.Side.Obj.ToString() + " kalan: " + order.MinPosition);
}
LastOrderSide.Obj = oncekiYon;
}
}
public void OnOrderUpdate_SablonIptalOlanEmriTekrarGonder(IOrder order)
{
if (SablonIptalOlanEmriTekrarGonderDurum)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);
if (sorgu.Key != null)
{
Debug("İptal olan emir gerçekleşti. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + sorgu.Value.Text);
}
}
if (order.OrdStatus.Obj == OrdStatus.Rejected)
{
var sorgu = RejectedOrderList.FirstOrDefault(x => x.Value.CliOrdID == order.CliOrdID);
if (sorgu.Key == null)
{
order.BitmexPostOnly = true;
order.MinPosition = AyniEmirKacSeferGonderilsin;
order.ExpireDate = DateTime.Now.AddSeconds(KacSaniyeSonraTekrarGonderilsin);
RejectedOrderList[order.CliOrdID] = order;
Debug("Emir iptal oldu. Detay-> CliOrdID: " + order.CliOrdID + " Text: " + order.Text);
}else
{
sorgu.Value.BitmexPostOnly = true;
}
}
}
}
}
}