GitHub で見る
前のローソク足ブレイクアウト戦略
前のローソク足ブレイクアウト戦略は、ユーザー定義のタイムフレーム(デフォルト:4 時間)から最近閉じたローソク足の高値と安値を監視します。ライブのローソク足が設定可能なインデントによってこれらの参照レベルを超えると、戦略はブレイクアウトトレードを開きます。オプションの移動平均トレンドフィルターがトレードを主流の方向に合わせて維持し、レイヤー化されたエグジットロジック(固定ストップロス、テイクプロフィット、pip ベースのトレーリングストップ)がエントリー後のリスクを管理します。
主な特徴
- 高いタイムフレームのローソク足をブレイクアウトアンカーとして使用します。すべてのシグナルは最後に完成した参照ローソク足の高値または安値から生成されます。
- 4 つの移動平均タイプ(SMA、EMA、Smoothed、WMA)をサポートし、高速線と低速線の独立したシフトを持ちます。両方の期間が非ゼロの場合、フィルターはロング/ショートトレードを受け入れる前に高速 MA が低速 MA より上/下になることを要求します。
- セキュリティの設定を使用して pip ベースの距離(インデント、ストップロス、テイクプロフィット、トレーリングストップとステップ)を価格単位に変換します。3 または 5 小数点のインストゥルメントの場合、1 pip は 10 価格ステップに等しく、元の MQL ロジックを反映します。
- 固定ボリュームまたはストップロス距離に対するアカウント資産のパーセンテージをリスクとして計算することでポジションサイジングが可能です。
- 方向ごとの最大エントリー数を制限し、浮動利益が指定された現金額に達したときにすべてのオープンポジションをオプションで閉じます。
- トレーリングストップロジックは MQL5 EA をエミュレートします:価格がトレーリングオフセットプラスステップを超えて進むと、ストップレベルは離散ステップで前進します。
パラメーター
| 名前 |
説明 |
CandleType |
前のローソク足参照を構築するために使用するタイムフレーム(デフォルト:4 時間)。 |
IndentPips |
エントリーをトリガーする前に高値の上または安値の下に追加する pip 距離。 |
FastPeriod / SlowPeriod |
移動平均の長さ。トレンドフィルターを無効にするにはいずれかを 0 に設定。 |
FastShift / SlowShift |
比較前に各移動平均に適用される水平シフト(バー単位)。 |
MaType |
移動平均の計算メソッド(Simple、Exponential、Smoothed、Weighted)。 |
StopLossPips |
初期保護ストップの pip 距離。無効にするには 0 に設定。 |
TakeProfitPips |
テイクプロフィット注文の pip 距離。無効にするには 0 に設定。 |
TrailingStopPips |
トレーリングストップ距離。TrailingStepPips > 0 が必要。 |
TrailingStepPips |
トレーリングストップが更新される前に必要な最小 pip 改善。 |
OrderVolume |
固定取引ボリューム。ポジションをリスク率でサイジングするには 0 のままにする。 |
RiskPercent |
OrderVolume が 0 のとき 1 トレードあたりにリスクにさらすポートフォリオ資産のパーセンテージ。ゼロ以外のストップロスが必要。 |
MaxPositions |
方向ごとに許可されるエントリーの最大数。 |
ProfitClose |
浮動利益がこの値(基本通貨)に達したときにすべてのオープンポジションを閉じる。 |
取引ロジック
CandleType の最近完成したローソク足を追跡し、その高値/安値を保存する。
- 現在のローソク足の各更新時:
- 有効な場合は移動平均フィルターを適用する。MA の履歴が十分でない場合、戦略は待機する。
- ブレイクアウトレベルを計算する:前の高値 + インデントと前の安値 − インデント。
- 現在のローソク足の高値が上位レベルをクロスするとき、ロングポジションを開く(フィルター、最大ポジション数、1 ローソク足あたりのエントリーロックアウトに従う)。
- 現在のローソク足の安値が下位レベルをクロスするとき、同じチェックを使用してショートポジションを開く。
- エントリー後、戦略はストップロスとテイクプロフィットレベル(設定されている場合)を添付し、メモリに保持する。価格がいずれかの境界に触れると、ポジションは成行注文で閉じられる。
- トレーリングストップの起動は MQL EA を反映する:価格はストップを移動する前にトレーリングオフセットプラストレーリングステップを超えなければならない。後続の更新には別の完全な
TrailingStepPips 改善が必要。
- 浮動利益は平均エントリー価格から各ティックで再計算される。
ProfitClose に達すると、すべてのオープンエクスポージャーが即座に清算される。
- リスクベースのサイジングでは、戦略はピップストップ距離をインストゥルメントの
PriceStep と StepPrice を使用して通貨に変換する。結果のボリュームはスケーリングのために MaxPositions を尊重する。
注意事項
- トレーリングを無効にするには
TrailingStopPips を 0 に設定する。トレーリングを有効にする場合は、TrailingStepPips も正にしてください;そうしないとトレーリング更新は発生しません。
- 戦略は同じ参照バーでの複数エントリーを避けるためにローソク足ごとのエントリータイムスタンプを保存し、元の EA の動作に対応しています。
PriceStep/StepPrice メタデータのないインストゥルメントの場合、リスクベースのサイジングは計算できず、OrderVolume が指定されない限りトレードはスキップされます。
- コード内のすべてのコメントはプロジェクトガイドラインに合わせて英語で書かれています。
ファイル
CS/PreviousCandleBreakdownStrategy.cs – 戦略の C# 実装。
この戦略に対する Python 翻訳はリクエストにより提供されていません。
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>
/// Previous candle breakdown strategy (simplified).
/// Enters when price breaks above/below the previous candle's high/low.
/// </summary>
public class PreviousCandleBreakdownStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public PreviousCandleBreakdownStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
decimal prevHigh = 0, prevLow = 0;
bool hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind((ICandleMessage candle) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevHigh = candle.HighPrice;
prevLow = candle.LowPrice;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevHigh = candle.HighPrice;
prevLow = candle.LowPrice;
return;
}
// Breakout above previous high
if (candle.ClosePrice > prevHigh && Position <= 0)
{
BuyMarket();
}
// Breakdown below previous low
else if (candle.ClosePrice < prevLow && Position >= 0)
{
SellMarket();
}
prevHigh = candle.HighPrice;
prevLow = candle.LowPrice;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
}
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.Strategies import Strategy
class previous_candle_breakdown_strategy(Strategy):
def __init__(self):
super(previous_candle_breakdown_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
def OnReseted(self):
super(previous_candle_breakdown_strategy, self).OnReseted()
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(previous_candle_breakdown_strategy, self).OnStarted2(time)
self._prev_high = 0.0
self._prev_low = 0.0
self._has_prev = False
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
def _on_process(self, candle):
if candle.State != CandleStates.Finished:
return
h = float(candle.HighPrice)
l = float(candle.LowPrice)
c = float(candle.ClosePrice)
if not self._has_prev:
self._prev_high = h
self._prev_low = l
self._has_prev = True
return
if c > self._prev_high and self.Position <= 0:
self.BuyMarket()
elif c < self._prev_low and self.Position >= 0:
self.SellMarket()
self._prev_high = h
self._prev_low = l
def CreateClone(self):
return previous_candle_breakdown_strategy()