İyi günler;
Aşağıda gönderdiğim kod normal çalıştırıldığında hata vermezken, backtest ile çalıştırdığımda initialization sırasında hata veriyor. Yardımcı olursanız sevinirim.
using System;
using System.Collections.Generic;
using System.Linq;
using Matriks.Data.Symbol;
using System.Windows.Media;
using Matriks.Engines;
using Matriks.Indicators;
using Matriks.Symbols;
using Matriks.AlgoTrader;
using Matriks.Trader.Core;
using Matriks.Trader.Core.Fields;
using Matriks.Trader.Core.TraderModels;
using Matriks.Lean.Algotrader.AlgoBase;
using Matriks.Lean.Algotrader.Models;
using Matriks.Lean.Algotrader.Trading;
using System.Timers;
//===========================================ACIKLAMA=======================================//
// MOST indikatöründe, ExMOV bandının MOST bandını yukarı doğru kesmesi al sinyali, //
// aşağı doğru kesmesi ise sat sinyali olarak kabul edilir. //
// Emirler piyasa fiyatından gönderilecektir. //
// Kenan Karagöz-09/12/2023
namespace Matriks.Lean.Algotrader
{
public class myMost : 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("TTKOM")]
public string Symbol;
[Parameter(SymbolPeriod.Min5)]
public SymbolPeriod SymbolPeriod;
[Parameter(1000)]
public decimal IslemHacmi;
[Parameter(3)]
public int MostPeriod;
[Parameter(2)]
public decimal MostPercentage;
[Parameter(true)]
public bool TrailingStopKullan;
[Parameter(2)]
public decimal TrailingStopYuzdesi;
decimal OrderQuantity = 0;
Dictionary<string, AlgoTraderPosition> positions;
public Timer ProtectionTimer;
enum ProtectionType
{
prNone, prDontBuy, prDontSell
};
ProtectionType protection = ProtectionType.prNone;
MOST most;
private bool CheckBuySignal()
{
return (most.Value[0][most.CurrentIndex] < most.Value[1][most.CurrentIndex]);
}
private bool CheckSellSignal()
{
return (most.Value[0][most.CurrentIndex] > most.Value[1][most.CurrentIndex]);
}
/// <summary>
/// Strateji ilk çalıştırıldığında bu fonksiyon tetiklenir. Tüm sembole kayit işlemleri,
/// indikator ekleme, haberlere kayıt olma işlemleri burada yapılır.
/// </summary>
public override void OnInit()
{
most = MOSTIndicator(Symbol, SymbolPeriod, OHLCType.Close, MostPeriod, MostPercentage, MovMethod.Exponential);
AddSymbol(Symbol, SymbolPeriod);
WorkWithPermanentSignal(false);
positions = GetRealPositions();
if (positions.ContainsKey(Symbol))
SendOrderSequential(true, Side.Sell);
else
SendOrderSequential(true, Side.Buy);
ProtectionTimer = new Timer(60000 * 4);
ProtectionTimer.Elapsed += OnCustomTimer;
OrderQuantity = 0;
if (SymbolPositionExists())
{
OrderQuantity = positions[Symbol].QtyAvailable;
}
}
/// <summary>
/// SetTimerInterval fonksiyonu ile belirtilen sürede bir bu fonksiyon tetiklenir.
/// </summary>
private void OnCustomTimer(object sender, ElapsedEventArgs e)
{
positions = GetRealPositions();
protection = ProtectionType.prNone;
ProtectionTimer.Stop();
positions.Clear();
}
/// <summary>
/// Eklenen sembollerin bardata'ları ve indikatorler güncellendikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="barData">Bardata ve hesaplanan gerçekleşen işleme ait detaylar</param>
public override void OnDataUpdate(BarDataCurrentValues barDataCurrentValues)
{
Buy(barDataCurrentValues);
Sell(barDataCurrentValues);
}
/// <summary>
/// Strateji durdurulduğunda bu fonksiyon tetiklenir.
/// </summary>
public override void OnStopped()
{
}
private bool SymbolPositionExists()
{
return positions.ContainsKey(Symbol);
}
private void Buy(BarDataCurrentValues barDataCurrentValues)
{
if (protection == ProtectionType.prDontBuy) return;
if (SymbolPositionExists()) return;
if (CheckBuySignal())
{
OrderQuantity = IslemHacmi / barDataCurrentValues.LastUpdate.LastPrice;
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
if (TrailingStopKullan)
TrailingStopLoss(Symbol, SyntheticOrderPriceType.Percent, TrailingStopYuzdesi);
positions.Add(Symbol, null);
protection = ProtectionType.prDontBuy;
ProtectionTimer.Start();
}
}
private void Sell(BarDataCurrentValues barDataCurrentValues)
{
if (protection == ProtectionType.prDontSell) return;
if (!SymbolPositionExists()) return;
if (CheckSellSignal())
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
protection = ProtectionType.prDontSell;
ProtectionTimer.Start();
}
}
}
}