GitHub で見る
BrainTrend2 V2 Duplex 戦略
概要
BrainTrend2 V2 Duplex 戦略は、MetaTrader 5 オリジナルエキスパート Exp_BrainTrend2_V2_Duplex の StockSharp への高レベルポートです。BrainTrend2 V2 インジケーターの 2 つの独立したインスタンスを実行します:1 つはロング機会に専念し、もう 1 つはショート機会に調整されています。各サイドは独自のローソク足シリーズ、ATR 長さ、シグナルシフトで動作できるため、戦略はマルチタイムフレーム確認または非対称リスク設定を組み合わせることができます。
BrainTrend2 V2 は、最新の真のレンジを加重 ATR 平均と比較することで動的な「川」チャネルを構築するトレンドフォローエンジンです。インジケーターはローソク足を 5 つの異なる色で塗ります:
- 0 – 上昇トレンドの川の中の強気ローソク足。
- 1 – 上昇トレンドの川の中の弱気ローソク足。
- 2 – 川が方向を切り替える間の中立プレースホルダー。
- 3 – 下降トレンドの川の中の強気ローソク足。
- 4 – 下降トレンドの川の中の弱気ローソク足。
デュプレックス戦略はそれらの色遷移を解釈してエントリーとエグジットをトリガーし、MQL5 エキスパートにハードコードされたルールを密接に反映します。
取引ロジック
ロングサイド
Long Signal Bar ステップ前のローソク足でインジケーターを評価する(デフォルト 1 = 前の完成バー)。
- 以下のときにロングポジションを開く:
- バー
SignalBar + 1(2 バー前)の色が 2 より小さかった(上昇トレンドの川の緑のトーン)、かつ
- バー
SignalBar の色が 1 より大きい(純粋な強気状態からの遷移)。
- バー
SignalBar + 1 の色が 2 より大きい(下降トレンドの川が生成したマゼンタのトーン)ときに既存のロングポジションを閉じる。
ショートサイド
Short Signal Bar ステップ前のローソク足でインジケーターを評価する(デフォルト 1)。
- 以下のときにショートポジションを開く:
- バー
SignalBar + 1 の色が 2 より大きかった(マゼンタのトーン)、かつ
- バー
SignalBar の色が 0 より大きい(純粋な強気ローソク足以外の何でも)。
- バー
SignalBar + 1 の色が 2 より小さい(上昇トレンドの川への回帰)ときに既存のショートポジションを閉じる。
新しい注文が発行されると、戦略は自動的に反対側のエクスポージャーを相殺します。たとえば、ショートエントリーリクエストは最初に現在のロングポジション(あれば)を買い戻し、その後設定されたショートボリュームの売り注文を送信します。
リスク管理
- 両サイドはポイント単位で独立したストップロスとテイクプロフィット距離を指定できます。値
0 はそれぞれのブラケットを無効にします。
- ストップと目標は商品価格ステップを使用した絶対価格で計算されます。ロングはローソク足の安値/高値を監視し、ショートはバー内実行をエミュレートするためにローソク足の高値/安値を監視します。
- ポジションサイズはトレーディングユニットで直接表現され、ロングとショートのストリーム間で異なる場合があります。
- 戦略はまた
StartProtection() を有効にして、StockSharp 内で設定されたポートフォリオレベルのセーフガードと統合します。
パラメーター
| パラメーター |
説明 |
デフォルト |
Long Candle Type |
ロングインジケーターに使用するローソク足データタイプ(タイムフレーム)。 |
H4 タイムフレーム |
Long ATR Period |
ロングストリームの BrainTrend2 V2 計算で使用する ATR ルックバック。 |
7 |
Long Signal Bar |
ロング決定のために評価される過去シフト(バー単位)。 |
1 |
Enable Long Entries |
新しいロング注文を許可または禁止する。 |
true |
Enable Long Exits |
インジケーターが生成するロングエグジットを許可または禁止する。 |
true |
Long Volume |
ロングエントリーの基本注文サイズ。 |
1 |
Long Stop Loss |
ロングトレードのポイント単位のストップロス距離(0 = 無効)。 |
1000 |
Long Take Profit |
ロングトレードのポイント単位のテイクプロフィット距離(0 = 無効)。 |
2000 |
Short Candle Type |
ショートインジケーターに使用するローソク足データタイプ。 |
H4 タイムフレーム |
Short ATR Period |
ショートストリームの BrainTrend2 V2 計算で使用する ATR ルックバック。 |
7 |
Short Signal Bar |
ショート決定のために評価される過去シフト(バー単位)。 |
1 |
Enable Short Entries |
新しいショート注文を許可または禁止する。 |
true |
Enable Short Exits |
インジケーターが生成するショートエグジットを許可または禁止する。 |
true |
Short Volume |
ショートエントリーの基本注文サイズ。 |
1 |
Short Stop Loss |
ショートトレードのポイント単位のストップロス距離(0 = 無効)。 |
1000 |
Short Take Profit |
ショートトレードのポイント単位のテイクプロフィット距離(0 = 無効)。 |
2000 |
使用上の注意
- 追加のローソク足確認を待つためにより大きなシグナルシフトを使用するか、ロングとショートのストリームに異なるローソク足タイプを割り当てて異なるタイムフレームを組み合わせる。
- 戦略はカスタム BrainTrend2 実装を使用するため、外部のインジケーターファイルには依存しません;すべてが C# クラス内に自己完結しています。
- ストップと目標は完成した各ローソク足で管理されます。ライブデータで実行する場合、より厳密なリスク管理が必要なら十分に小さいローソク足間隔の使用を検討してください。
- ストップとテイクプロフィット距離の両方をゼロに設定すると、反対の色トリガーが現れるまでポジションが開いたままになります。
- インジケーターバッファは ATR 期間に等しい十分なローソク足が処理されると初期化されます。それまでは取引決定は行われません。
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>
/// BrainTrend2 V2 Duplex strategy (simplified).
/// Uses ATR-based channel breakout for trend detection.
/// </summary>
public class BrainTrend2V2DuplexStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _atrPeriod;
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<decimal> _channelMult;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int AtrPeriod
{
get => _atrPeriod.Value;
set => _atrPeriod.Value = value;
}
public int EmaPeriod
{
get => _emaPeriod.Value;
set => _emaPeriod.Value = value;
}
public decimal ChannelMult
{
get => _channelMult.Value;
set => _channelMult.Value = value;
}
public BrainTrend2V2DuplexStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_atrPeriod = Param(nameof(AtrPeriod), 7)
.SetGreaterThanZero()
.SetDisplay("ATR Period", "ATR length", "Indicators");
_emaPeriod = Param(nameof(EmaPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "EMA length for trend", "Indicators");
_channelMult = Param(nameof(ChannelMult), 2.5m)
.SetGreaterThanZero()
.SetDisplay("Channel Mult", "ATR multiplier for channel width", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var atr = new AverageTrueRange { Length = AtrPeriod };
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(atr, ema, (ICandleMessage candle, decimal atrValue, decimal emaValue) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
var close = candle.ClosePrice;
var upper = emaValue + ChannelMult * atrValue;
var lower = emaValue - ChannelMult * atrValue;
// Buy when close breaks above upper channel
if (close > upper && Position <= 0)
{
BuyMarket();
}
// Sell when close breaks below lower channel
else if (close < lower && Position >= 0)
{
SellMarket();
}
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, ema);
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.Indicators import AverageTrueRange, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class brain_trend2_v2_duplex_strategy(Strategy):
def __init__(self):
super(brain_trend2_v2_duplex_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._atr_period = self.Param("AtrPeriod", 7) \
.SetDisplay("ATR Period", "ATR length", "Indicators")
self._ema_period = self.Param("EmaPeriod", 14) \
.SetDisplay("EMA Period", "EMA length for trend", "Indicators")
self._channel_mult = self.Param("ChannelMult", 2.5) \
.SetDisplay("Channel Mult", "ATR multiplier for channel width", "Indicators")
@property
def CandleType(self):
return self._candle_type.Value
@property
def AtrPeriod(self):
return self._atr_period.Value
@property
def EmaPeriod(self):
return self._ema_period.Value
@property
def ChannelMult(self):
return self._channel_mult.Value
def OnStarted2(self, time):
super(brain_trend2_v2_duplex_strategy, self).OnStarted2(time)
atr = AverageTrueRange()
atr.Length = self.AtrPeriod
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription \
.Bind(atr, ema, self._on_process) \
.Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema)
self.DrawOwnTrades(area)
def _on_process(self, candle, atr_value, ema_value):
if candle.State != CandleStates.Finished:
return
av = float(atr_value)
ev = float(ema_value)
close = float(candle.ClosePrice)
mult = float(self.ChannelMult)
upper = ev + mult * av
lower = ev - mult * av
if close > upper and self.Position <= 0:
self.BuyMarket()
elif close < lower and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return brain_trend2_v2_duplex_strategy()