GitHub で見る

エキスパートキャンドル戦略

概要

エキスパート キャンドル戦略は、MetaTrader 5 Expert_Candles エキスパート アドバイザーの StockSharp 移植です。一番監視してるのは 細長い影を特徴とするローソク足反転形成の最近の価格行動。強気または弱気の複合材料が出るたびに ローソク足が検出されると、戦略はそれぞれの方向にポジションをオープンし、オプションで、ローソク足と同じ資金管理を適用します。 オリジナルの EA。

実装は高レベルの StockSharp API に従います。ローソク足のサブスクリプションは、複合バーを構築するために使用されます。 命令と保護レベルは戦略から直接管理されます。

取引ロジック

  1. ローソク足が閉じるたびに、戦略はコンポジットの高さ全体になるまで、最大 Range 個前のローソク足とマージします。 バーが MinimumPoints を超えています (商品のピップサイズを使用して価格ポイントに変換)。
  2. 強気シグナルは、複合バーに浅い上影(ShadowSmall)と深い下影がある場合に発行されます。 (ShadowBig)。 弱気シグナルは、下ヒゲが浅く上ヒゲが優勢な場合に発行されます。
  3. エントリー価格はローソク足から LimitFactor * rangeSize 近く離れています。正の値は元の制限をエミュレートします ローソク足の範囲内にある注文。
  4. ストップロスとテイクプロフィットのターゲットは、複合高さの StopLossFactor および TakeProfitFactor 倍に位置します。 後続のローソク足でいずれかのレベルに達した場合、ポジションは直ちに閉じられます。
  5. シグナルは、ExpirationBars 個の完了したキャンドルに対して有効であるとみなされます。タイムウィンドウが経過すると、戦略は新しい戦略を待ちます。 新たな注文を送信する前に形成してください。
  6. 反対のシグナルは、新しい方向で取引を開始する前に既存のポジションをクローズし、MQL5 の動作を模倣します。

お金の管理

  • FixedVolume はデフォルトの注文サイズとして使用されます。
  • ストップロスが利用可能で、RiskPercent がゼロより大きい場合、戦略は選択された割合のリスクを負います。 ポートフォリオの資本。停止距離は、Security.PriceStepSecurity.StepPrice を使用して金額に変換されます。
  • 取引所がそのメタデータを公開すると、出来高は商品 VolumeStep に丸められます。

パラメーター

パラメータ デフォルト 説明
CandleType H1 キャンドルをリクエストするために使用される時間枠。
Range 3 複合パターンに結合される隣接するキャンドルの最大数。
MinimumPoints 50 パターンを評価するために必要なポイント単位の最小合成高さ (PriceStep ベース)。
ShadowBig 0.5 反転を確認するためにドミナントシャドウが超える必要がある比率。
ShadowSmall 0.2 反対側のシャドウに許可される最大比率。
LimitFactor 0.0 複合高さの一部としてのエントリーオフセット (正の値はローソク足内の価格をシフトします)。
StopLossFactor 2.0 合成高さの倍数としてのストップロス距離。保護停止を無効にするには、ゼロに設定します。
TakeProfitFactor 1.0 合成高さの倍数としてのテイクプロフィット距離。ターゲットを無効にするには、0 に設定します。
ExpirationBars 4 シグナルがアクティブである間に完了したキャンドルの数。
FixedVolume 0.1 リスクベースのサイジングを計算できない場合に使用されるフォールバック注文サイズ。
RiskPercent 10 ストップロスが利用可能な場合に、取引ごとにリスクが生じる株式の割合。

使用上の注意

  • この戦略は、Security.PriceStepSecurity.StepPrice、および Security.VolumeStep を利用して MetaTrader ポイントを複製します 計算。正確な機器メタデータを提供するか、それに応じてパラメータを調整します。
  • シグナルは閉じたローソク足でのみ評価されます。 CandleStates.Finished を出力する時系列コネクタに戦略を接続します。 信頼性の高い実行のためのイベント。
  • 完成したローソク足の高値または安値が計算された基準に違反するとすぐにポジションを閉じることで、保護的出口がシミュレートされます。 ストップロスまたはテイクプロフィットレベル。
  • メモリ使用量を予測可能に保つために、複合ローソク足リストは 500 項目に制限されています。

MetaTrader バージョンとの違い

  • StockSharp ポートは保留中の指値注文の代わりに成行注文を使用します。エントリ オフセットは、次の制限動作を再現します。 ローソク足の終値に対して約定価格をシフトします。
  • 資金管理はオプションです。 RiskPercent をゼロに設定すると、元の EA の固定ロット動作が復元されます。
  • ストップロスとテイクプロフィットの処理は、外部のトレーリングモジュールではなく、ストラテジー内で実行されます。
namespace StockSharp.Samples.Strategies;

using System;

using Ecng.Common;

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

/// <summary>
/// Candlestick reversal strategy: detects hammer/shooting star patterns.
/// Buys on bullish hammer candle, sells on bearish shooting star.
/// </summary>
public class ExpertCandlesStrategy : Strategy
{
	private readonly StrategyParam<DataType> _candleType;
	private readonly StrategyParam<decimal> _shadowRatio;

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

	public decimal ShadowRatio
	{
		get => _shadowRatio.Value;
		set => _shadowRatio.Value = value;
	}

	public ExpertCandlesStrategy()
	{
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
			.SetDisplay("Candle Type", "Candle timeframe", "General");

		_shadowRatio = Param(nameof(ShadowRatio), 0.3m)
			.SetGreaterThanZero()
			.SetDisplay("Shadow Ratio", "Min shadow to body ratio for pattern", "Signals");
	}

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

		var sma = new SimpleMovingAverage { Length = 20 };

		var subscription = SubscribeCandles(CandleType);
		subscription
			.Bind(sma, (candle, smaVal) =>
			{
				if (candle.State != CandleStates.Finished)
					return;

				if (!IsFormedAndOnlineAndAllowTrading())
					return;

				var open = candle.OpenPrice;
				var high = candle.HighPrice;
				var low = candle.LowPrice;
				var close = candle.ClosePrice;
				var range = high - low;

				if (range <= 0)
					return;

				var body = Math.Abs(close - open);
				var upperShadow = high - Math.Max(open, close);
				var lowerShadow = Math.Min(open, close) - low;

				var isHammer = lowerShadow > range * ShadowRatio && upperShadow < body;
				var isShootingStar = upperShadow > range * ShadowRatio && lowerShadow < body;

				if (isHammer && close > smaVal && Position <= 0)
					BuyMarket();
				else if (isShootingStar && close < smaVal && Position >= 0)
					SellMarket();
			})
			.Start();

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