GitHub で見る

BykovTrend + ColorX2MA戦略

この戦略はBykovTrend V2カラートレンドインジケーターとColorX2MAの二重平滑化移動平均傾きフィルターを組み合わせます。両方のロジックブロックは同じシンボルで動作し、独立して注文を発行できるため、ネットポジションが2つのシグナルソース間の最新の合意を反映することができます。

概要

  • 市場バイアス: ローソク足データをサポートする任意のインストゥルメントで機能します。両方のブロックのデフォルト時間軸は4時間(H4)で、オリジナルのエキスパートアドバイザーを反映しています。
  • インジケーター:
    • BykovTrend V2: Williams %Rを使用して優勢なトレンドに応じてローソク足を色付けします。
    • ColorX2MA: 設定可能な価格ソースに2つの連続した移動平均を適用し、傾きの方向を分類します。
  • シグナル: エントリーとエグジットは各ブロックによって別々に生成されます。最終ポジションはすべての実行されたトレードの合計です。

BykovTrendブロック

  1. Williams %Rは設定された期間(デフォルト9)を使用して計算されます。
  2. しきい値は33 - Riskだけシフトされます。%Rが-Riskを上回ると、ローカルトレンドは強気になります;-100 + (33 - Risk)を下回ると、トレンドは弱気になります。
  3. ローソク足の色:
    • 緑/ティール(コード0、1):強気のトレンド。
    • グレー(コード2):ニュートラル、トレンド変化なし。
    • チョコレート/ゴールド(コード3、4):弱気のトレンド。
  4. シグナルは最後に閉じたバーからSignalBarステップ後ろのローソク足で評価されます。値1は前の完了したローソク足を意味し、MetaTraderの実装と一致します。
  5. 取引ロジック:
    • ロングエントリー: 現在の色 < 2(強気)で前の色 > 1(ニュートラル/弱気だった)。Bykov Allow Long Entriesでオプション。
    • ショートエグジット: 現在の色 < 2。Bykov Allow Short Exitsでオプション。
    • ショートエントリー: 現在の色 > 2(弱気)で前の色 < 3(ニュートラル/強気だった)。Bykov Allow Short Entriesでオプション。
    • ロングエグジット: 現在の色 > 2。Bykov Allow Long Exitsでオプション。

ColorX2MAブロック

  1. 最初の移動平均は選択された応用価格(デフォルトはクローズ)を選択したメソッドと長さで平滑化します。
  2. 2番目の移動平均は最初のMAの出力を再び設定可能なメソッドと長さで平滑化します。
  3. 第2の平滑化の傾きがカラーストリームを定義します:
    • 1(マゼンタ):前のローソク足から値が増加しました。
    • 2(バイオレット):値が減少しました。
    • 0(グレー):変更なし。
  4. シグナルは最後のクローズからSignalBarステップ後ろのローソク足で評価されます。
  5. 取引ロジック:
    • ロングエントリー: 現在の色 = 1で前の色 ≠ 1。Color Allow Long Entriesでオプション。
    • ショートエグジット: 現在の色 = 1。Color Allow Short Exitsでオプション。
    • ショートエントリー: 現在の色 = 2で前の色 ≠ 2。Color Allow Short Entriesでオプション。
    • ロングエグジット: 現在の色 = 2。Color Allow Long Exitsでオプション。

ポジション管理

  • 注文は成行注文です。方向を変える際、戦略は既存のポジションを中立化してVolumeのサイズの新しいポジションを確立するのに十分なコントラクトを買い/売ります。
  • 各ブロックは他のブロックがまだ現在の側を支持している場合でも出口を引き起こすことができます;正味の効果は2つのモジュール間の段階的な綱引きです。
  • 自動ストップロスまたはテイクプロフィットは適用されません。リスク管理は外部で処理するか、許可フラグを調整して行う必要があります。

パラメーター

パラメーター 説明
BykovTrend Candle BykovTrend計算のデータタイプ(時間軸)。
Williams %R Period Williams %Rのルックバック。
Risk Offset Williams %Rしきい値をシフトします(33 - Risk)。大きな値は強気しきい値を締め付け、弱気しきい値を緩めます。
Signal Bar BykovTrendの色に対して行動する前の遅延(完了したローソク足の数)。
Allow Long/Short Entries BykovTrend駆動のエントリーを有効または無効にします。
Allow Long/Short Exits BykovTrend駆動のエグジットを有効または無効にします。
ColorX2MA Candle ColorX2MAブロックのデータタイプ(時間軸)。
First/Second MA Method 各ステージの平滑化メソッド(SMA、EMA、SMMA、LWMA、Jurik)。
First/Second MA Length 各平滑化ステージの期間長。
First/Second MA Phase 元のEAから保持された互換性パラメーター;現在の実装は文書化のためにそれを保持しますが、Jurik平滑化はその内部デフォルトを使用します。
Applied Price ColorX2MAの価格ソース(クローズ、オープン、ハイ、ロー、中間値、典型的、加重、シンプル、四分の一、トレンドフォローバリエーション、DeMark)。
Color Signal Bar ColorX2MAの色に対して行動する前の遅延。
Allow Long/Short Entries/Exits ColorX2MA駆動のアクションを有効または無効にします。

注意事項と制限

  • StockSharpで利用可能な移動平均タイプのみがサポートされています。MetaTraderライブラリからのエキゾチックな平滑化(JurX、Parabolic、T3、VIDYA、AMA)は再現されません;SMA、EMA、SMMA、LWMA、またはJurikから選択します。
  • フェーズパラメーターは参照のために保持されていますが、組み込みのStockSharpインジケーターを変更しません。
  • 戦略はVolumeプロパティが設定されていることを前提とします;そうでなければエントリーは注文を出しません。
  • 両方のモジュールが独立して取引できるため、結果の注文フローはマジックナンバーでトレードを分離するMetaTraderインストールとは異なる場合があります。
using System;
using System.Collections.Generic;

using Ecng.Common;

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

namespace StockSharp.Samples.Strategies;

/// <summary>
/// BykovTrend + ColorX2MA strategy (simplified). Uses Williams %R for trend
/// detection combined with double EMA smoothing for entry confirmation.
/// </summary>
public class BykovTrendColorX2MaStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _emaFastLength;
	private readonly StrategyParam<int> _emaSlowLength;

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

	public int EmaFastLength
	{
		get => _emaFastLength.Value;
		set => _emaFastLength.Value = value;
	}

	public int EmaSlowLength
	{
		get => _emaSlowLength.Value;
		set => _emaSlowLength.Value = value;
	}

	public BykovTrendColorX2MaStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
			.SetDisplay("Candle Type", "Candles", "General");

		_emaFastLength = Param(nameof(EmaFastLength), 9)
			.SetGreaterThanZero()
			.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");

		_emaSlowLength = Param(nameof(EmaSlowLength), 21)
			.SetGreaterThanZero()
			.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");
	}

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

		var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
		var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };

		decimal prevFast = 0, prevSlow = 0;
		var hasPrev = false;

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!hasPrev)
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					hasPrev = true;
					return;
				}

				if (!IsFormedAndOnlineAndAllowTrading())
				{
					prevFast = fastVal;
					prevSlow = slowVal;
					return;
				}

				// EMA crossover with candle direction confirmation
				var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
				var bearishCross = prevFast >= prevSlow && fastVal < slowVal;

				var close = candle.ClosePrice;
				var open = candle.OpenPrice;

				if (bullishCross && close > open && Position <= 0)
					BuyMarket();
				else if (bearishCross && close < open && Position >= 0)
					SellMarket();

				prevFast = fastVal;
				prevSlow = slowVal;
			})
			.Start();

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