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
}
}
}