Timestamp for this request was 1000ms ahead of the server's time. Timestamp for this request was 1000ms ahead of the server's time.
SS:
https://prnt.sc/Sf4olfhQhvQ4
Merhabalar,
Stratejimi çalıştırdığımda(Kripto) Sentetik emir tetiklendi ve reddedildi, bu hatayı verdi, sonradan streamconnection bağlantı koptu ve bağlandı hatası aldım sürekli. Stratejimin kodunu aşağıya bırakıyorum:
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks;
using Matriks.Data.Symbol;
using Matriks.Data.Tick;
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;
using Matriks.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;
using Newtonsoft.Json;
namespace Matriks.Lean.Algotrader
{
public class MOTTCiftYonWithTP : MatriksAlgo
{
// ------------------ Temel Parametreler ------------------ //
[SymbolParameter("BTC_USDT_FBIN")]
public string Symbol1;
[Parameter(SymbolPeriod.Min)]
public SymbolPeriod SymbolPeriod1;
[Parameter(Side.All)]
public Side orderSide;
[Parameter(true)]
public bool SendsTelegramNotifications;
[Parameter("MOTTCiftYonWithTP - Koşul 1 gerçekleşti.")]
public string TelegramBotMessage1;
[Parameter("MOTTCiftYonWithTP - Koşul 2 gerçekleşti.")]
public string TelegramBotMessage2;
[Parameter(21)]
public int MovPeriod1;
[Parameter(MovMethod.S)]
public MovMethod MovMovMethod1;
[Parameter(245)]
public int MottX11;
[Parameter(2)]
public decimal MottX21;
[Parameter(0)]
public int MottOteleme1;
// Alım/Satım işlemleri için tek OrderQuantity
[Parameter(1)]
public decimal OrderQuantity;
// Tek leverage parametresi (hem long hem short işlemler için)
[Parameter(3)]
public decimal Leverage;
[Parameter(CryptoLeverageType.Isolated)]
public CryptoLeverageType LeverageType;
// Açığa satış entegrasyonu için parametre (varsayılan true)
[Parameter(true)]
public bool AcigaSatisYapilsin;
// ------------------ BBW Parametreleri ------------------ //
[Parameter(20)]
public int BbwPeriod;
[Parameter(2)]
public decimal BbwStandardDeviation;
[Parameter(MovMethod.S)]
public MovMethod BbwMovMethod;
[Parameter(15)]
public decimal BbwThreshold;
// ------------------ Stop Level (Take Profit) & Stop Loss Parametreleri ------------------ //
// Hem long hem de short işlemler için aynı stop seviyeleri kullanılacaktır.
[Parameter(4)]
public decimal StopLevel;
[Parameter(4)]
public decimal StopLoss;
// ------------------ Göstergeler ------------------ //
MOV mov;
MatriksIndicator MOTT;
BBW bbw;
// Sentetik emir tetiklenip tetiklenmediğini kontrol etmek için flag
bool syntheticOrderTriggered = false;
public override void OnInit()
{
// MOV ve MOTT göstergeleri
mov = MOVIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MovPeriod1, MovMovMethod1);
MOTT = new MOTT();
MOTT.SetIndicatorParameters("X1", MottX11);
MOTT.SetIndicatorParameters("X2", MottX21);
MOTT.SetIndicatorParameters("Oteleme", MottOteleme1);
RegisterUserIndicator(MOTT, Symbol1, SymbolPeriod1, OHLCType.Close, 5);
// BBW göstergesini başlatıyoruz.
bbw = BBWIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, BbwPeriod, BbwStandardDeviation, BbwMovMethod);
// Tek leverage parametresi kullanılarak tüm işlemler için ayarlama yapılıyor.
SetLeverage(Symbol1, Leverage);
SetLeverageType(Symbol1, LeverageType);
SendOrderSequential(true, orderSide);
WorkWithPermanentSignal(true);
// SetTimerInterval(3600);
// AddNewsSymbol(Symbol);
// AddNewsKeyword("KAP");
}
public override void OnInitCompleted() { }
public override void OnTimer() { }
public override void OnNewsReceived(int newsId, List<string> relatedSymbols) { }
/// <summary>
/// OnDataUpdate: Önce BBW threshold filtresi uygulanır. Ardından, MOV ve MOTT göstergeleriyle alım/satım sinyalleri kontrol edilir.
/// Açığa satış mantığı ile; eğer mevcut pozisyon ters yönde ise emir miktarı OrderQuantity * 2 olarak gönderilir.
/// Ancak, sentetik emir tetiklenmişse emir miktarı temel (base) miktar (OrderQuantity) kullanılır.
/// Ayrıca, her emirden sonra take profit (StopLevel) ve stop loss (StopLoss) emirleri de gönderilir.
/// </summary>
/// <param name="barData">Bardata ve hesaplanan gerçekleşen işlem detayları</param>
public override void OnDataUpdate(BarDataEventArgs barData)
{
// BBW threshold kontrolü: Eğer BBW değeri eşik değerinin altında ise emir gönderme.
if (bbw.CurrentValue < BbwThreshold)
return;
// ALIM sinyali: MOV ve MOTT göstergeleri arasındaki yukarı kesişmeler
if (CrossAbove(mov, MOTT, 0, 0) || CrossAbove(mov, MOTT, 0, 1) ||
CrossAbove(mov, MOTT, 0, 2) || CrossAbove(mov, MOTT, 0, 3))
{
if (LastOrderSide.Obj != Side.Buy)
{
var _buyQuantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || syntheticOrderTriggered)
? OrderQuantity : OrderQuantity * 2;
SendMarketOrder(Symbol1, _buyQuantity, OrderSide.Buy, includeAfterSession: false);
// Take Profit ve Stop Loss emirlerini gönderiyoruz.
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, StopLevel, includeAfterSession: false);
StopLoss(Symbol1, SyntheticOrderPriceType.Percent, StopLoss, includeAfterSession: false);
if (SendsTelegramNotifications)
{
SendTelegramBot(TelegramBotMessage1);
}
syntheticOrderTriggered = false; // Emir gönderildikten sonra flag sıfırlanır.
}
}
// SATIM sinyali: MOV ve MOTT göstergeleri arasındaki aşağı kesişmeler
if (CrossBelow(mov, MOTT, 0, 0) || CrossBelow(mov, MOTT, 0, 1) ||
CrossBelow(mov, MOTT, 0, 2) || CrossBelow(mov, MOTT, 0, 3))
{
if (LastOrderSide.Obj != Side.Sell)
{
var _sellQuantity = (LastOrderSide.Obj == Side.All || !AcigaSatisYapilsin || syntheticOrderTriggered)
? OrderQuantity : OrderQuantity * 2;
SendMarketOrder(Symbol1, _sellQuantity, OrderSide.Sell, includeAfterSession: false);
// Take Profit ve Stop Loss emirlerini gönderiyoruz.
TakeProfit(Symbol1, SyntheticOrderPriceType.Percent, StopLevel, includeAfterSession: false);
StopLoss(Symbol1, SyntheticOrderPriceType.Percent, StopLoss, includeAfterSession: false);
if (SendsTelegramNotifications)
{
SendTelegramBot(TelegramBotMessage2);
}
syntheticOrderTriggered = false;
}
}
}
/// <summary>
/// Sentetik emir (örneğin TP veya SL tetiklenmesi) gerçekleştiğinde bu metod çalışır.
/// Böylece, sonraki ters yöndeki emirlerde quantity * 2 mantığı yerine temel OrderQuantity kullanılır.
/// </summary>
/// <param name="sOrder">Sentetik emir bilgileri</param>
public override void OnSyntheticOrderTriggered(SyntheticAlgoOrder sOrder)
{
if (sOrder.EnableOrderSending)
{
syntheticOrderTriggered = true;
// Pozisyon tamamen kapandıysa, LastOrderSide sıfırlanabilir.
LastOrderSide.Obj = Side.All;
}
Debug("Sentetik emir tetiklendi, syntheticOrderTriggered = true");
}
public override void OnOrderUpdate(IOrder order) { }
public override void OnStopped() { }
}
}