AlgoTrader’da bir strateji yazıyorum. MatriksAlgo sınıfını Matriks.Lean.Algotrader.AlgoBase ad alanıyla kullanıyorum. SendOrder metodunda Side, OrdType, TimeInForce, TransactionType gibi enum değerlerini doğru şekilde kullanıyorum (Side.Buy, OrdType.Limit, vb.), ancak hala CS1503 hatası alıyorum. Ayrıca, OnOrderFilled metodunun imzasını OrderEventArgs ile kullanıyorum, doğru mu? Örnek bir kod verebilir misiniz?” örnek kod aşağıdaki gibidir
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 LXSALGO4_5 : MatriksAlgo
{
// Strateji parametreleri
[SymbolParameter("XU100")]
public string Symbol1;
[Parameter(SymbolPeriod.Min15)]
public SymbolPeriod SymbolPeriod1;
[Parameter(Side.Buy)]
public Side orderSide;
[Parameter(14)]
public int AdxPeriod1;
[Parameter(14)]
public int RsiPeriod1;
[Parameter(50)]
public int SmaPeriod1;
[Parameter(10)]
public int CustomindicatorstestPeriod1;
[Parameter(0.0005)]
public decimal CustomindicatorstestFactor1;
[Parameter(1)]
public decimal OrderQuantity1;
[Parameter(1)]
public decimal OrderQuantity2;
[Parameter(1)]
public decimal OrderQuantity3;
[Parameter(1)]
public decimal OrderQuantity4;
// Göstergeler
ADX adx;
RSI rsi;
SMA sma;
MatriksIndicator CustomIndicatorsTEST;
// Kademeli satış için değişkenler
private Dictionary<string, decimal> buyPrices = new Dictionary<string, decimal>(); // Gerçekleşen alım fiyatlarını saklamak için
public override void OnInit()
{
adx = ADXIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, AdxPeriod1);
rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, RsiPeriod1);
sma = SMAIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, SmaPeriod1);
CustomIndicatorsTEST = new CustomIndicatorsTEST();
CustomIndicatorsTEST.SetIndicatorParameters("Period", CustomindicatorstestPeriod1);
CustomIndicatorsTEST.SetIndicatorParameters("Factor", CustomindicatorstestFactor1);
RegisterUserIndicator(CustomIndicatorsTEST, Symbol1, SymbolPeriod1, OHLCType.Close, 5);
SendOrderSequential(false);
WorkWithPermanentSignal(true);
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
if (adx.Value[0][adx.CurrentIndex] < 30m && CrossAbove(CustomIndicatorsTEST, sma, 1, 0))
{
SendMarketOrder(Symbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession:false);
}
if (rsi.Value[0][rsi.CurrentIndex] < 30m && (adx.Value[0][adx.CurrentIndex] < 20m))
{
SendMarketOrder(Symbol1, OrderQuantity4, OrderSide.Buy, includeAfterSession:false);
}
if (rsi.Value[0][rsi.CurrentIndex] > 85m && CrossBelow(CustomIndicatorsTEST, sma, 0, 0))
{
SendMarketOrder(Symbol1, OrderQuantity2, OrderSide.Sell, includeAfterSession:false);
}
if (CrossBelow(CustomIndicatorsTEST, sma, 0, 0))
{
SendMarketOrder(Symbol1, OrderQuantity3, OrderSide.Sell, includeAfterSession:false);
}
}
public override void OnOrderUpdate(OrderEventArgs args)
{
}
public override void OnOrderFilled(OrderEventArgs args)
{
if (args.Order.OrderSide == Side.Buy) // Eğer gerçekleşen emir bir alım emriyse
{
decimal buyPrice = args.Order.Price; // Gerçekleşen alım fiyatı
decimal quantity = args.Order.Amount; // Gerçekleşen miktar
string orderId = args.Order.OrderId; // Emir ID'si
// Alım fiyatını ve miktarını sakla
buyPrices[orderId] = buyPrice;
// Kademeli satış için fiyatları hesapla
decimal sellPrice1x = buyPrice * 1m; // 1x katı
decimal sellPrice3x = buyPrice * 3m; // 3x katı
decimal sellPrice5x = buyPrice * 5m; // 5x katı
// Satış adetlerini hesapla (toplam miktarı 3'e böl)
decimal sellQuantity1x = Math.Floor(quantity / 3m); // 33%
decimal sellQuantity3x = Math.Floor(quantity / 3m); // 33%
decimal sellQuantity5x = quantity - (sellQuantity1x + sellQuantity3x); // Kalan miktar (34%)
// Kademeli satış emirlerini yerleştir
PlaceSellOrders(sellPrice1x, sellQuantity1x);
PlaceSellOrders(sellPrice3x, sellQuantity3x);
PlaceSellOrders(sellPrice5x, sellQuantity5x);
}
}
private void PlaceSellOrders(decimal price, decimal quantity)
{
SendOrder(Symbol1, quantity, price, Side.Sell, OrdType.Limit, TimeInForce.Day, TransactionType.Normal, ChartIcon.None, null, null, BridgeTriggerType.None, null, 0m, 0m, 0m, 0m, 0m, false, false, null, MobileNotificationActionType.NoAction, null, false);
}
public override void OnStopped()
{
}
}
}