Here is the code:
region Using declarations
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using System.Xml.Serialization;
using NinjaTrader.Cbi;
using NinjaTrader.Gui;
using NinjaTrader.Gui.Chart;
using NinjaTrader.Gui.SuperDom;
using NinjaTrader.Gui.Tools;
using NinjaTrader.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
namespace NinjaTrader.NinjaScript.Strategies
{
public class Pruem2Optimized : Strategy
{
private RSI rsi;
[Range(5, 50), NinjaScriptProperty]
[Display(Name = "RSI Period", Description = "Period for RSI indicator", Order = 1, GroupName = "Parameters")]
public int RsiPeriod { get; set; }
[Range(70, 90), NinjaScriptProperty]
[Display(Name = "RSI Overbought Level", Description = "Overbought level for RSI", Order = 2, GroupName = "Parameters")]
public double RsiOverbought { get; set; }
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
// Impostazioni generali della strategia
Description = @"Strategia Pruem2 ottimizzata con Take Profit, Stop Loss e RSI";
Name = "Pruem2Optimized";
Calculate = Calculate.OnBarClose;
EntriesPerDirection = 1;
EntryHandling = EntryHandling.UniqueEntries;
IsExitOnSessionCloseStrategy = true;
ExitOnSessionCloseSeconds = 30;
IsFillLimitOnTouch = false;
MaximumBarsLookBack = MaximumBarsLookBack.TwoHundredFiftySix;
OrderFillResolution = OrderFillResolution.Standard;
Slippage = 0;
StartBehavior = StartBehavior.WaitUntilFlat;
TimeInForce = TimeInForce.Day;
TraceOrders = false;
RealtimeErrorHandling = RealtimeErrorHandling.StopCancelClose;
StopTargetHandling = StopTargetHandling.PerEntryExecution;
BarsRequiredToTrade = 30;
IsInstantiatedOnEachOptimizationIteration = true;
// Parametri personalizzabili
RsiPeriod = 14;
RsiOverbought = 80;
// Regolazione Take Profit e Stop Loss per un miglior rapporto rischio/rendimento
SetProfitTarget(CalculationMode.Ticks, 20); // 20 ticks = 5 punti
SetStopLoss(CalculationMode.Ticks, 15); // 15 ticks = 3.75 punti
}
else if (State == State.Configure)
{
// Eventuali configurazioni aggiuntive
}
else if (State == State.DataLoaded)
{
// Inizializza l'indicatore RSI
rsi = RSI(RsiPeriod, 1);
}
}
protected override void OnBarUpdate()
{
// Assicurati che ci siano abbastanza barre per eseguire il controllo
if (CurrentBar < BarsRequiredToTrade)
return;
// Controlla se le ultime 4 barre sono verdi
if (Close[0] > Open[0] && Close[1] > Open[1] && Close[2] > Open[2] && Close[3] > Open[3])
{
// Controlla se il ROC è maggiore o uguale a 0.04
if (ROC(28)[0] >= 0.04)
{
// Controlla se il prezzo di chiusura è inferiore alla banda superiore del Donchian Channel
if (Close[0] < DonchianChannel(20).Upper[0])
{
// Controlla se l'RSI è in zona di ipercomprato
if (rsi[0] >= RsiOverbought)
{
// Esegui un ordine short
EnterShort();
}
}
}
}
}
protected override void OnExecutionUpdate(Execution execution, string executionId, double price, int quantity,
MarketPosition marketPosition, string orderId, DateTime time)
{
// Implementazione di un trailing stop
if (Position.MarketPosition == MarketPosition.Short)
{
// Sposta lo Stop Loss al prezzo di entrata dopo un profitto di 10 ticks
if (Position.GetUnrealizedProfitLoss(PerformanceUnit. Currency, Close[0]) >= 10 * TickSize)
{
// Aggiorna lo Stop Loss al prezzo di entrata
SetStopLoss(CalculationMode.Price, Position.AveragePrice);
}
}
}
}
}

Comment