Rompimento da Nuvem Ichimoku Somente Comprado
A estratégia abre posições compradas quando o preço rompe acima da nuvem Ichimoku e encerra quando o preço cai abaixo dela. Apenas operações de compra são realizadas.
Detalhes
- Critérios de entrada:
- Comprado:
Closecruza acima demax(SenkouA, SenkouB)
- Comprado:
- Comprado/Vendido: Somente comprado
- Critérios de saída:
Closecruza abaixo demin(SenkouA, SenkouB)
- Stops: Nenhum
- Valores padrão:
TenkanPeriod= 9KijunPeriod= 26SenkouSpanBPeriod= 52CandleType= TimeSpan.FromMinutes(1).TimeFrame()
- Filtros:
- Categoria: Seguidor de tendência
- Direção: Somente comprado
- Indicadores: Ichimoku
- Stops: Não
- Complexidade: Básico
- Período: Curto prazo
- Sazonalidade: Não
- Redes neurais: Não
- Divergência: Não
- Nível de risco: Médio
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Ichimoku cloud breakout (long only) strategy.
/// A long opens when the close crosses above the top of the Ichimoku cloud, max(SenkouA, SenkouB), and closes when the close crosses
/// below the bottom of the cloud, min(SenkouA, SenkouB). There are no stops.
/// </summary>
public class IchimokuCloudBreakoutOnlyLongStrategy : Strategy
{
private readonly StrategyParam<int> _tenkanPeriod;
private readonly StrategyParam<int> _kijunPeriod;
private readonly StrategyParam<int> _senkouSpanBPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal? _prevClose;
private decimal? _prevTop;
private decimal? _prevBottom;
/// <summary>
/// Tenkan-sen period.
/// </summary>
public int TenkanPeriod
{
get => _tenkanPeriod.Value;
set => _tenkanPeriod.Value = value;
}
/// <summary>
/// Kijun-sen period.
/// </summary>
public int KijunPeriod
{
get => _kijunPeriod.Value;
set => _kijunPeriod.Value = value;
}
/// <summary>
/// Senkou Span B period.
/// </summary>
public int SenkouSpanBPeriod
{
get => _senkouSpanBPeriod.Value;
set => _senkouSpanBPeriod.Value = value;
}
/// <summary>
/// Candle type.
/// </summary>
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
/// <summary>
/// Constructor.
/// </summary>
public IchimokuCloudBreakoutOnlyLongStrategy()
{
_tenkanPeriod = Param(nameof(TenkanPeriod), 9)
.SetGreaterThanZero()
.SetDisplay("Tenkan Period", "Tenkan-sen period", "Ichimoku");
_kijunPeriod = Param(nameof(KijunPeriod), 26)
.SetGreaterThanZero()
.SetDisplay("Kijun Period", "Kijun-sen period", "Ichimoku");
_senkouSpanBPeriod = Param(nameof(SenkouSpanBPeriod), 52)
.SetGreaterThanZero()
.SetDisplay("Senkou Span B Period", "Senkou Span B period", "Ichimoku");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(1).TimeFrame())
.SetDisplay("Candle Type", "Type of candles to use", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
ResetState();
}
private void ResetState()
{
_prevClose = null;
_prevTop = null;
_prevBottom = null;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
ResetState();
var ichimoku = new Ichimoku
{
Tenkan = { Length = TenkanPeriod },
Kijun = { Length = KijunPeriod },
SenkouB = { Length = SenkouSpanBPeriod },
};
var subscription = SubscribeCandles(CandleType);
subscription
.BindEx(ichimoku, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, ichimoku);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, IIndicatorValue ichimokuValue)
{
if (candle.State != CandleStates.Finished)
return;
if (!ichimokuValue.IsFormed || ichimokuValue is not IchimokuValue { SenkouA: decimal senkouA, SenkouB: decimal senkouB })
return;
var close = candle.ClosePrice;
var top = Math.Max(senkouA, senkouB);
var bottom = Math.Min(senkouA, senkouB);
var prevClose = _prevClose;
var prevTop = _prevTop;
var prevBottom = _prevBottom;
_prevClose = close;
_prevTop = top;
_prevBottom = bottom;
if (prevClose is not decimal pc || prevTop is not decimal pt || prevBottom is not decimal pb)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (Position <= 0 && pc <= pt && close > top)
BuyMarket(Volume + Math.Abs(Position));
else if (Position > 0 && pc >= pb && close < bottom)
SellMarket(Position);
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import Ichimoku
from StockSharp.Algo.Strategies import Strategy
class ichimoku_cloud_breakout_only_long_strategy(Strategy):
"""
Ichimoku cloud breakout (long only) strategy.
A long opens when the close crosses above the top of the Ichimoku cloud, max(SenkouA, SenkouB), and closes when the close crosses
below the bottom of the cloud, min(SenkouA, SenkouB). There are no stops.
"""
def __init__(self):
super(ichimoku_cloud_breakout_only_long_strategy, self).__init__()
self._tenkan_period = self.Param("TenkanPeriod", 9).SetGreaterThanZero().SetDisplay("Tenkan Period", "Tenkan-sen period", "Ichimoku")
self._kijun_period = self.Param("KijunPeriod", 26).SetGreaterThanZero().SetDisplay("Kijun Period", "Kijun-sen period", "Ichimoku")
self._senkou_span_b_period = self.Param("SenkouSpanBPeriod", 52).SetGreaterThanZero().SetDisplay("Senkou Span B Period", "Senkou Span B period", "Ichimoku")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(1))).SetDisplay("Candle Type", "Type of candles to use", "General")
self._reset_state()
@property
def candle_type(self):
return self._candle_type.Value
def _reset_state(self):
self._prev_close = None
self._prev_top = None
self._prev_bottom = None
def OnReseted(self):
super(ichimoku_cloud_breakout_only_long_strategy, self).OnReseted()
self._reset_state()
def OnStarted2(self, time):
super(ichimoku_cloud_breakout_only_long_strategy, self).OnStarted2(time)
self._reset_state()
ichimoku = Ichimoku()
ichimoku.Tenkan.Length = self._tenkan_period.Value
ichimoku.Kijun.Length = self._kijun_period.Value
ichimoku.SenkouB.Length = self._senkou_span_b_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.BindEx(ichimoku, self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ichimoku)
self.DrawOwnTrades(area)
def _process_candle(self, candle, ichimoku_value):
if candle.State != CandleStates.Finished:
return
if not ichimoku_value.IsFormed or ichimoku_value.SenkouA is None or ichimoku_value.SenkouB is None:
return
close = candle.ClosePrice
senkou_a = ichimoku_value.SenkouA
senkou_b = ichimoku_value.SenkouB
top = max(senkou_a, senkou_b)
bottom = min(senkou_a, senkou_b)
prev_close = self._prev_close
prev_top = self._prev_top
prev_bottom = self._prev_bottom
self._prev_close = close
self._prev_top = top
self._prev_bottom = bottom
if prev_close is None or prev_top is None or prev_bottom is None:
return
if not self.IsFormedAndOnlineAndAllowTrading():
return
if self.Position <= 0 and prev_close <= prev_top and close > top:
self.BuyMarket(self.Volume + abs(self.Position))
elif self.Position > 0 and prev_close >= prev_bottom and close < bottom:
self.SellMarket(self.Position)
def CreateClone(self):
return ichimoku_cloud_breakout_only_long_strategy()