GitHub で見る

時限爆弾戦略

Time Bomb は、価格が一方向に爆発するたびに単一の注文を発行する MetaTrader エキスパート アドバイザーを複製します。 短い、設定可能なウィンドウ。この戦略は、リアルタイムで最高の買値/売値を監視し、その間にカバーされるピップ数を測定します。 最新の参考価格と最新の見積り。必要な距離を十分に早く移動すると、成行注文が開始されます。 ブレイクアウトの方向と、ピップスで表される隠されたストップロスとテイクプロフィットのレベルを即座に武装します。

この実装は、現在オープンなポジションがない場合にのみ機能し、重複を防ぐ元のブロック ロジックをミラーリングします。 取引。価格参照は、シグナルがトリガーされるか、観測ウィンドウが終了するとリセットされるため、バーストごとに ボラティリティによって生成される取引は、各サイドにつき最大でも 1 つです。ストップロスとテイクプロフィットのレベルは内部で維持され、強制されます。 StockSharp は市場執行のための保護注文を自動的に発注しないため、戦略自体が無効になります。

詳細

  • エントリー基準:
    • ロング: ベストアスクが保存されている参照価格と比較して少なくとも BuyPipsInTime ピップス上昇し、動きが終了します BuyTimeToWait 秒以内に。条件が満たされると、サイズ BuyVolume の買い注文が送信されます。
    • ショート: 最高入札額が保存されている参照価格と比較して少なくとも SellPipsInTime ピップス下落し、移動が終了します SellTimeToWait 秒以内に。条件が満たされると、サイズ SellVolume の売り注文が送信されます。
  • ロング/ショート: 両方向がサポートされていますが、一度に存在できる位置は 1 つだけです。
  • 終了基準:
    • ロング: 最良入札が計算されたストップロスまたはテイクプロフィット価格に達するとポジションがクローズされます。
    • ショート: 最良のアスクが計算されたストップロスに達するか、最良のビッドがテイクプロフィットレベルに達すると、ポジションがクローズされます。
  • ストップ: 隠れた保護ストップはストラテジーによって処理されます。距離はピップで定義され、以下を使用して価格に変換されます。 現在のシンボルのステップ サイズ。
  • デフォルト値:
    • SellPipsInTime = 5 ピップス、SellTimeToWait = 10 秒、SellVolume = 0.01 ロット。
    • SellStopLossPips = 20 ピップス、SellTakeProfitPips = 20 ピップス。
    • BuyPipsInTime = 5 ピップス、BuyTimeToWait = 10 秒、BuyVolume = 0.01 ロット。
    • BuyStopLossPips = 20 ピップス、BuyTakeProfitPips = 20 ピップス。
  • フィルター:
    • カテゴリ: ブレイクアウト/勢い。
    • 方向: 対称 (長短)。
    • インジケーター: 生の価格変動のみ。オシレーターは含まれません。
    • ストップ: はい (各側の固定ピップ距離)。
    • 複雑さ: 低 - 単純な状態追跡を備えた単一のブレークアウト検出器。
    • 時間枠: 日内、1 秒に 1 回、ティックレベルのインパルスに反応します。
    • 季節性:いいえ。
    • ニューラルネットワーク: いいえ。
    • ダイバージェンス: いいえ。
    • リスクレベル: 設定されたピップ距離によって異なります。デフォルトは、主要なFXペアの中程度のリスクに相当します。

入力

名前 説明
SellPipsInTime ショートポジションを開く前にカバーしなければならない最小の下降距離 (ピップ単位)。
SellTimeToWait 下方向への移動が完了するまでに許容される秒数。
SellVolume 売りシグナルの取引量。
SellStopLossPips ショートポジションのストップロス距離(ピップ単位で表されます)。
SellTakeProfitPips ショートポジションのテイクプロフィット距離 (pips で表現)。
BuyPipsInTime ロングポジションを開く前にカバーする必要があるピップ単位の最小上昇距離。
BuyTimeToWait 上向きの移動が完了するまでに許容される秒数。
BuyVolume 買いシグナルの取引量。
BuyStopLossPips ロングポジションのストップロス距離 (pips で表現)。
BuyTakeProfitPips ロングポジションのテイクプロフィット距離(ピップ単位で表されます)。

注意事項

  • この戦略は、最良の買値/売値の更新に依存しています。データ フィードが正確なレベル 1 の見積もりを提供することを確認します。
  • ピップ距離または時間ウィンドウをゼロに設定すると、基準価格がリセットされるため、対応するシグナルが無効になります。 取引を生み出す。
  • 保護レベルは内部で管理されているため、予期せぬ切断が発生すると、ハードストップが行われずに位置を離れる可能性があります。検討してください ライブ実行時に戦略と外部リスク管理を組み合わせます。
namespace StockSharp.Samples.Strategies;

using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;

/// <summary>
/// Time Bomb strategy: Momentum zero-line crossover.
/// Buys when momentum crosses above zero, sells when momentum crosses below zero.
/// </summary>
public class TimeBombStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _period;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private decimal _prevMom;
	private int _candlesSinceTrade;
	private bool _hasPrev;

	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
	public int Period { get => _period.Value; set => _period.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public TimeBombStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_period = Param(nameof(Period), 10)
			.SetGreaterThanZero()
			.SetDisplay("Period", "Momentum period", "Indicators");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevMom = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		_hasPrev = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevMom = 0;
		_candlesSinceTrade = SignalCooldownCandles;
		_hasPrev = false;
		var mom = new Momentum { Length = Period };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(mom, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal momValue)
	{
		if (candle.State != CandleStates.Finished) return;

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		if (_hasPrev)
		{
			if (_prevMom <= 0 && momValue > 0 && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				BuyMarket();
				_candlesSinceTrade = 0;
			}
			else if (_prevMom >= 0 && momValue < 0 && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				SellMarket();
				_candlesSinceTrade = 0;
			}
		}

		_prevMom = momValue;
		_hasPrev = true;
	}
}