Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)
Não estou conseguindo fazer o aumento de posição quando a condição é satisfeita.
EntriesPerDirection = 3; EntryHandling = EntryHandling.AllEntries;
if ( // ShortCondition ((Close[1] > Bollinger1.Upper[1]) && (Close[0] < Bollinger1.Upper[0]))) { EnterShort(Convert.ToInt32(DefaultQuantity), @"Short"); }
Vou postar o script completo:
public class BateForaVer1 : Strategy { private Bollinger Bollinger1; double LongTakeProfit; double ShortTakeProfit; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Enter the description for your new custom Strategy here."; Name = "BateForaVer1"; Calculate = Calculate.OnPriceChange; EntriesPerDirection = 3; 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; // Disable this property for performance gains in Strategy Analyzer optimizations // See the Help Guide for additional information IsInstantiatedOnEachOptimizationIteration = true; int BollingerLenght = 20; } else if (State == State.Configure) { } else if (State == State.DataLoaded) { Bollinger1 = Bollinger(Close, 2, Convert.ToInt32(BollingerLenght)); Bollinger1.Plots[0].Brush = Brushes.IndianRed; Bollinger1.Plots[1].Brush = Brushes.Goldenrod; Bollinger1.Plots[2].Brush = Brushes.AliceBlue; AddChartIndicator(Bollinger1); } } protected override void OnBarUpdate() { if (BarsInProgress != 0) return; if (CurrentBars[0] < 1) return; // Set 1 if ( // ShortCondition ((Close[1] > Bollinger1.Upper[1]) && (Close[0] < Bollinger1.Upper[0]))) { EnterShort(Convert.ToInt32(DefaultQuantity), @"Short"); } SetProfitTarget(@"Short",CalculationMode.Price, Bollinger1.Middle[0]); SetProfitTarget(@"Long",CalculationMode.Price, Bollinger1.Middle[0]); if (Position.MarketPosition == MarketPosition.Short) ; { if (Close[0] <= ShortTakeProfit) ; { ExitShort(@"Short"); } } // Set 2 if ( // LongCondition ((Close[1] < Bollinger1.Lower[1]) && (Close[0] > Bollinger1.Lower[0]))) { EnterLong(Convert.ToInt32(DefaultQuantity), @"Long"); } if (Position.MarketPosition == MarketPosition.Long) ; { if (Close[0] >=LongTakeProfit) { ExitLong(@"Long"); } } } }
Acabei descobrindo o problema, na vdd o script está correto, o problema é que na hora de inserir a estratégia no gráfico eu não percebi que estava configurado para atualizar a cada mudança de preço.
Sendo que no caso da minha estratégia de estudo era para atualizar somente no fechamento da barra.
Basicamente foi só alterar as entradas abaixo e configurar para executar no fechamento da barra.
// Example #1 // Irá permitir o aumento de posição até a quantidade definida. protected override void Initialize() { EntriesPerDirection = 5; //Quantidade de aumento permitido EntryHandling = EntryHandling.AllEntries; //irá permitir o aumento cada vez que a condição ocorrer até 5 entradas. } protected override void OnBarUpdate() { //Condição para aumento de posição if (CrossAbove(SMA(10), SMA(20), 1) EnterLong("SMA Cross Entry"); }
Fonte: NinjaTrader Version 7