GitHub で見る

Caudate X 期間 キャンドル TM Plus 戦略

概要

この戦略はCaudate X Period Candle TM Plusエキスパートアドバイザーのロジックを複製します。設定可能な移動平均でキャンドルの始値、高値、安値、終値をスムージングし、Donchianスタイルのレンジを構築して、レンジ内のボディの位置に応じて各完成キャンドルを6つの色コードのいずれかに分類します。ロングエントリーは強気の下ヒゲ色(0または1)によって引き起こされ、ショートエントリーは弱気の上ヒゲ色(5または6)によって引き起こされます。反対の色グループは既存のポジションを決済するために使用されます。

トレーディングルール

  1. 選択されたキャンドルシリーズにサブスクライブし、選択した移動平均で各コンポーネントをスムージング。
  2. 指定されたDonchian Periodでスムージングされた高値と安値の最高値と最低値を計算し、スムージングされた始値と終値を常に含むようにレンジを拡張。
  3. キャンドルの色を決定する:
    • 0/1 – ボディがレンジ上部付近(下ヒゲ)。
    • 2/4 – ボディがレンジ内に中央。
    • 5/6 – ボディがレンジ下部付近(上ヒゲ)。
  4. Signal Barでオフセットされたバーの色を評価(デフォルト1は前の完成キャンドルを使用)。
  5. 色がエントリーグループに属し、反対のポジションがアクティブでない場合にポジションを開く。
  6. 色がエグジットグループに属するか最大保有時間が経過するとポジションを閉じる。
  7. オプションのストップロスとテイクプロフィットのオフセットは組み込みの保護モジュールで設定。

パラメーター

パラメーター 説明
Candle Type シグナル計算に使用される時間軸。
Donchian Period スムージングされた高値/安値レンジのキャンドル数。
Signal Bar シグナル評価を遅らせるバー数(0 = 現在のバー)。
Smoothing Method OHLCの価格に適用される移動平均(SMA、EMA、SMMA、LWMA、Jurik JJMA近似、Kaufman AMA)。
MA Length スムージングフィルターの長さ。
MA Phase JJMA互換性のために予約(StockSharpの平均では使用されない)。
Enable Long/Short Entries 新規ロングまたはショートポジションの開設を切り替える。
Enable Long/Short Exits シグナル時の既存ロングまたはショートポジションの決済を切り替える。
Enable Time Exit 最大保有時間フィルターを有効化。
Time Exit (minutes) 強制決済前の保有期間。
Stop Loss (points) 価格ステップ単位のストップロス距離(Security.PriceStepで乗算)。
Take Profit (points) 価格ステップ単位のテイクプロフィット距離。

注記

  • Signal Bar = 1はMQL5エキスパートの動作に一致し、最後に完全に閉じたキャンドルで動作します。
  • ストップまたはターゲット距離がゼロより大きい場合、戦略はインストゥルメントの価格ステップに基づく絶対オフセットでStartProtectionを呼び出します。
  • MA Phaseは互換性のために保持されていますが、StockSharpの移動平均実装では消費されません。
  • 継承されたStrategy.Volumeプロパティを通じてベース注文サイズを設定します。実装は常に新しいポジションを開く前に反対のポジションを閉じます。
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>
/// Caudate X Period Candle TM Plus strategy (simplified). Detects candle body/tail
/// patterns using ATR-based filtering and EMA trend direction.
/// </summary>
public class CaudateXPeriodCandleTmPlusStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<int> _atrLength;
	private readonly StrategyParam<int> _emaLength;

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

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

	public int EmaLength
	{
		get => _emaLength.Value;
		set => _emaLength.Value = value;
	}

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

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

		_emaLength = Param(nameof(EmaLength), 20)
			.SetGreaterThanZero()
			.SetDisplay("EMA Length", "Trend EMA period", "Indicators");
	}

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

		var atr = new AverageTrueRange { Length = AtrLength };
		var ema = new ExponentialMovingAverage { Length = EmaLength };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(atr, ema, (ICandleMessage candle, decimal atrValue, decimal emaValue) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				if (atrValue <= 0)
					return;

				var close = candle.ClosePrice;
				var body = Math.Abs(close - candle.OpenPrice);

				// Strong body candle in the trend direction.
				if (body > atrValue * 0.75m)
				{
					if (close > candle.OpenPrice && close > emaValue && Position <= 0)
						BuyMarket();
					else if (close < candle.OpenPrice && close < emaValue && Position >= 0)
						SellMarket();
				}
			})
			.Start();

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