İyi günler;yıllardır metatrader kullanıyorum. matriksiq ilk kez deniyorum.
Sanırım getrealpositions backtestte çalışmıyor. Ayrıca timer ların da simule edilemediğini düşünüyorum. yazdığım koda testing diye bir değişken ekledim. backtestte hata almamak için. test yapacağım zaman bunu true olarak değiştiriyorum.
bunun dışında kodumda gözünüze çarpan bir hata var ise bildirirseniz sevinirim.
Teşekkürler.
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;
decimal OrderQuantity = 0;
bool Testing = false;
Dictionary<string, AlgoTraderPosition> positions;
public Timer modeTimer;
enum ProcessMode
{
pmFree, pmWait
};
ProcessMode mode = ProcessMode.pmFree;
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);
if (!Testing)
{
positions = GetRealPositions();
if (positions.ContainsKey(Symbol))
{
SendOrderSequential(true, Side.Sell);
Debug("Açık Emir bulundu. Satış çalışıyor");
}
else
{
SendOrderSequential(true, Side.Buy);
Debug("Açık Emir bulunamadı. Alış çalışıyor");
}
}
else
{
SendOrderSequential(true, Side.Buy);
positions = new Dictionary<string, AlgoTraderPosition>();
}
modeTimer = new Timer(60000 * 4);
modeTimer.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)
{
if (!Testing)
positions = GetRealPositions();
mode = ProcessMode.pmFree;
modeTimer.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()
{
}
/// <summary>
/// Gönderilen emirlerin son durumu değiştikçe bu fonksiyon tetiklenir.
/// </summary>
/// <param name="barData">Emrin son durumu</param>
public override void OnOrderUpdate(IOrder order)
{
if (order.OrdStatus.Obj == OrdStatus.Filled)
{
}
}
private bool SymbolPositionExists()
{
return positions.ContainsKey(Symbol);
}
private void Buy(BarDataCurrentValues barDataCurrentValues)
{
if (mode == ProcessMode.pmWait) return;
if (SymbolPositionExists()) return;
if (CheckBuySignal())
{
OrderQuantity = IslemHacmi / barDataCurrentValues.LastUpdate.LastPrice;
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Buy));
positions.Add(Symbol, null);
if (!Testing)
{
mode = ProcessMode.pmWait;
modeTimer.Start();
}
if (Testing)
positions.Add(Symbol, null);
}
}
private void Sell(BarDataCurrentValues barDataCurrentValues)
{
if (mode == ProcessMode.pmWait) return;
if (!SymbolPositionExists()) return;
if (CheckSellSignal())
{
SendMarketOrder(Symbol, OrderQuantity, (OrderSide.Sell));
if (!Testing)
{
mode = ProcessMode.pmWait;
modeTimer.Start();
}
if (Testing)
positions.Remove(Symbol);
}
}
}
}