#region Using declarations using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using NinjaTrader.Cbi; using NinjaTrader.Gui.NinjaScript; using NinjaTrader.NinjaScript; using NinjaTrader.NinjaScript.Strategies; #endregion namespace NinjaTrader.NinjaScript.Strategies { public class IMYM: Strategy { [NinjaScriptProperty] [Display(Name = "Hora de Entrada (HHmm)", Order = 1, GroupName = "Parametros")] public int HoraEntrada { get; set; } = 830; [NinjaScriptProperty] [Display(Name = "TPproporcionalSL", Order = 2, GroupName = "Parametros")] public double TPproporcionalSL { get; set; } = 1.0; [NinjaScriptProperty] [Display(Name = "Riesgo por Operación (USD)", Order = 3, GroupName = "Parametros")] public double Riesgo { get; set; } = 650; private const int SLticks = 50; private const int CierreDeVelas = 1; private const bool Lunes = true; private const bool Martes = false; private const bool Miercoles = true; private const bool Jueves = true; private const bool Viernes = true; private bool tradeHechoHoy = false; private int barraEntrada = -1; protected override void OnStateChange() { if (State == State.SetDefaults) { Name = "IMYM"; EntriesPerDirection = 1; EntryHandling = EntryHandling.AllEntries; IsExitOnSessionCloseStrategy = false; IncludeCommission = true; IsInstantiatedOnEachOptimizationIteration = false; } } protected override void OnBarUpdate() { if (CurrentBar < 2) return; if (Bars.IsFirstBarOfSession) { tradeHechoHoy = false; barraEntrada = -1; } if (Riesgo <= 0 || TPproporcionalSL <= 0) return; int contratos = CalcularContratosPorRiesgo(); if (contratos <= 0) return; int tpTicks = (int)Math.Round(SLticks * TPproporcionalSL, MidpointRounding.AwayFromZero); if (tpTicks <= 0) return; SetStopLoss("EntradaBuy_Hora", CalculationMode.Ticks, SLticks, false); SetProfitTarget("EntradaBuy_Hora", CalculationMode.Ticks, tpTicks); if (Position.MarketPosition != MarketPosition.Flat && barraEntrada >= 0) { if (CurrentBar - barraEntrada >= CierreDeVelas) { ExitLong("CierreVelasL", "EntradaBuy_Hora"); barraEntrada = -1; } } if (!EsDiaPermitido(Time[0].DayOfWeek)) return; int hhmm = ToTime(Time[0]) / 100; if (hhmm == HoraEntrada && !tradeHechoHoy && Position.MarketPosition == MarketPosition.Flat) { EnterLong(contratos, "EntradaBuy_Hora"); tradeHechoHoy = true; barraEntrada = CurrentBar; } } private bool EsDiaPermitido(DayOfWeek dow) { switch (dow) { case DayOfWeek.Monday: return Lunes; case DayOfWeek.Tuesday: return Martes; case DayOfWeek.Wednesday: return Miercoles; case DayOfWeek.Thursday: return Jueves; case DayOfWeek.Friday: return Viernes; default: return false; } } private int CalcularContratosPorRiesgo() { double valorTick = Instrument.MasterInstrument.PointValue * TickSize; if (valorTick <= 0) return 0; double riesgoPorContrato = SLticks * valorTick; if (riesgoPorContrato <= 0) return 0; return (int)Math.Floor(Riesgo / riesgoPorContrato); } } }