GitHub で見る

エリート eFibo トレーダー戦略

概要

Elite eFibo Trader は、移動平均クロスオーバーとオプションの RSI フィルターを監視しながら、注文の進行 Fibonacci を開く平均化エキスパート アドバイザーを再現します。 StockSharp ポートは元のバスケット ロジックを保持します。市場エントリーにより、設定可能なピップ距離の間隔で保留中のストップ注文のスタックがトリガーされ、追加の約定ごとに Fibonacci シーケンスに従ってエクスポージャーが増加します。この戦略は、変動利益が現金目標に達すると、またはトレンドフィルターが現在のエクスポージャーに反した場合に、バスケットを自動的にフラット化します。

市場データ

  • 単一の構成可能なローソク足タイプをサブスクライブします (デフォルト: 15 分のローソク足)。
  • 指標値のローソク足終値を使用し、トレーリング/ストップ条件を評価します。

エントリーロジック

  1. 方向は、移動平均クロスオーバー (デフォルトで有効) または手動の ManualOpenBuy/ManualOpenSell 切り替えによって決定されます。
  2. MA ロジックがアクティブな場合、強気のクロスオーバー (slow を上回る fast) アームがバスケットを買い、弱気のクロスオーバー アームがバスケットを売ります。ローソクごとに 1 つのシグナルが適用されます。
  3. RSI フィルタが有効な場合、長いバスケットには RSI > RsiHigh が必要ですが、短いバスケットには RSI < RsiLow が必要です。
  4. 新しいラダーは、ストラテジーからのアクティブな注文またはポジションがなく、取引が許可されている場合にのみ開かれます (TradeAgainAfterProfit)。
  5. 最初のレベルは成行注文でオープンされ、残りのレベルは LevelDistancePips で相殺される逆指値注文として送信されます。音量は Fibonacci の順序に従い、レベルごとに調整できます。

終了ロジック

  • 各満たされたレベルは、StopLossPips から計算された初期ストップを受け取り、MA ロジックが逆クロスオーバーを検出したときにトレーリング更新に参加します。
  • ストップは長いバスケットの場合は close - TrailingStopPips、短いバスケットの場合は close + TrailingStopPips まで追跡され、現在のストップよりも遠くに移動することはありません。
  • 価格が(ローソク足の高値/安値に基づく)ストップレベルに達すると、この戦略はそのレベルの残りのボリュームを成行注文でクローズします。
  • バスケットの変動利益(商品 PriceStep および StepPrice から計算)が MoneyTakeProfit に達すると、すべてのポジションがクローズされ、保留中の注文がキャンセルされます。
  • バスケットがフラットになると、保留中のストップ注文は自動的にキャンセルされます。 TradeAgainAfterProfitfalse の場合、戦略はリセットされるまでアイドル状態のままです。

パラメーター

名前 説明
UseMaLogic 取引の方向を設定する移動平均クロスオーバー ロジックを有効または無効にします。
MaSlowPeriod, MaFastPeriod 遅い SMA と速い SMA の期間。
TrailingStopPips トレンドフィルターが不利になったときに保護トレーリングストップによって使用されるピップ距離。
UseRsiFilter, RsiPeriod, RsiHigh, RsiLow RSI フィルター構成。このフィルタでは、RsiHigh を超えるロングと RsiLow を下回るショートが許可されます。
ManualOpenBuy, ManualOpenSell MA ロジックが無効な場合に使用される手動切り替え。
TradeAgainAfterProfit マネーテイクプロフィットに達したら取引を再開します。
LevelDistancePips 連続する未決注文間の距離 (ピップ単位)。
StopLossPips 各レベルの初期停止オフセット。
MoneyTakeProfit バスケットの未決済損益に基づいて評価される現金利益目標。
Level1VolumeLevel14Volume 各 Fibonacci レベルの音量。レベルを無効にするには、ゼロに設定します。
CandleType インジケーターに使用されるタイムフレーム/データタイプ。

実装メモ

  • ピップ距離は、証券に小数点以下 3 桁または 5 桁がある場合、商品 PriceStep に 10 を乗じて、MetaTrader スタイルのポイントから変換されます。これは、5 桁の為替相場に対する元の MyPoint 調整を反映しています。
  • 各レベルは個別に追跡されます。この戦略はエントリー価格、残りの出来高、ストップレベルを保存するため、部分約定と個別のストップアウトは MQL のエキスパートと同じ方法で処理されます。
  • 変動利益は、PriceStepStepPrice から計算されます。これらの商品プロパティが設定されていることを確認してください。設定されていないと、マネーテイクプロフィットが正しくトリガーされません。
  • StartProtection() は起動時に 1 回呼び出され、StockSharp 戦略基本クラスからの組み込みの安全性チェックが有効になります。
  • 開いているボリュームがなくなると、CancelAllPendingOrders() が自動的に呼び出され、元のスクリプトから繰り返される subCloseAllPending() 呼び出しが複製されます。

使い方のヒント

  • PriceStepStepPriceVolumeStep のブローカー設定と最小ロット サイズを確認して、Fibonacci の数量が有効な注文に変換されることを確認します。
  • この戦略はローソク足のデータに依存しています。選択した時間枠が意図した MetaTrader チャートの期間と一致していることを確認してください。
  • 最初にデモ フィードで戦略を実行することを検討してください。平均化システムでは、不利な傾向が見られるときに大量のエクスポージャが蓄積される可能性があります。
  • 元の EA 入力で使用されている手動バイアスを再現するには、UseMaLogic を無効にします。または、自動トレンド検出のために有効のままにします。
using System;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// Elite eFibo Trader: MA crossover with RSI filter and grid averaging.
/// Adds to winning positions on pullbacks using Fibonacci-style scaling.
/// </summary>
public class EliteEfiboTraderStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _fastLength;
	private readonly StrategyParam<int> _slowLength;
	private readonly StrategyParam<int> _rsiLength;
	private readonly StrategyParam<int> _atrLength;

	private decimal _prevFast;
	private decimal _prevSlow;
	private decimal _entryPrice;
	private int _addCount;

	public EliteEfiboTraderStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(8).TimeFrame())
			.SetDisplay("Candle Type", "Timeframe.", "General");

		_fastLength = Param(nameof(FastLength), 10)
			.SetDisplay("Fast MA", "Fast SMA period.", "Indicators");

		_slowLength = Param(nameof(SlowLength), 30)
			.SetDisplay("Slow MA", "Slow SMA period.", "Indicators");

		_rsiLength = Param(nameof(RsiLength), 14)
			.SetDisplay("RSI Length", "RSI filter period.", "Indicators");

		_atrLength = Param(nameof(AtrLength), 14)
			.SetDisplay("ATR Length", "ATR period.", "Indicators");
	}

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

	public int FastLength
	{
		get => _fastLength.Value;
		set => _fastLength.Value = value;
	}

	public int SlowLength
	{
		get => _slowLength.Value;
		set => _slowLength.Value = value;
	}

	public int RsiLength
	{
		get => _rsiLength.Value;
		set => _rsiLength.Value = value;
	}

	public int AtrLength
	{
		get => _atrLength.Value;
		set => _atrLength.Value = value;
	}

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

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;
	}

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

		_prevFast = 0;
		_prevSlow = 0;
		_entryPrice = 0;
		_addCount = 0;

		var fast = new SimpleMovingAverage { Length = FastLength };
		var slow = new SimpleMovingAverage { Length = SlowLength };
		var rsi = new RelativeStrengthIndex { Length = RsiLength };
		var atr = new AverageTrueRange { Length = AtrLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(fast, slow, rsi, atr, ProcessCandle)
			.Start();

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

	private void ProcessCandle(ICandleMessage candle, decimal fastVal, decimal slowVal, decimal rsiVal, decimal atrVal)
	{
		if (candle.State != CandleStates.Finished)
			return;

		if (_prevFast == 0 || _prevSlow == 0 || atrVal <= 0)
		{
			_prevFast = fastVal;
			_prevSlow = slowVal;
			return;
		}

		var close = candle.ClosePrice;

		// Position management
		if (Position > 0)
		{
			// Take profit or stop
			if (close >= _entryPrice + atrVal * 3m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close <= _entryPrice - atrVal * 2m)
			{
				SellMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close <= _entryPrice - atrVal * 0.8m && rsiVal < 40)
			{
				// Fibonacci add: buy more on pullback
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				BuyMarket();
			}
		}
		else if (Position < 0)
		{
			if (close <= _entryPrice - atrVal * 3m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (close >= _entryPrice + atrVal * 2m)
			{
				BuyMarket();
				_entryPrice = 0;
				_addCount = 0;
			}
			else if (_addCount < 2 && close >= _entryPrice + atrVal * 0.8m && rsiVal > 60)
			{
				_entryPrice = (_entryPrice + close) / 2m;
				_addCount++;
				SellMarket();
			}
		}

		// Entry: MA crossover with RSI confirmation
		if (Position == 0)
		{
			if (_prevFast <= _prevSlow && fastVal > slowVal && rsiVal > 50)
			{
				_entryPrice = close;
				_addCount = 0;
				BuyMarket();
			}
			else if (_prevFast >= _prevSlow && fastVal < slowVal && rsiVal < 50)
			{
				_entryPrice = close;
				_addCount = 0;
				SellMarket();
			}
		}

		_prevFast = fastVal;
		_prevSlow = slowVal;
	}
}