using System; using System.Collections.Generic; using System.Linq; using System.Text; using NinjaTrader.Cbi; using NinjaTrader.Data; using NinjaTrader.Indicator; using NinjaTrader.Strategy; namespace NinjaTrader.Strategy { public class SimpleMarketMetricsStrategy : Strategy { // Input parameters private int maFilterLength = 200; // EMA length for trend filtering private int profitTargetTicks = 20; // Profit target in ticks // Indicators private EMA maFilter; // EMA for trend filtering private EMA profitWaveEmaFast; // Fast EMA for profit wave private EMA profitWaveEmaMedium; // Medium EMA for profit wave private EMA profitWaveEmaSlow; // Slow EMA for profit wave protected override void OnStateChange() { if (State == State.SetDefaults) { // Strategy settings Description = "Simple Market Metrics Strategy"; Calculate = Calculate.OnBarClose; // Calculate on bar close EntriesPerDirection = 1; // Allow only one entry per direction EntryHandling = EntryHandling.AllEntries; IsExitOnSessionCloseStrategy = true; ExitOnSessionCloseSeconds = 30; IsFillLimitOnTouch = false; MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix; OrderFillResolution = OrderFillResolution.Standard; Slippage = 0; StartBehavior = StartBehavior.WaitUntilFlat; TimeInForce = TimeInForce.Gtc; TraceOrders = false; RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose; StopTargetHandling = StopTargetHandling.PerEntryExecution; BarsRequiredToTrade = 20; // Minimum bars required to trade } else if (State == State.Configure) { // Add additional data series (if needed) AddDataSeries(Data.BarsPeriodType.Minute, 1); AddDataSeries(Data.BarsPeriodType.Minute, 2); } else if (State == State.DataLoaded) { // Initialize indicators maFilter = EMA(Close, maFilterLength); // EMA for trend filtering profitWaveEmaFast = EMA(Close, 8); // Fast EMA for profit wave profitWaveEmaMedium = EMA(Close, 13); // Medium EMA for profit wave profitWaveEmaSlow = EMA(Close, 21); // Slow EMA for profit wave } } protected override void OnBarUpdate() { // Ensure enough bars are loaded if (CurrentBars[0] < maFilterLength || CurrentBars[1] < maFilterLength || CurrentBars[2] < maFilterLength) return; // Calculate trend direction bool bullishTrend = Close[0] > maFilter[0]; // Bullish if price > EMA bool bearishTrend = Close[0] < maFilter[0]; // Bearish if price < EMA // Calculate Money Flow Index (MFI) double mfi = MFI(BarsArray[0], 10); // MFI calculation // Calculate Profit Wave conditions bool profitWaveBullish = Close[0] > profitWaveEmaSlow[0]; // Bullish if price > slow EMA bool profitWaveBearish = Close[0] < profitWaveEmaSlow[0]; // Bearish if price < slow EMA // 3G (All Green) Condition: Bullish Trend, Bullish Profit Wave, and MFI > 50 if (bullishTrend && profitWaveBullish && mfi > 50) { EnterLong(); // Enter long position } // 3R (All Red) Condition: Bearish Trend, Bearish Profit Wave, and MFI < 50 else if (bearishTrend && profitWaveBearish && mfi < 50) { EnterShort(); // Enter short position } // Set profit target if (Position.MarketPosition == MarketPosition.Long) { SetProfitTarget(CalculationMode.Ticks, profitTargetTicks); // Set profit target for long } else if (Position.MarketPosition == MarketPosition.Short) { SetProfitTarget(CalculationMode.Ticks, profitTargetTicks); // Set profit target for short } } private void EnterLong() { if (Position.MarketPosition == MarketPosition.Flat) { EnterLong(DefaultQuantity, "Long Entry"); // Enter long position } } private void EnterShort() { if (Position.MarketPosition == MarketPosition.Flat) { EnterShort(DefaultQuantity, "Short Entry"); // Enter short position } } } }