GitHub で見る

FT ビル Williams AO 戦略

概要

FT Bill Williams AO 戦略 は、MetaTrader 4 エキスパート FT_BillWillams_AO の上位レベルの StockSharp 移植です。オリジナル ロボットは FORTRADER.RU で公開され、ビル Williams フラクタル、Alligator インジケーター、およびオーサム オシレーターを組み合わせて、 早期にブレイクアウトの機会を特定します。 StockSharp バージョンは元のロジックを保持していますが、代わりに単一のネット ポジションで動作します。 複数の同時注文。

このアルゴリズムは、設定可能な時間枠から完了したローソク足に対して動作します。すべてのバーで:

  1. 奇数のローソク足から構築された強気フラクタルと弱気フラクタルを検出します。
  2. フラクタル価格が Alligator の歯のラインの外側にあるかどうかをチェックして、フラクタルをフィルタリングします。
  3. オーサム オシレーター (AO) が古典的な 3 バーの加速パターンを形成するのを待ちます。
  4. ユーザー定義の数 MetaTrader ポイントだけシフトされた最近の高値または安値の上または下にブレイクアウト トリガーを配置します。
  5. Bill Williams の Gragus トレーリング ルーチンとオプションのジョーベースの終了ルールを適用します。

エントリーロジック

長いエントリ

  • 強気のフラクタルが表示され、その高値は Alligator の歯の上にあります。
  • SignalShift + 2SignalShift + 1、および SignalShift キャンドル前に取得された AO 値は、A > BB < C を満たしており、3 つすべてが ポジティブ。
  • 保留中のブレイクアウト レベルは High[SignalShift] + IndentPoints * price step として計算されます。
  • 完了したローソク足がそのレベルを超え、AO がまだ増加している場合 (C > B)、戦略はオープンまたはロングポジションに反転します。

短いエントリー

  • 弱気のフラクタルが表示され、その安値は Alligator 歯の下にあります。
  • AO 値は A < BB > C を満たしており、3 つすべてが負です。
  • ブレイクアウト トリガーは Low[SignalShift] - IndentPoints * price step に配置されます。
  • AOが下がり続けている間にローソク足がそのトリガーを下回ったとき(C < B)、ショートポジション(またはロングポジションからの反転)がオープンします。

撤退とリスク管理

  • 最初のストップロスとテイクプロフィットは MetaTrader ポイントで表され、商品を介して実際の価格距離に変換されます 価格ステップ。
  • CloseDropTeeth モードでは、現在の終値または前の終値が Alligator ジョーを横切ったときにポジションを閉じることができます。
  • CloseReverseSignal は、反対のフラクタルまたは反対のブレークアウト シグナルのアクティブ化によって強制されるかどうかを決定します。 出る。
  • UseTrailing スイッチは、Alligator リップが短い時間よりも速く前進した場合に、オリジナルの Gragus トレーリング ストップ ルーチンを有効にします。 SMA、ストップは唇に移動します。そうしないと歯が跡をたどります。どちらの動きも価格が少なくとも 12 ポイント離れている必要があります ターゲットラインから。

パラメーター

名前 説明
TradeVolume サイズはロット単位でご注文ください。 Strategy.Volume にも書き込まれます。
CandleType 入力ローソク足のデータ型とタイムフレーム。
FractalPeriod フラクタルを確認するために使用される奇数のキャンドル (デフォルトは 5)。
IndentPoints MetaTrader ポイントがブレイクアウトローソク足の高値/安値の上下に追加されました。
JawPeriod, TeethPeriod, LipsPeriod Alligator ラインで使用される平滑化移動平均の長さ。
JawShift, TeethShift, LipsShift Alligator ラインに適用される前方変位 (ローソク単位)。
CloseDropTeeth ジョーベースのクローズルールの動作: 無効、現在のクローズクロス、または以前のクローズクロス。
CloseReverseSignal 反対のシグナルの終了条件: 無効、新しいフラクタル、または反対のブレイクアウトが準備された後。
UseTrailing Gragus トレーリング ストップ ルーチンを有効または無効にします。
TrendSmaPeriod 後続の比較で使用される補助 SMA の期間。
StopLossPoints 最初のストップロス距離 (MetaTrader ポイント)。無効にするには、ゼロに設定します。
TakeProfitPoints 最初のテイクプロフィット距離(MetaTrader ポイント)。無効にするには、ゼロに設定します。
SignalShift AO 値と最近の高値/安値を読み取るときにスキップされた完全に閉じたローソク足の数。

注意事項

  • この戦略は、セキュリティが有効な PriceStep (MinPriceStep にフォールバック) を公開していることを前提としています。両方が欠落している場合、デフォルトは 0.0001 が使用されます。
  • ネットポジションは1つだけ管理されます。反転シグナルは、新しいポジションをオープンする前に、反対のポジションを自動的にクローズします。
  • 最良の結果を得るには、FractalPeriod を奇数に保ちます。元の専門家は5本のろうそくを使用しました。
  • IndentPointsStopLossPoints、および TakeProfitPoints は、MetaTrader ポイントを模倣します。楽器の価格に応じて調整してください スケール。
using System;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Bill Williams Awesome Oscillator strategy.
/// Buys when AO crosses above zero and sells when AO crosses below zero,
/// filtered by Alligator teeth alignment.
/// </summary>
public class FtBillWilliamsAoStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _jawPeriod;
	private readonly StrategyParam<int> _teethPeriod;
	private readonly StrategyParam<int> _lipsPeriod;

	private decimal _prevAo;
	private decimal _prevTeeth;
	private bool _isReady;

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

	public int JawPeriod
	{
		get => _jawPeriod.Value;
		set => _jawPeriod.Value = value;
	}

	public int TeethPeriod
	{
		get => _teethPeriod.Value;
		set => _teethPeriod.Value = value;
	}

	public int LipsPeriod
	{
		get => _lipsPeriod.Value;
		set => _lipsPeriod.Value = value;
	}

	public FtBillWilliamsAoStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
			.SetDisplay("Candle Type", "Candle type for strategy", "General");

		_jawPeriod = Param(nameof(JawPeriod), 13)
			.SetDisplay("Jaw Period", "Alligator jaw SMA period", "Alligator");

		_teethPeriod = Param(nameof(TeethPeriod), 8)
			.SetDisplay("Teeth Period", "Alligator teeth SMA period", "Alligator");

		_lipsPeriod = Param(nameof(LipsPeriod), 5)
			.SetDisplay("Lips Period", "Alligator lips SMA period", "Alligator");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();

		_prevAo = 0;
		_prevTeeth = 0;
		_isReady = false;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		var ao = new AwesomeOscillator();
		var teeth = new SMA { Length = TeethPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(ao, teeth, OnProcess)
			.Start();

		var area = CreateChartArea();
		if (area != null)
		{
			DrawCandles(area, subscription);
			DrawIndicator(area, ao);
			DrawIndicator(area, teeth);
			DrawOwnTrades(area);
		}
	}

	private void OnProcess(ICandleMessage candle, decimal aoVal, decimal teethVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (!_isReady)
		{
			_prevAo = aoVal;
			_prevTeeth = teethVal;
			_isReady = true;
			return;
		}

		var close = candle.ClosePrice;

		// Buy signal: AO crosses above zero, price above teeth
		if (_prevAo <= 0 && aoVal > 0 && close > teethVal)
		{
			if (Position < 0)
				BuyMarket(); // close short

			if (Position <= 0)
				BuyMarket();
		}
		// Sell signal: AO crosses below zero, price below teeth
		else if (_prevAo >= 0 && aoVal < 0 && close < teethVal)
		{
			if (Position > 0)
				SellMarket(); // close long

			if (Position >= 0)
				SellMarket();
		}

		_prevAo = aoVal;
		_prevTeeth = teethVal;
	}
}