GitHub で見る

Rollback System 戦略

この戦略はMetaTrader 5エキスパートアドバイザー**「Rollback system」**のC#変換です。新しい取引日の最初に取引するという元のアイデアを保持し、 過去24本の時間足ローソク足を評価して、市場が押し戻される可能性のある長い動きを届けたかどうかを検出します。

トレードロジック

  1. 戦略は時間足のタイムフレーム(CandleType、デフォルト1時間)で機能します。
  2. シグナルは新しい日が始まる(00:0000:03)時に1日1回だけ評価されます。フィルターはMQLバージョンと同様に月曜日と金曜日のセッションを スキップします。
  3. ポジションを開く前に、アルゴリズムは他の取引がアクティブでないことを確認します。
  4. 各取引日について、最後の24本の閉じたローソク足から以下の値が計算されます:
    • Open_24_minus_Close_1 – 24バー前の始値と最後の終値の距離。
    • Close_1_minus_Open_24 – 1日の純変化を示す逆距離。
    • Close_1_minus_Lowest – 終値が1日の最安値からどれだけ離れているか。
    • Highest_minus_Close_1 – 終値が1日の最高値からどれだけ離れているか。
  5. エントリールール(pipパラメーターから変換された価格単位で表現):
    • ロング #1 – 前日が下落(Open_24_minus_Close_1ChannelOpenClosePips閾値を超える)し、終値がまだ 極端な安値の近く(Close_1_minus_LowestRollbackPips - ChannelRollbackPips未満)。
    • ロング #2 – 前日が上昇(Close_1_minus_Open_24がチャネル閾値を超える)したが、市場が 日次高値を大幅に下回って終値(Highest_minus_Close_1RollbackPips + ChannelRollbackPips超)。
    • ショート #1 – 前日が上昇し、終値が日次高値の近く(Highest_minus_Close_1RollbackPips - ChannelRollbackPips未満)で終了。
    • ショート #2 – 前日が下落し、終値が日次安値を大幅に回復(Close_1_minus_LowestRollbackPips + ChannelRollbackPips超)。
  6. 注文は設定された取引量を使用してBuyMarket/SellMarketで実行されます。ストップロスとテイクプロフィットのレベルは StopLossPipsTakeProfitPipsから導出されます(両方ゼロで各保護を無効化)。
  7. 保護レベルはすべての完成したローソク足で監視されます。価格がバー内でレベルを違反すると、戦略はマーケット注文でポジションをクローズし、 ハードストップを送信した元のMQLエキスパートアドバイザーの動作を複製します。

pipパラメーターの変換

MetaTrader 5は3桁および5桁のシンボルでpip値に10を掛けます。変換ロジックが保持されています:戦略はインストゥルメントのPriceStepを取り、 検出された小数桁数が3または5に等しい場合に10倍の乗数を適用します。これにより、典型的なFXシンボルのエントリー閾値、 ストップロスとテイクプロフィット距離がMQL実装と一致します。

パラメーター

パラメーター 説明
TradeVolume マーケット注文に使用する取引サイズ。
StopLossPips pipsでのストップロス距離。無効にするにはゼロに設定。
TakeProfitPips pipsでのテイクプロフィット距離。無効にするにはゼロに設定。
RollbackPips すべてのシグナルで使用されるベースロールバック要件。
ChannelOpenClosePips 前日の始値と終値の最小差。
ChannelRollbackPips ロールバックチェックに追加/減算される許容値。
CandleType ワーキングローソク足タイプ、デフォルトは時間足バー。

ノート

  • MQLバージョンは視覚的な参照のためにチャートに矩形を描画しました。StockSharpポートは取引ロジックのみを保持します。
  • リスク管理は高レベルAPIがポジションを直接管理するため、サーバーサイドの保護注文の代わりに戦略内部監視で実装されています。
  • 最適化する際は、目標インストゥルメントとブローカーのティックサイズに合わせてpip閾値とボリュームを調整してください。
using System;
using System.Collections.Generic;

using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;

namespace StockSharp.Samples.Strategies;

public class RollbackSystemStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _rsiPeriod;
	private decimal? _prevRsi;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }

	public RollbackSystemStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
		_rsiPeriod = Param(nameof(RsiPeriod), 14).SetGreaterThanZero().SetDisplay("RSI Period", "RSI lookback", "Indicators");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevRsi = null;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevRsi = null;
		var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(rsi, ProcessCandle).Start();
		var area = CreateChartArea();
		if (area != null) { DrawCandles(area, subscription); DrawOwnTrades(area); }
	}

	private void ProcessCandle(ICandleMessage candle, decimal rsiVal)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) { _prevRsi = rsiVal; return; }
		if (_prevRsi == null) { _prevRsi = rsiVal; return; }
		if (_prevRsi.Value < 30m && rsiVal >= 30m && Position <= 0) { if (Position < 0) BuyMarket(); BuyMarket(); }
		else if (_prevRsi.Value > 70m && rsiVal <= 70m && Position >= 0) { if (Position > 0) SellMarket(); SellMarket(); }
		_prevRsi = rsiVal;
	}
}