A estratégia de ruptura do Plano X replica o MetaTrader consultor especialista "plano x" de Peter Ingram. Ele se concentra na sessão de Londres no final da manhã e espera que o preço se afaste de uma vela de referência antes de entrar. Apenas uma posição líquida pode ser aberta por vez, e o risco é controlado por meio de stops baseados em pip que acompanham a negociação à medida que ela se move a favor.
Lógica de negociação
Âncora da sessão
A estratégia observa velas de 15 minutos.
Na hora de início da sessão configurada (padrão 11h00), registra o fechamento daquela vela. Este fechamento atua como preço âncora para o resto da sessão.
A negociação só é considerada após o fechamento de pelo menos uma vela adicional e antes do horário de término da sessão (padrão 15:00).
Condições de entrada
Longo: Quando a última vela concluída fecha mais de LongTargetPips (padrão 25 pips) acima do fechamento da âncora e nenhuma posição está aberta.
Short: Quando a última vela concluída fecha mais de ShortTargetPips (padrão 20 pips) abaixo do fechamento da âncora e nenhuma posição está aberta.
Todas as comparações são feitas em unidades pip derivadas do tamanho do tick do instrumento.
Gerenciamento de posição
Um stop-loss inicial fixo igual a InitialStopPips (padrão 25 pips) é definido em relação ao preço de entrada.
O stop se converte em um trailing stop quando a negociação ganha pelo menos TrailTriggerPips (padrão 10 pips).
Cada vez que o preço avança mais TrailTriggerPips, o stop é movido TrailStepPips (padrão 5 pips) mais na direção lucrativa.
Se o preço atingir o stop, a posição será fechada no mercado.
Volume
Os pedidos usam o parâmetro TradeVolume (padrão 0,1 lote). Ajuste para corresponder ao tamanho do contrato de segurança.
Parâmetros
Nome
Descrição
Padrão
TradeVolume
Volume de ordens de mercado utilizado para entradas e saídas.
0,1
LongTargetPips
Distância de fuga acima da âncora necessária para entradas longas.
25
ShortTargetPips
Distância de fuga abaixo da âncora necessária para entradas curtas.
20
InitialStopPips
Distância do preço de entrada ao stop loss de proteção.
25
TrailTriggerPips
Lucro em pips necessário antes que o trailing stop seja ativado ou avance.
10
TrailStepPips
Incremento de pip aplicado ao trailing stop cada vez que ele se move.
5
SessionStartHour
Hora decimal que indica quando a vela âncora começa (por exemplo, 11.0, 11.5).
11,0
SessionEndHour
Hora decimal após a qual nenhuma nova entrada é feita. Deve ser posterior a SessionStartHour.
15,0
CandleType
Série de velas usadas para avaliações. O padrão é velas de 15 minutos.
15 minutos
Notas
O tamanho do pip se adapta automaticamente com base no PriceStep do instrumento e na precisão decimal (3 ou 5 decimais recebem um multiplicador de 10x).
A estratégia espera um mercado intradiário contínuo; em instrumentos com gaps diários, o comportamento de reancoragem ocorre a cada dia de negociação.
Como as estratégias StockSharp usam posições líquidas, a conversão assume apenas uma direção aberta por vez. Isto reflete o comportamento padrão do especialista original quando nenhuma cobertura está ativa.
Arquivos
CS/PlanXBreakoutStrategy.cs – implementação em C# da lógica de breakout do Plano X para StockSharp.
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Plan X Breakout strategy using highest high / lowest low channel breakout.
/// Buy when price breaks above the highest high of the lookback period.
/// Sell when price breaks below the lowest low of the lookback period.
/// </summary>
public class PlanXBreakoutStrategy : Strategy
{
private readonly StrategyParam<int> _lookback;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevHigh;
private decimal _prevLow;
private bool _hasPrev;
public int Lookback { get => _lookback.Value; set => _lookback.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public PlanXBreakoutStrategy()
{
_lookback = Param(nameof(Lookback), 20)
.SetDisplay("Lookback", "Channel lookback period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevHigh = 0m;
_prevLow = 0m;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var highestHigh = new Highest { Length = Lookback };
var lowestLow = new Lowest { Length = Lookback };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(highestHigh, lowestLow, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal highest, decimal lowest)
{
if (candle.State != CandleStates.Finished)
return;
if (!_hasPrev)
{
_prevHigh = highest;
_prevLow = lowest;
_hasPrev = true;
return;
}
// Breakout above previous highest high
if (Position <= 0 && candle.ClosePrice > _prevHigh)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Breakout below previous lowest low
else if (Position >= 0 && candle.ClosePrice < _prevLow)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevHigh = highest;
_prevLow = lowest;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class plan_x_breakout_strategy(Strategy):
"""Plan X Breakout strategy using highest high / lowest low channel breakout.
Buy when price breaks above the highest high of the lookback period.
Sell when price breaks below the lowest low of the lookback period."""
def __init__(self):
super(plan_x_breakout_strategy, self).__init__()
self._lookback = self.Param("Lookback", 20) \
.SetDisplay("Lookback", "Channel lookback period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def Lookback(self):
return self._lookback.Value
def OnReseted(self):
super(plan_x_breakout_strategy, self).OnReseted()
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(plan_x_breakout_strategy, self).OnStarted2(time)
self._has_prev = False
highest = Highest()
highest.Length = self.Lookback
lowest = Lowest()
lowest.Length = self.Lookback
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(highest, lowest, self._process_candle).Start()
def _process_candle(self, candle, highest, lowest):
if candle.State != CandleStates.Finished:
return
high_val = float(highest)
low_val = float(lowest)
close = float(candle.ClosePrice)
if not self._has_prev:
self._prev_high = high_val
self._prev_low = low_val
self._has_prev = True
return
# Breakout above previous highest high
if self.Position <= 0 and close > self._prev_high:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Breakout below previous lowest low
elif self.Position >= 0 and close < self._prev_low:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_high = high_val
self._prev_low = low_val
def CreateClone(self):
return plan_x_breakout_strategy()