GitHub で見る

Stochastic アクセラレータ戦略

概要

Stochastic アクセラレータ戦略は、MetaTrader 5 エキスパート #2 stoch mt5 の変換です。オリジナルロボットは3つを評価します Bill Williams のアクセラレーター オシレーターとオーサム オシレーターを組み合わせた確率的オシレーター。ロングポジションがオープンされています すべての確率的フィルターが強気の勢いに一致し、アクセラレーター オシレーターが感度しきい値を超えた場合にのみ発生します。 ショート ポジションでは対称ルールが使用されます。取引が実行されると、Awesome Oscillator は勢いの反転を監視して取引を終了します。 露出。 StockSharp ポートは、高レベルのキャンドル サブスクリプション API に依存しながら、これらのメカニズムを再現します。 インジケーターのバインディング。

この戦略では、資金管理プロファイルを EA から保持します。エントリーは固定ロット量でサイズ設定されますが、ストップロスと テイクプロフィットディスタンスは MetaTrader ピップで表されます。 StockSharp 実装は StartProtection を使用するため、設定された リスク制限はすべての新しいポジションに自動的に適用されます。価格ステップは、維持するために MetaTrader ピップ単位に変換されます。 ブローカー全体で同じ保護距離。

取引ロジック

  1. CandleType によって定義されたプライマリ キャンドル シリーズをサブスクライブし、元の EA をミラーリングして、完成したキャンドルのみを処理します。
  2. 3 つの StochasticOscillator インスタンスをフィードします。
    • シグナル確率論は、%K が %D より上か下かをチェックします。
    • エントリーストキャスティックは、強気シグナルが EntryLevel を上回っていること (ショートの場合は 100 - EntryLevel を下回っていること) を検証します。
    • 確率的フィルター により、強気のセットアップが FilterLevel 未満 (ショートの場合は 100 - FilterLevel より上) にとどまることが保証されます。
  3. アクセラレータ オシレータを追跡し、ロング エントリを確認するには、それが AcceleratorLevel を超えることを要求します。ショーツに求められるのは、 -AcceleratorLevelの下を渡ります。
  4. オーサム オシレーターが反対方向に AwesomeLevel バンドを通過したら、オープン ポジションを閉じます。
  5. フラット化後、片側だけがすべてのエントリーフィルターを満たしている場合は、新しいポジションをオープンします。音量はセキュリティに合わせて調整されます ロットステップを変更することで、リクエストは実際のブローカーに対して有効なままになります。
  6. StartProtection を使用してストップロスとテイクプロフィット ディスタンスを適用し、MetaTrader と同じピップベースのリスク管理を維持します 専門家。

パラメーター

名前 種類 デフォルト 説明
CandleType DataType 4時間枠 戦略によって処理されたプライマリ キャンドル。
TradeVolume decimal 0.01 新しいエントリーに使用されるボリューム (ロット)。
StopLossPips decimal 40 MetaTrader ピップス単位のストップロス距離。
TakeProfitPips decimal 70 MetaTrader ピップス単位の利食い距離。
SignalKPeriod int 40 確認確率の %K 期間。
SignalDPeriod int 10 %D 確認確率の平滑化。
SignalSlowing int 10 確認確率のための追加の平滑化。
EntryKPeriod int 40 エントリー確率の %K 期間。
EntryDPeriod int 10 %D エントリー確率の平滑化。
EntrySlowing int 10 エントリー確率論の追加の平滑化。
EntryLevel decimal 20 強気の勢いを確認する下限しきい値 (ショートは 100 - EntryLevel を使用)。
FilterKPeriod int 40 確率的フィルターの %K 期間。
FilterDPeriod int 10 %D 確率的フィルターの平滑化。
FilterSlowing int 10 確率的フィルターの追加の平滑化。
FilterLevel decimal 75 強気の設定を制限する上限閾値 (ショートは 100 - FilterLevel を使用)。
AcceleratorLevel decimal 0.0002 エントリに必要なアクセラレータ オシレータの最小振幅。
AwesomeLevel decimal 0.0013 トレードエグジットを引き起こす素晴らしいオシレーターバンド。

元の MetaTrader 専門家との違い

  • StockSharp ポートは、繰り返される CopyBuffer 呼び出しの代わりに、インジケーター バインディングを備えたキャンドル サブスクリプションを使用します。
  • 注文管理はネットポジションモードで行われます。 EA がすぐに反転する場合、変換はまず、 現在のエクスポージャーを削除し、反対側で新しい成行注文を発行します。
  • ストップロスとテイクプロフィットの距離は、 楽器の価格ステップ。これにより、距離を MetaTrader ポイントと同じに保ちながら、チケットを手動で変更する必要がなくなります。
  • ボリューム リクエストはセキュリティの VolumeStepMinVolume、および MaxVolume に対して正規化されるため、コードはライブで使用できるようになります 取引環境。

使い方のヒント

  • ストラテジーを実行する前に、商品の最小ロットステップに一致するように TradeVolume を調整します。
  • 確率レベル (EntryLevel および FilterLevel) とオシレーターのしきい値を微調整してフィルターを適応させます 市場に対する厳しさ。
  • 可能な場合はチャート描画を有効にして、3 つの確率オシレーター、アクセラレーター オシレーター、オーサム オシレーターを視覚化します。 オシレーター、および実行された取引。
  • ロジックはローソク足が終了するのを待つため、シグナルは各バーの終値で表示されます。同じ期間のバックテスターを使用する 一貫した結果を得るために。

インジケーター

  • 独立したスムージングとしきい値設定を持つ 3 つの StochasticOscillator インスタンス。
  • AcceleratorOscillator 入力確認用。
  • AwesomeOscillator 終了タイミング。
namespace StockSharp.Samples.Strategies;

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

/// <summary>
/// Stochastic Accelerator strategy: Rate of Change crossover.
/// Buys when ROC crosses above zero, sells when ROC crosses below zero.
/// </summary>
public class StochasticAcceleratorStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _period;
	private readonly StrategyParam<decimal> _rocLevel;
	private readonly StrategyParam<int> _signalCooldownCandles;

	private decimal _prevRoc;
	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 decimal RocLevel { get => _rocLevel.Value; set => _rocLevel.Value = value; }
	public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }

	public StochasticAcceleratorStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
		_period = Param(nameof(Period), 12)
			.SetGreaterThanZero()
			.SetDisplay("Period", "ROC period", "Indicators");
		_rocLevel = Param(nameof(RocLevel), 0.2m)
			.SetDisplay("ROC Level", "ROC threshold for crossover", "Signals");
		_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
			.SetGreaterThanZero()
			.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
	}

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

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

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

		if (_candlesSinceTrade < SignalCooldownCandles)
			_candlesSinceTrade++;

		if (_hasPrev)
		{
			if (_prevRoc <= -RocLevel && rocValue > -RocLevel && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				BuyMarket();
				_candlesSinceTrade = 0;
			}
			else if (_prevRoc >= RocLevel && rocValue < RocLevel && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
			{
				SellMarket();
				_candlesSinceTrade = 0;
			}
		}

		_prevRoc = rocValue;
		_hasPrev = true;
	}
}