El Harami Bajista es la versión inversa del alcista y aparece después de un movimiento al alza.
Una vela pequeña se forma completamente dentro de la barra alcista anterior, sugiriendo que el impulso ascendente está perdiendo fuerza.
Las pruebas indican un rendimiento anual promedio de aproximadamente 43%. Funciona mejor en el mercado de acciones.
La estrategia vende en corto cuando esa vela interior cierra, apostando por una reversión a medida que los compradores pierden convicción.
Un stop porcentual por encima del máximo del patrón limita el riesgo y la operación sale si el precio rompe a nuevos máximos.
Detalles
Criterios de entrada: coincidencia de patrón
Largo/Corto: Ambos
Criterios de salida: stop-loss o señal opuesta
Stops: Sí, basados en porcentaje
Valores predeterminados:
CandleType = 15 minute
StopLossPercent = 2
La estrategia solo vende. El stop se coloca StopLossPercent por encima del máximo más alto del patrón y la posición se cierra cuando una vela cierra por encima.
Filtros:
Categoría: Patrón
Dirección: Ambos
Indicadores: Candlestick
Stops: Sí
Complejidad: Intermedio
Marco temporal: Intradía
Estacionalidad: No
Redes neuronales: No
Divergencia: No
Nivel de riesgo: Medio
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>
/// Bearish Harami strategy.
/// While flat it sells after a bullish candle followed by a candle whose smaller body lies within the first candle's range.
/// The stop lies StopLossPercent above the pattern's highest high, and a close beyond it closes the position.
/// </summary>
public class HaramiBearishStrategy : Strategy
{
private readonly StrategyParam<decimal> _stopLossPercent;
private readonly StrategyParam<DataType> _candleType;
private readonly List<ICandleMessage> _candles = [];
private decimal _stopPrice;
/// <summary>
/// Distance of the stop beyond the pattern, in percent.
/// </summary>
public decimal StopLossPercent
{
get => _stopLossPercent.Value;
set => _stopLossPercent.Value = value;
}
/// <summary>
/// Candle type.
/// </summary>
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
/// <summary>
/// Constructor.
/// </summary>
public HaramiBearishStrategy()
{
_stopLossPercent = Param(nameof(StopLossPercent), 2m)
.SetNotNegative()
.SetDisplay("Stop Loss %", "Distance of the stop beyond the pattern, in percent", "Risk");
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).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();
_candles.Clear();
_stopPrice = default;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_candles.Clear();
_stopPrice = default;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle)
{
if (candle.State != CandleStates.Finished)
return;
_candles.Add(candle);
if (_candles.Count > 2)
_candles.RemoveAt(0);
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (Position < 0)
{
if (candle.ClosePrice >= _stopPrice)
BuyMarket(-Position);
return;
}
if (Position != 0 || _candles.Count < 2)
return;
var c0 = _candles[0];
var c1 = _candles[1];
if (!(c0.ClosePrice > c0.OpenPrice && Math.Abs(c1.ClosePrice - c1.OpenPrice) < c0.ClosePrice - c0.OpenPrice && Math.Min(c1.OpenPrice, c1.ClosePrice) >= c0.LowPrice && Math.Max(c1.OpenPrice, c1.ClosePrice) <= c0.HighPrice))
return;
SellMarket(Volume);
_stopPrice = Math.Max(c0.HighPrice, c1.HighPrice) * (1 + StopLossPercent / 100m);
}
}
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, Decimal
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Strategies import Strategy
class harami_bearish_strategy(Strategy):
"""
Bearish Harami strategy.
While flat it sells after a bullish candle followed by a candle whose smaller body lies within the first candle's range.
The stop lies StopLossPercent above the pattern's highest high, and a close beyond it closes the position.
"""
def __init__(self):
super(harami_bearish_strategy, self).__init__()
self._stop_loss_percent = self.Param("StopLossPercent", 2.0).SetNotNegative().SetDisplay("Stop Loss %", "Distance of the stop beyond the pattern, in percent", "Risk")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(15))).SetDisplay("Candle Type", "Type of candles to use", "General")
self._candles = []
self._stop_price = Decimal(0)
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(harami_bearish_strategy, self).OnReseted()
self._candles = []
self._stop_price = Decimal(0)
def OnStarted2(self, time):
super(harami_bearish_strategy, self).OnStarted2(time)
self._candles = []
self._stop_price = Decimal(0)
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(self._process_candle).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def _process_candle(self, candle):
if candle.State != CandleStates.Finished:
return
self._candles.append(candle)
if len(self._candles) > 2:
self._candles.pop(0)
if not self.IsFormedAndOnlineAndAllowTrading():
return
if self.Position < 0:
if candle.ClosePrice >= self._stop_price:
self.BuyMarket(-self.Position)
return
if self.Position != 0 or len(self._candles) < 2:
return
c0, c1 = self._candles
if not (c0.ClosePrice > c0.OpenPrice and Math.Abs(c1.ClosePrice - c1.OpenPrice) < c0.ClosePrice - c0.OpenPrice and Math.Min(c1.OpenPrice, c1.ClosePrice) >= c0.LowPrice and Math.Max(c1.OpenPrice, c1.ClosePrice) <= c0.HighPrice):
return
self.SellMarket(self.Volume)
self._stop_price = max(c0.HighPrice, c1.HighPrice) * (Decimal(1) + Decimal(self._stop_loss_percent.Value) / Decimal(100))
def CreateClone(self):
return harami_bearish_strategy()