GitHub で見る

Fibo ピボット MultiVal 戦略

概要

Fibo Pivot MultiVal Strategy は、MetaTrader 4 エキスパート アドバイザー _Fibo_Pivot_multiVal.mq4 の StockSharp 移植です。の この戦略は、毎日のピボットポイントと Fibonacci のリトレースメントおよびエクステンション率を組み合わせて、各価格内で指値注文を展開します。 ピボットを囲むゾーン。取引セッション、ポジションターゲット、および停止ルールは元のエキスパートアドバイザーに従います。 リスク管理と執行動作は、MetaTrader バージョンを使用したトレーダーにとって馴染みのあるものです。

中核ロジック

  1. 毎日の基準レベルは、前日の高値、安値、終値から計算されます。従来のピボット レベル (P、R1 ~ R3、S1 ~ S3) ピボットと隣接するサポートの間の距離を分割する Fibonacci ベースの内部レベルを伴う、または 抵抗線。追加の R3/S3 拡張機能により、潜在的なブレイクアウト ターゲットが予測されます。
  2. 日中の価格変動は、設定されたローソク足の時間枠 (デフォルトでは 15 分) で監視されます。現在の取引が終了したとき 特定のピボット ゾーン内 (たとえば、R2 と R3 の間) にある場合、戦略は対応する指値注文をアクティブにします。
  3. 指値注文は、Fibonacci サブレベルで発注されます。各ゾーンは、方向に従ってロング注文とショート注文の両方を維持します。 価格がR1-R2とS1-S2の間で変動する場合、MidZoneOrderModeパラメータによってフィルタリングされます。
  4. 目標は市場の変動に適応します。 UseReversalTargets が有効な場合、出口はアクティブな出口の反対側に位置します。 Fibonacci バンドで平均回帰バウンスをキャプチャします。無効にすると、アルゴリズムは前日の範囲を比較します。 LimitPointOut および LimitPointIn のしきい値は、(R3/S3 拡張に向けた)延長ブレークアウトを目指すかどうかを決定します。 より深い反転(ピボットに向かって)。
  5. リスク制限は、設定可能な毎日またはシンボルごとの利益/取引しきい値を超えると、新しい取引を一時停止します。すべて保留中 注文はキャンセルされ、次のセッションがリセットされると(StartTime前)取引が再開されます。
  6. セッション管理 は元の EA を反映しています。取引は StartTime に開始され、新規エントリーは FinishTime の後に停止します。 開放露出は CloseAllTime 以降平坦化されます。

パラメーター

名前 デフォルト 説明
CandleType 15分キャンドル 意思決定ローソクを構築するために使用される時間枠。
OrderVolume 0.1 ストラテジーによって登録された各指値注文のボリューム。
StartTime 00:01 取引を可能にしてカウンターをリセットするセッション時間。
FinishTime 08:00 既存のポジションを維持しながら新しいエントリーを無効にするセッション時間。
CloseAllTime 12:00 注文をキャンセルし、すべてのポジションを閉じるセッション時間。
UseReversalTargets true true の場合、ターゲットは Fibonacci ゾーン内に留まります。 false の場合、日次範囲に基づいてブレイクアウト/ピボット ターゲットが使用されます。
LimitPointIn 150 日次範囲のしきい値 (ポイント) を超えた場合にピボット復帰目標を強制します。
LimitPointOut 50 価格行動が圧縮されたときにブレイクアウトターゲットを奨励する日次レンジしきい値(ポイント)。
LevelPf1 33 ピボット - R1 とピボット - S1 の距離を分割するために使用されるパーセンテージ。
LevelF1F2 50 R1 ~ R2 と S1 ~ S2 の間の中間レベルを計算するために使用されるパーセンテージ。
LevelF2F3 33 R2 ~ R3 と S2 ~ S3 の間の中間レベルを計算するために使用されるパーセンテージ。
LevelF3Out 40 ブレークアウト ターゲットの R3/S3 を拡張するために使用されるパーセンテージ。
MidZoneOrderMode "bs" ミッドゾーン内で許可されるルート ("b"= 購入のみ、"s"= 販売のみ、"bs"= 両方)。
DailyProfitTarget 50 ポイント単位での 1 日あたりの利益制限。
DailyTradeTarget 35 1 日あたりに完了した取引の最大数。
SymbolProfitTarget 150 シンボルごとの利益目標 (ポイント単位)。
SymbolTradeTarget 15 シンボルごとに 1 日に完了する最大取引数。

注文管理

  • 各アクティブゾーンは、独自のエントリー注文、利益確定注文、およびオプションのストップ注文を保持します。エントリーが約定されると、エグジット注文が行われます。 Fibonacci 構成から派生したターゲット/ストップ レベルを使用して再作成されます。
  • 満たされた出口は、毎日の統計とシンボルごとの統計を更新します。制限に達すると、次のリセットまで取引が一時停止されます。
  • セッション境界によりエントリーオーダーが自動的にキャンセルされます。さらに、CloseAllTime 境界は、オープン ポジションをすべてクローズします。 市場注文。

実践的なヒント

  • この戦略では、明確に定義された価格ステップを持つ商品が期待されます。 Security インスタンスが PriceStep を公開していることを確認してください。 ポイントから価格への変換は元の EA と一致します。
  • 異なるボラティリティ特性を持つ資産の場合は、ブレイクアウトと 平均回帰動作は適切な範囲でトリガーされます。
  • ミッドゾーン(R1-R2 または S1-S2)付近の方向性トレードを希望する場合は、MidZoneOrderMode"b" または "s" に設定して、のみを許可します 長いまたは短いセットアップ。
  • 組み込みのパラメータ最適化サポートを使用して、代替の Fibonacci 比率をバックテストします。すべてのパーセントパラメータと しきい値によりソース コード内の SetCanOptimize が公開され、StockSharp デザイナー内での自動スキャンが有効になります。

元のExpert Advisorとの違い

  • StockSharp バージョンは、戦略インスタンスごとに 1 つのセキュリティで動作します。 MetaTrader EA のように複数のシンボルを取引するには、 各商品に対して個別の戦略インスタンスを実行します。
  • ポジションのサイジングは、MetaTrader ロットではなくボリューム単位で直接表現されます。 OrderVolume を設定してください ブローカーの要件。
  • 注文の実行は、StockSharp の高レベル API (BuyLimitSellLimit など) に依存します。ブローカー固有の動作 (例: 保留中の注文オフセット)を実稼働環境にデプロイする前に確認する必要があります。
using System;

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

namespace StockSharp.Samples.Strategies;

public class FiboPivotMultiValStrategy : Strategy
{
	private readonly StrategyParam<int> _channelPeriod;
	private readonly StrategyParam<int> _emaPeriod;
	private readonly StrategyParam<int> _cooldownCandles;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevClose;
	private decimal _prevMid;
	private bool _hasPrev;
	private int _cooldownRemaining;

	public int ChannelPeriod { get => _channelPeriod.Value; set => _channelPeriod.Value = value; }
	public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
	public int CooldownCandles { get => _cooldownCandles.Value; set => _cooldownCandles.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public FiboPivotMultiValStrategy()
	{
		_channelPeriod = Param(nameof(ChannelPeriod), 48).SetDisplay("Channel Period", "Fibo channel lookback", "Indicators");
		_emaPeriod = Param(nameof(EmaPeriod), 50).SetDisplay("EMA Period", "EMA filter", "Indicators");
		_cooldownCandles = Param(nameof(CooldownCandles), 150).SetDisplay("Cooldown", "Candles between signals", "General");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevClose = default;
		_prevMid = default;
		_hasPrev = default;
		_cooldownRemaining = default;
	}

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_prevClose = 0;
		_prevMid = 0;
		_hasPrev = false;
		_cooldownRemaining = 0;

		var highest = new Highest { Length = ChannelPeriod };
		var lowest = new Lowest { Length = ChannelPeriod };
		var ema = new ExponentialMovingAverage { Length = EmaPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(highest, lowest, ema, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal highest, decimal lowest, decimal ema)
	{
		if (candle.State != CandleStates.Finished) return;
		var close = candle.ClosePrice;
		var mid = (highest + lowest) / 2;
		if (!_hasPrev) { _prevClose = close; _prevMid = mid; _hasPrev = true; return; }

		if (_cooldownRemaining > 0)
		{
			_cooldownRemaining--;
			_prevClose = close;
			_prevMid = mid;
			return;
		}

		if (_prevClose <= _prevMid && close > mid && close > ema && Position <= 0)
		{
			if (Position < 0) BuyMarket();
			BuyMarket();
			_cooldownRemaining = CooldownCandles;
		}
		else if (_prevClose >= _prevMid && close < mid && close < ema && Position >= 0)
		{
			if (Position > 0) SellMarket();
			SellMarket();
			_cooldownRemaining = CooldownCandles;
		}
		_prevClose = close;
		_prevMid = mid;
	}
}