0 beğenilme 0 beğenilmeme
33 kez görüntülendi
using System;
using System.Collections.Generic;
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.Enumeration;
using Matriks.IntermediaryInstitutionAnalysis.Enums;

namespace Matriks.Lean.Algotrader
{
    public class OPEN5 : MatriksAlgo
    {
        // İşlem sırasını izlemek için durum değişkeni
        private enum TradeState { BuyAndCloseShort, SellAndOpenShort }
        private TradeState currentState = TradeState.BuyAndCloseShort;

        // Trailing stop için izlenen değişkenler
        private decimal entryPrice;      // İşlem açıldığında fiyat
        private bool isTrailingActive;   // Trailing stop aktif mi?

        // Strateji çalıştırılırken kullanacağımız parametreler
        [SymbolParameter("XU100")]
        public string Symbol1;

        [SymbolParameter("XU030")]
        public string Symbol2;

        [SymbolParameter("X30YVADE")]
        public string OrderSymbol1;

        [Parameter(SymbolPeriod.Min60)]
        public SymbolPeriod SymbolPeriod1;

        [Parameter(Side.All)]
        public Side orderSide;

        [Parameter(13)]
        public int RsiPeriod1;

        [Parameter(13)]
        public int RsiPeriod2;

        [Parameter(1)]
        public int MovPeriod1;

        [Parameter(MovMethod.S)]
        public MovMethod MovMovMethod1;

        [Parameter(1)]
        public int MovPeriod2;

        [Parameter(MovMethod.S)]
        public MovMethod MovMovMethod2;

        [Parameter(2)]
        public int MostPeriod1;

        [Parameter(2)]
        public decimal MostPercentage1;

        [Parameter(MovMethod.ZL)]
        public MovMethod MostMovMethod1;

        [Parameter(2)]
        public int MostPeriod2;

        [Parameter(2)]
        public decimal MostPercentage2;

        [Parameter(MovMethod.ZL)]
        public MovMethod MostMovMethod2;

        [Parameter(4)]
        public int WilliamsrPeriod1;

        [Parameter(4)]
        public int WilliamsrPeriod2;

        [Parameter(1)]
        public decimal StopLevel1;

        [Parameter(1)]
        public decimal OrderQuantity2;

        [Parameter(1)]
        public decimal OrderQuantity3;

        // İndikatörler
        RSI rsi;
        RSI rsi2;
        MOV mov;
        MOV mov2;
        MOST most;
        MOST most2;
        WILLIAMSR williamsr;   // İlk WILLIAMSR indikatörü
        WILLIAMSR williamsr2;  // İkinci WILLIAMSR indikatörü

        public override void OnInit()
        {
            // Semboller ve indikatörler tanımlanıyor
            AddSymbol(OrderSymbol1, SymbolPeriod1);
            rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, RsiPeriod1);
            rsi2 = RSIIndicator(Symbol2, SymbolPeriod1, OHLCType.Close, RsiPeriod2);
            mov = MOVIndicator(Symbol2, GetHeikinAshiPeriodInfo(SymbolPeriod1), OHLCType.Open, MovPeriod1, MovMovMethod1);
            mov2 = MOVIndicator(Symbol1, GetHeikinAshiPeriodInfo(SymbolPeriod1), OHLCType.Open, MovPeriod2, MovMovMethod2);
            most = MOSTIndicator(Symbol2, SymbolPeriod1, OHLCType.Close, MostPeriod1, MostPercentage1, MostMovMethod1);
            most2 = MOSTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MostPeriod2, MostPercentage2, MostMovMethod2);
            williamsr = WILLIAMSRIndicator(Symbol1, SymbolPeriod1, WilliamsrPeriod1);
            williamsr2 = WILLIAMSRIndicator(Symbol2, SymbolPeriod1, WilliamsrPeriod2);

            SendOrderSequential(true, orderSide);
            WorkWithPermanentSignal(true);

            // Trailing stop başlangıçta aktif değil
            isTrailingActive = false;
        }

        public override void OnDataUpdate(BarDataEventArgs barData)
        {
            // Verilerin alınması
            var barData1 = GetBarData(Symbol2, SymbolPeriod1);
            var ohlcData1 = GetSelectedValueFromBarData(barData1, OHLCType.Close);
            var ohlcData3 = GetSelectedValueFromBarData(barData1, OHLCType.Open);
            var barData2 = GetBarData(Symbol1, SymbolPeriod1);
            var ohlcData2 = GetSelectedValueFromBarData(barData2, OHLCType.Close);
            var ohlcData4 = GetSelectedValueFromBarData(barData2, OHLCType.Open);

            // İndikatör verilerini hesaplıyoruz.
            var rsiValue1 = rsi.Value[0][rsi.CurrentIndex];
            var rsiValue2 = rsi2.Value[0][rsi2.CurrentIndex];
            var williamsrValue1 = williamsr.Value[0][williamsr.CurrentIndex];
            var williamsrValue2 = williamsr2.Value[0][williamsr2.CurrentIndex];
            var mostValue1 = most.Value[0][most.CurrentIndex];
            var mostValue2 = most2.Value[0][most2.CurrentIndex];

            // İşlem durumuna göre hareket ediyoruz.
            switch (currentState)
            {
                // Al + Short Kapat (aynı mumda gerçekleşir)
                case TradeState.BuyAndCloseShort:
                    if (ohlcData1 > ohlcData3 && ohlcData2 > ohlcData4 && rsiValue1 > 50m && rsiValue2 > 50m && williamsrValue1 > -30m && williamsrValue2 > -30m && mostValue1 < ohlcData1 && mostValue2 < ohlcData2)
                    {
                        // Al işlemi ve Short Kapat işlemi aynı anda yapılır
                        entryPrice = ohlcData1; // Alış fiyatı olarak kapalı fiyat alınıyor
                        isTrailingActive = true; // Trailing stop aktif
                        SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Buy, includeAfterSession: false); // Al işlemi
                        SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Buy, includeAfterSession: false); // Short kapat işlemi
                        currentState = TradeState.SellAndOpenShort;  // Durum Satış + Short Aç'a geçer
                    }
                    break;

                // Sat + Short Aç (aynı mumda gerçekleşir)
                case TradeState.SellAndOpenShort:
                    if (ohlcData1 < ohlcData3 && ohlcData2 < ohlcData4 && rsiValue1 < 50m && rsiValue2 < 50m && williamsrValue1 < -60m && williamsrValue2 < -60m && mostValue1 > ohlcData2 && mostValue2 > ohlcData2)
                    {
                        entryPrice = ohlcData2; // Short için giriş fiyatı belirlenir
                        isTrailingActive = true; // Trailing stop aktif
                        SendMarketOrder(OrderSymbol1, OrderQuantity3, OrderSide.Sell, includeAfterSession: false);  // Sat işlemi
                        SendMarketOrder(OrderSymbol1, OrderQuantity3, OrderSide.Sell, includeAfterSession: false);  // Short aç işlemi
                        currentState = TradeState.BuyAndCloseShort;  // Durum Al + Short Kapat'a geçer
                    }
                    break;
            }

            // Trailing Stop Aktifse Kontrol Et
            if (isTrailingActive)
            {
                if (currentState == TradeState.SellAndOpenShort)
                {
                    // Al pozisyonundaki trailing stop kontrolü
                    decimal priceIncrease = ohlcData1 - entryPrice;
                    if (priceIncrease >= entryPrice * 0.007m) // %0.7 kâr
                    {
                        decimal priceDrop = priceIncrease * 0.1m; // Yükselişin %10'u kadar düşüş
                        if (ohlcData1 <= entryPrice + priceIncrease - priceDrop)
                        {
                            SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Sell, includeAfterSession: false); // Pozisyon kapat
                            isTrailingActive = false; // Trailing stop devre dışı
                        }
                    }
                }
                else if (currentState == TradeState.BuyAndCloseShort)
                {
                    // Short pozisyonundaki trailing stop kontrolü
                    decimal profit = entryPrice - ohlcData2;
                    if (profit >= entryPrice * 0.005m) // %0.5 kâr
                    {
                        decimal lossLimit = profit * 0.1m; // Kârın %10'u kadar düşüş
                        if (ohlcData2 >= entryPrice - profit + lossLimit)
                        {
                            SendMarketOrder(OrderSymbol1, OrderQuantity3, OrderSide.Buy, includeAfterSession: false); // Pozisyon kapat
                            isTrailingActive = false; // Trailing stop devre dışı
                        }
                    }
                }
            }
        }

        public override void OnOrderUpdate(IOrder order)
        {
            // Emir durumu güncellendikçe çağrılır
        }

        public override void OnStopped()
        {
            // Strateji durdurulduğunda çağrılır
        }
    }
}
Algoritmik Trading kategorisinde (14 puan) tarafından | 33 kez görüntülendi

Bu soruya cevap vermek için lütfen giriş yapınız veya kayıt olunuz.

Hoş geldiniz, Matriks Destek Platformu sizlere sorularınızın hızlıca cevaplanması için bir ortam sağlar. 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.



8,391 soru
8,345 cevap
4,713 yorum
18,037 kullanıcı