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 mostlu_x100lu : MatriksAlgo
{
[SymbolParameter("XU030")]
public string Symbol1;
[SymbolParameter("XU100")]
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(2)]
public int MostPeriod1;
[Parameter(2)]
public decimal MostPercentage1;
[Parameter(MovMethod.ZL)]
public MovMethod MostMovMethod1;
[Parameter(3)]
public int WilliamsrPeriod1;
[Parameter(3)]
public int WilliamsrPeriod2;
[Parameter(2)]
public int MostPeriod2;
[Parameter(2)]
public decimal MostPercentage2;
[Parameter(MovMethod.ZL)]
public MovMethod MostMovMethod2;
[Parameter(13)]
public int RsiPeriod2;
[Parameter(1)]
public decimal OrderQuantity1;
[Parameter(1)]
public decimal OrderQuantity2;
private RSI rsi;
private MOST most;
private WILLIAMSR willamsr;
private WILLIAMSR willamsr2;
private MOST most2;
private RSI rsi2;
// Trailing Stop Variables
private decimal trailingStopLevelBuy;
private decimal trailingStopLevelSell;
private bool isTrailingStopActiveBuy = false;
private bool isTrailingStopActiveSell = false;
public override void OnInit()
{
AddSymbol(OrderSymbol1, SymbolPeriod1);
rsi = RSIIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, RsiPeriod1);
most = MOSTIndicator(Symbol1, SymbolPeriod1, OHLCType.Close, MostPeriod1, MostPercentage1, MostMovMethod1);
willamsr = WILLIAMSRIndicator(Symbol1, SymbolPeriod1, WilliamsrPeriod1);
willamsr2 = WILLIAMSRIndicator(Symbol2, SymbolPeriod1, WilliamsrPeriod2);
most2 = MOSTIndicator(Symbol2, SymbolPeriod1, OHLCType.Close, MostPeriod2, MostPercentage2, MostMovMethod2);
rsi2 = RSIIndicator(Symbol2, SymbolPeriod1, OHLCType.Close, RsiPeriod2);
SendOrderSequential(true, orderSide);
WorkWithPermanentSignal(true);
}
public override void OnDataUpdate(BarDataEventArgs barData)
{
var barData1 = GetBarData(Symbol1, SymbolPeriod1);
var ohlcData1 = GetSelectedValueFromBarData(barData1, OHLCType.Close);
var barData2 = GetBarData(Symbol2, SymbolPeriod1);
var ohlcData2 = GetSelectedValueFromBarData(barData2, OHLCType.Close);
// Buy Signal Logic
if (rsi.Value[0][rsi.CurrentIndex] > 50m && most.Value[0][most.CurrentIndex] < ohlcData1
&& willamsr.Value[0][willamsr.CurrentIndex] > -30m && rsi2.Value[0][rsi2.CurrentIndex] > 50m
&& most2.Value[0][most2.CurrentIndex] < ohlcData2 && willamsr2.Value[0][willamsr2.CurrentIndex] > -30m)
{
SendMarketOrder(OrderSymbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession: false);
trailingStopLevelBuy = ohlcData1 * 1.005m; // Start trailing stop at 0.5% above entry
isTrailingStopActiveBuy = true;
}
// Short Sell Signal Logic
if (rsi.Value[0][rsi.CurrentIndex] < 50m && most.Value[0][most.CurrentIndex] > ohlcData2
&& willamsr.Value[0][willamsr.CurrentIndex] < -60m && rsi2.Value[0][rsi2.CurrentIndex] < 50m
&& willamsr2.Value[0][willamsr2.CurrentIndex] < -60m && most2.Value[0][most2.CurrentIndex] > ohlcData2)
{
SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Sell, includeAfterSession: false);
trailingStopLevelSell = ohlcData2 * 0.995m; // Start trailing stop at 0.5% below entry
isTrailingStopActiveSell = true;
}
// Trailing Stop for Buy Position
if (isTrailingStopActiveBuy && ohlcData1 >= trailingStopLevelBuy)
{
trailingStopLevelBuy = Math.Max(trailingStopLevelBuy, ohlcData1 * 0.93m); // Adjust trailing stop to 7% below peak
}
if (isTrailingStopActiveBuy && ohlcData1 <= trailingStopLevelBuy)
{
SendMarketOrder(OrderSymbol1, OrderQuantity1, OrderSide.Sell, includeAfterSession: false);
isTrailingStopActiveBuy = false;
}
// Trailing Stop for Short Sell Position
if (isTrailingStopActiveSell && ohlcData2 <= trailingStopLevelSell)
{
trailingStopLevelSell = Math.Min(trailingStopLevelSell, ohlcData2 * 1.07m); // Adjust trailing stop to 7% above peak
}
if (isTrailingStopActiveSell && ohlcData2 >= trailingStopLevelSell)
{
SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Buy, includeAfterSession: false);
isTrailingStopActiveSell = false;
}
// Re-enter After Stop Trigger for Buy
if (!isTrailingStopActiveBuy && ohlcData1 <= trailingStopLevelBuy * 0.996m
&& rsi.Value[0][rsi.CurrentIndex] > 50m && most.Value[0][most.CurrentIndex] < ohlcData1
&& willamsr.Value[0][willamsr.CurrentIndex] > -30m)
{
SendMarketOrder(OrderSymbol1, OrderQuantity1, OrderSide.Buy, includeAfterSession: false);
trailingStopLevelBuy = ohlcData1 * 1.005m; // Restart trailing stop
isTrailingStopActiveBuy = true;
}
// Re-enter After Stop Trigger for Short Sell
if (!isTrailingStopActiveSell && ohlcData2 >= trailingStopLevelSell * 1.004m
&& rsi.Value[0][rsi.CurrentIndex] < 50m && most.Value[0][most.CurrentIndex] > ohlcData2
&& willamsr.Value[0][willamsr.CurrentIndex] < -60m)
{
SendMarketOrder(OrderSymbol1, OrderQuantity2, OrderSide.Sell, includeAfterSession: false);
trailingStopLevelSell = ohlcData2 * 0.995m; // Restart trailing stop
isTrailingStopActiveSell = true;
}
}
public override void OnOrderUpdate(IOrder order)
{
// Handle order updates
}
public override void OnStopped()
{
// Cleanup logic
}
}
}