GitHub で見る

フラクチャード Fractals (MT4) 戦略

クラシック MetaTrader 4 Expert Advisor MQL/7696/Fractured_fractals.mq4 の詳細な C# ポート。戦略は新たに確認されたものを監視します Williams フラクタル レベル、キュー ブレイクアウト ストップ注文、および以前のフラクタル スイングを使用したトレイル リスク。ポジションサイジングは以下に従います ドローダウン後の適応型「DecreaseFactor」ボリューム削減を備えた独自の取引ごとのリスクロジック。

詳細

  • 出典: MQL/7696/Fractured_fractals.mq4 から変換。
  • 市場体制: ブレイクアウト継続。信頼性の高いフラクタル構造を形成するあらゆる商品で機能します。
  • 注文タイプ: エントリーには逆指値注文を、エグジットには保護逆指値注文を使用します。
  • ポジションサイジング: DecreaseFactor を介した損失ストリークダンピングを備えた MaximumRiskPercent によって制御されるパーセンテージリスクモデル。
  • デフォルトのパラメータ:
    • MaximumRiskPercent = 2%
    • DecreaseFactor = 3
    • CandleType = 1 時間の時間枠
  • コア インジケーター: ネイティブの 5 バー Williams フラクタル検出が戦略に実装されています。
  • 戦略タイプ: フラクタルベースのトレーリング ストップを備えた対称ロング/ショート ブレイクアウト。

戦略ロジック

フラクタル検出

  • MetaTrader の iFractals バッファを再現するために、5 つのローソク足の高値と安値のローリング ウィンドウを維持します。
  • 中央の高値が両側の周囲の 2 つの高値を超えると、新しいアップ フラクタルが確認されます。ダウン フラクタルには次のものが必要です 中低音は 5 小節シーケンスの中で最低音になります。
  • 新しいフラクタルが表示されると、それは前の 3 つの値とともに保存され、EA の cfupfu、および pfu.1 スタイルのバッファーは、後の比較と末尾の計算に使用されます。

エントリーのセットアップ

  • ロングトレードでは、リスクフロアを定義するには、直前の上昇フラクタルが前のフラクタルを超える必要があり、最新の下降フラクタルが必要です。 次に、戦略はフラクタル (スプレッド補償) のわずかに上に買いストップを置き、反対側の下に保護ストップを置きます。 ダウンフラクタル。
  • ショートトレードはロジックを反映しています。下位の低フラクタルと高位のフラクタルの組み合わせにより、売りストップと保護的取引が生成されます。 アップフラクタルプラススプレッドの上で停止します。
  • 指向ごとに許可される未決注文は 1 つだけです。フラクタル構造がパターンを無効にする場合、たとえば、最新のフラクタル番号 前回の注文を超えた場合、保留中の注文はすぐにキャンセルされます。

管理を停止する

  • 配置されると、ボットは入口側で以前のフラクタルを使用して保護停止を追跡し、現在のフラクタルを減算/加算します。 広がる。ストップは取引に有利な方向にのみ動きます。
  • ポジションの方向が変更されるかクローズされると、未使用のストップ注文は無効なエクスポージャーを防ぐためにキャンセルされます。

リスク管理

  • CalculateOrderVolume は、EA の取引ごとのリスク計算を複製します。ポジション サイズは、金銭的リスク許容額とポジション サイズの比率です。 エントリーレベルとストップレベルの間の距離。
  • アカウント評価では Portfolio.CurrentValue が優先されます。使用できない場合、ルーチンは戦略の Volume プロパティに戻ります 価格を掛けたもの。
  • 2 回以上連続して負けた取引の後、取引量は losses / DecreaseFactor だけ減少し、MetaTrader をエミュレートします。 DecreaseFactor の動作。

貿易サイクルの追跡

  • OnOwnTradeReceived は取引サイクルを集計し、変動損益を追跡し、取引高が戻ったら連敗記録を更新します 平らに。これにより、リスク ロジックが、以前の結果の分析に HistoryTotal が使用された MT4 エキスパートと連携した状態に保たれます。

使用上の注意

  1. 戦略を任意のセキュリティ/ポートフォリオ ペアにアタッチし、元の解像度と一致する適切な CandleType 解像度を選択します EA のセットアップ。
  2. レベル 1 の相場が利用可能であることを確認します。スプレッド推定は最良の買値/売値に依存します。利用できない場合、戦略は次のようになります。 PriceStep
  3. ストップ注文は、ブローカーがサーバー側のストップをサポートしていることを前提としています。次の場合は、BuyStop/SellStop 登録を成行注文に置き換えます。 アダプターに必要です。
  4. 処理はローソク足の終値で発生するため、バー内フラクタル信号は各バーの終わりにのみ作用し、 専門アドバイザーによるバーごとの評価。
using System;
using System.Collections.Generic;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Fractured Fractals strategy - Highest/Lowest channel breakout with ATR filter.
/// Buys when close crosses above channel midpoint and ATR confirms volatility.
/// Sells when close crosses below channel midpoint.
/// </summary>
public class FracturedFractalsMql4Strategy : Strategy
{
	private readonly StrategyParam<int> _channelPeriod;
	private readonly StrategyParam<int> _atrPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevClose;
	private decimal _prevMid;
	private bool _hasPrev;

	public int ChannelPeriod { get => _channelPeriod.Value; set => _channelPeriod.Value = value; }
	public int AtrPeriod { get => _atrPeriod.Value; set => _atrPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public FracturedFractalsMql4Strategy()
	{
		_channelPeriod = Param(nameof(ChannelPeriod), 15)
			.SetDisplay("Channel Period", "Highest/Lowest lookback", "Indicators");

		_atrPeriod = Param(nameof(AtrPeriod), 14)
			.SetDisplay("ATR Period", "ATR lookback", "Indicators");

		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
	protected override void OnReseted() { base.OnReseted(); _prevClose = 0m; _prevMid = 0m; _hasPrev = false; }

	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);

		_hasPrev = false;

		var highest = new Highest { Length = ChannelPeriod };
		var lowest = new Lowest { Length = ChannelPeriod };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(highest, lowest, ProcessCandle)
			.Start();
	}

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

		var close = candle.ClosePrice;
		var mid = (highest + lowest) / 2;

		if (!_hasPrev)
		{
			_prevClose = close;
			_prevMid = mid;
			_hasPrev = true;
			return;
		}

		// Close crosses above midpoint = buy
		if (_prevClose <= _prevMid && close > mid && Position <= 0)
		{
			if (Position < 0)
				BuyMarket();
			BuyMarket();
		}
		// Close crosses below midpoint = sell
		else if (_prevClose >= _prevMid && close < mid && Position >= 0)
		{
			if (Position > 0)
				SellMarket();
			SellMarket();
		}

		_prevClose = close;
		_prevMid = mid;
	}
}