0 beğenilme 0 beğenilmeme
68 kez görüntülendi
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()
        {
        }
    }
}
Algoritmik Trading kategorisinde (12 puan) tarafından
tarafından yeniden gösterildi | 68 kez görüntülendi

1 cevap

0 beğenilme 0 beğenilmeme

Merhabalar,
Emir takibi yaparken OnOrderUpdate(IOrder) fonksiyonunu kullananabilirsiniz.
Emir durum takibi, işlem detayları gibi tüm kontroller yapılabilir.

Örnek olması açısından aşağıdaki kod yapısına göz atabilirsiniz.

if (order.Side.Obj == Side.Buy && order.OrdStatus.Obj == OrdStatus.Filled)
{
	Debug($"Alış emri gerçekleşti. Fiyat: {order.Price}");
}


Algo kullanım kılavuzunda da detaylar bulunmakta.
https://iqyardim.matriksdata.com/docs/matriksiq-kullanim-kilavuzu/algotrader/temel-metotlar/#12-toc-title

İyi çalışmalar dileriz.

(4,315 puan) tarafından
9,140 soru
9,095 cevap
5,026 yorum
27,715 kullanıcı