GitHub で見る
多通貨テンプレート MT5 戦略
概要
MultiCurrency Template MT5 Strategy は、同じ名前の MetaTrader エキスパート アドバイザの動作を複製します。これは、ユーザーが同時に多数の金融商品を操作できるようにしながら、毎日の時間枠で単純な 2 本のローソク足パターンを取引します。この戦略は、前の日次ローソク足がパターンをトリガーするのに十分な強気または弱気の場合にのみ初期ポジションをオープンし、その後、より速いコントロール時間枠で取引を管理します。マーチンゲール平均ブロックは、価格がポジションに対して設定可能な数の MetaTrader ポイントだけ変動すると追加のチケットを追加します。一方、エグジット ロジックは固定テイクプロフィット、損益分岐点平均、およびオプションのトレーリング ストップを組み合わせます。
StockSharp ポートは、ユーザーが有価証券のカンマ区切りリストを定義できるようにすることで、複数シンボルの管理を維持します。各シンボルは、独自の追跡コンテキスト、ポジション バスケット、資金管理値を使用して独立して処理されます。 TradeMultipair パラメータが無効になっている場合、ストラテジーはストラテジー インスタンスにアタッチされているメインの Security を取引します。
信号の生成
- このストラテジーは、
SignalCandleType (デフォルトでは毎日) をサブスクライブし、2 つの連続した完成したローソクを保存します。
- ロング セットアップは、最新の終値が前の始値を下回り、前のローソク足の終値が始値を上回る場合に検出されます。
- ショート セットアップは、最新の終値が前の始値を上回り、前のローソク足の終値が始値を下回った場合に検出されます。
- 常に 1 方向のみをアクティブにできます。現在のバスケットが完全にクローズされるまで、新しい取引は無視されます。
注文執行
- エントリーは、
Lots で定義された数量で市場に提出されます。
NewBarTrade が有効な場合、ストラテジーは、新しいエントリーを準備する前に、TradeCandleType のローソク足が終了するのを待ちます。このフラグは、MetaTrader の「新しいバーでのみ取引する」動作を再現するために、最初の取引決定時に使用されます。
- ストップロスとテイクプロフィットのターゲットは、距離が元のエキスパートと一致するように、MetaTrader ピップ (検出されたピップ サイズを乗算) を使用して初期化されます。
EnableMartingale が true の場合、この戦略は、価格が現在のバスケットの最良のエントリーから StepPoints だけ離れるたびに平均化チケットを追加します。ボリュームは、その側ですでにオープンされているチケットの数に乗じた NextLotMultiplier によってスケールされます。
貿易管理
- 利益確定の行動は
EnableTakeProfitAverage に依存します:
- 無効にすると、テイクプロフィットは、バスケット内の最良価格から
TakeProfitPips で定義された初期距離に留まります。
- 有効にすると、バスケットに少なくとも 2 枚のチケットが含まれており、ターゲットは損益分岐点価格に
TakeProfitOffsetPoints を加えた価格にシフトされます。
- ストップロスレベルは約定後に再計算されるため、バスケット内の最悪の価格が反映されます。
- トレーリングストップは、チケットが 1 枚だけオープンされている場合に機能します。これは、動きが
TrailingStopPoints + TrailingStepPoints を超えたら最初に損益分岐点プラス TrailingStopPoints にジャンプし、次に取引が進み続けたら同じ距離で価格を追跡することによって、MetaTrader ロジックを再現します。
- リスクイグジットは、片側あたり 1 回のトランザクションでバスケット全体を閉じる成行注文をトリガーします。
パラメーター
| パラメータ |
説明 |
Lots |
各バスケットの最初のチケットの基本取引量。 |
StopLossPips |
最初のストップロス距離は MetaTrader ピップスで表されます。 |
TakeProfitPips |
最初の利食い距離 (MetaTrader ピップ単位)。 |
TrailingStopPoints |
有効なチケットが 1 枚だけの場合の走行距離 (MetaTrader ポイント)。 |
TrailingStepPoints |
トレーリングストップが再び移動される前に追加のバッファー (ポイント) が必要です。 |
SlippagePoints |
MetaTrader スリッページ入力を模倣する分析用に予約されています (実行には使用されません)。 |
NewBarTrade |
TradeCandleType ローソク足に基づいて新しいバー取引フィルターを有効にします。 |
TradeCandleType |
新しいバーの検出と資金管理を促進するハートビート タイムフレーム。 |
TradeMultipair |
true の場合、マルチシンボル モードがアクティブになります。 |
PairsToTrade |
GetSecurity を通じて解決される追加のセキュリティ識別子のカンマ区切りのリスト。 |
Commentary |
注文コメントは参照用に保存されています。 |
EnableMartingale |
逆の動きでチケットを追加する平均化ブロックをアクティブにします。 |
NextLotMultiplier |
新しい平均注文が発注されるときに、以前のチケット数量に適用される乗数。 |
StepPoints |
次の平均化順序をトリガーする MetaTrader ポイントの距離。 |
EnableTakeProfitAverage |
複数のチケットを含むバスケットの損益分岐点 + オフセット目標を有効にします。 |
TakeProfitOffsetPoints |
平均化がアクティブな場合、損益分岐点価格の上(ロング)または下(ショート)に MetaTrader ポイントが追加されます。 |
SignalCandleType |
2 つのローソク足パターンを構築するために使用される時間枠 (デフォルトでは毎日)。 |
注意事項
- この戦略は、エントリーとエグジットの両方において成行注文に依存しています。 MetaTrader からのブローカー側の保護注文は内部でエミュレートされます。
PairsToTrade には、接続されたコネクタが解決できる識別子が含まれている必要があります。不明なシンボルは表示されずにスキップされます。
- マーチンゲールと後続のブロックはシンボル コンテキストごとに動作するため、各証券は独立したバスケットを維持します。
SlippagePoints は完全を期すために保存されていますが、StockSharp での実行には影響しません。
using System;
using Ecng.Common;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Simplified from "Multi Currency Template MT5" MetaTrader expert.
/// Uses candlestick pattern (bearish followed by bullish or vice versa) for entries
/// with simple reversal logic.
/// </summary>
public class MultiCurrencyTemplateMt5Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _lookback;
private ICandleMessage _prevCandle;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int Lookback
{
get => _lookback.Value;
set => _lookback.Value = value;
}
public MultiCurrencyTemplateMt5Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for signal generation", "General");
_lookback = Param(nameof(Lookback), 1)
.SetGreaterThanZero()
.SetDisplay("Lookback", "Number of prior candles for pattern", "Signals");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevCandle = null;
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;
if (_prevCandle is null)
{
_prevCandle = candle;
return;
}
var volume = Volume;
if (volume <= 0)
volume = 1;
// Buy signal: previous candle was bullish (close > open), current closes below previous open
// This is a reversal pattern - bearish candle after bullish suggests exhaustion, buy the dip
var minBody = _prevCandle.OpenPrice * 0.001m;
var buySignal = candle.ClosePrice < _prevCandle.OpenPrice - minBody && _prevCandle.ClosePrice > _prevCandle.OpenPrice + minBody;
// Sell signal: previous candle was bearish (close < open), current closes above previous open
var sellSignal = candle.ClosePrice > _prevCandle.OpenPrice + minBody && _prevCandle.ClosePrice < _prevCandle.OpenPrice - minBody;
if (buySignal)
{
if (Position <= 0)
BuyMarket(Position < 0 ? Math.Abs(Position) + volume : volume);
}
else if (sellSignal)
{
if (Position >= 0)
SellMarket(Position > 0 ? Math.Abs(Position) + volume : volume);
}
_prevCandle = candle;
}
/// <inheritdoc />
protected override void OnReseted()
{
_prevCandle = null;
base.OnReseted();
}
}
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 multi_currency_template_mt5_strategy(Strategy):
def __init__(self):
super(multi_currency_template_mt5_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._prev_open = None
self._prev_close = None
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
def OnReseted(self):
super(multi_currency_template_mt5_strategy, self).OnReseted()
self._prev_open = None
self._prev_close = None
def OnStarted2(self, time):
super(multi_currency_template_mt5_strategy, self).OnStarted2(time)
self._prev_open = None
self._prev_close = None
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(self._process_candle).Start()
def _process_candle(self, candle):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
open_price = float(candle.OpenPrice)
if self._prev_open is None or self._prev_close is None:
self._prev_open = open_price
self._prev_close = close
return
min_body = self._prev_open * 0.001
# Buy: previous candle was bullish (close > open), current closes below previous open
buy_signal = (close < self._prev_open - min_body and
self._prev_close > self._prev_open + min_body)
# Sell: previous candle was bearish (close < open), current closes above previous open
sell_signal = (close > self._prev_open + min_body and
self._prev_close < self._prev_open - min_body)
if buy_signal:
if self.Position <= 0:
self.BuyMarket()
elif sell_signal:
if self.Position >= 0:
self.SellMarket()
self._prev_open = open_price
self._prev_close = close
def CreateClone(self):
return multi_currency_template_mt5_strategy()