Matriks Destek ve Yardım Platformu

Matriks Ürünleri ile ilgili tüm sorularınız için bizlere buradan ulaşabilirsiniz. Daha önce sorulan soruları ve verilen cevapları ilgili sekmelerden ve arama üzerinden inceleyebilirsiniz. Sağ taraftaki kategoriler üzerinden İlgilendiğiniz özelliklerle ilgili soruları filtreleyebilirsiniz. Soru ve cevapları sosyal medyada paylaşabilirsiniz. Sorduğunuz ve cevapladığınız soruların ve yorumlarınızın aldığı oylar üzerinden puan kazanırsınız. Puan sistemine bağlı kampanyamızla ücretsiz kullanım avantajlarından faydalanabilirsiniz.

0

Hata kodu CS1503

Soruldu
Görüntülenme
419 görüntülenme
Durum
Cevaplandı
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()
        {
        }
    }
}
Paylaş
CevaplaBayrakladüzenlendi · emresVedatdvc16

1 Cevap

0

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.

BağlantıBayrakladüzenlendi · emresemresMatriks Destek6.795

Cevabınız

Cevap yazmak için giriş yapın.Giriş yapKayıt ol