GitHub で見る

Up3x1 シフト SMA 戦略 (MT4 変換)

概要

  • MQL/8097 にある MetaTrader 4 エキスパートアドバイザー up3x1.mq4 の変換。
  • 元のスクリプトとまったく同じように、チャートが正にシフトするトリプル単純移動平均クロスオーバーを実装します。
  • 完了したローソク足のみを処理して、エキスパートにバーごとに 1 回の評価を強制する Volume[0] > 1 ガードをエミュレートします。
  • リスク管理機能には、テイクプロフィット、ストップロス、取引損失後の動的なロット削減、およびオプションのトレーリングストップが含まれます。

取引ロジック

  1. 指標
    • 6 バーのチャートシフトを持つ 3 つの単純な移動平均 (デフォルトでは、高速 = 24、中 = 60、低速 = 120)。
  2. ロングエントリー
    • 前のバー: SMAfast₍t-1₎ < SMAmedium₍t-1₎ < SMAslow₍t-1₎
    • 現在の足: SMAmedium₍t₎ < SMAfast₍t₎ < SMAslow₍t₎
    • 条件は MQL から ma1 < ma2 < ma3 && ma5 < ma4 < ma6 を複製します。
  3. 短いエントリー
    • 前のバー: SMAfast₍t-1₎ > SMAmedium₍t-1₎ > SMAslow₍t-1₎
    • 現在の足: SMAmedium₍t₎ > SMAfast₍t₎ > SMAslow₍t₎
  4. 退出ルール
    • テイクプロフィットとストップロスは、設定されたポイント距離に Security.PriceStep を乗算したものを考慮します (ステップが不明な場合は直接使用されます)。
    • トレーリングストップは、価格が TrailingStopPoints を超えて上昇すると利益をロックし、エントリー後に到達した極値を追跡します。
    • 移動平均が逆の順序に反転すると、フェールセーフ終了し、元の OrderClose ロジックが反映されます。

ポジションサイズ

  • ポートフォリオ指標が利用できない場合、デフォルトのボリュームは BaseVolume (0.1 ロット) に等しくなります。
  • Portfolio.CurrentValue が存在する場合、ストラテジーはそれに RiskFraction を乗算します (デフォルトは 0.00002、MQL の式 FreeMargin * 0.02 / 1000 と同等)。
  • 複数の終了が失敗すると、LotsOptimized ルーチンとまったく同様に、音量が volume * losses / 3 だけ減少します。
  • ボリュームは Security.VolumeStep に切り捨てられ、Security.MinVolume を満たせない場合はゼロに切り捨てられます。

パラメーター

パラメータ デフォルト 説明
FastPeriod 24 最も速くシフトされた SMA の長さ。
MediumPeriod 60 シフトされたメディアの長さ SMA。
SlowPeriod 120 スローシフトされた SMA の長さ。
TakeProfitPoints 150 エントリー価格とテイクプロフィットの間の価格ポイントの距離。
StopLossPoints 100 エントリー価格とストップロスの間の価格ポイントの距離。
TrailingStopPoints 100 オプションのトレーリング ストップ距離 (ポイント単位) (無効にするには 0 に設定します)。
BaseVolume 0.1 縮小後のフォールバック取引サイズと最小取引量。
RiskFraction 0.00002 ダイナミックボリュームの計算に使用されるポートフォリオ値の割合。
CandleType 1時間枠 インジケーターを供給するために使用されるキャンドル シリーズ。

変換メモ

  • この戦略では、高レベルの API (SubscribeCandles + Bind) を使用し、手動の履歴バッファーを回避します。
  • インジケーター値は、直接インデックスにアクセスせずに shift パラメーターを模倣するために呼び出しの間に保存されます。
  • 保護的出口は、StockSharp 抽象化との互換性を維持するために、検出された価格レベルでマーケット コマンドを使用して実行されます。
  • すべてのインライン コメントは、プロジェクト ガイドラインに従って英語で書かれています。

使用法

  1. StockSharp デザイナーまたはコードで戦略を証券とポートフォリオに添付します。
  2. MT4 のタイムフレーム (デフォルトでは H1) に一致するローソク足シリーズ (CandleType) を選択します。
  3. ポイントベースのリスクパラメータを確認して、商品のティックサイズ(たとえば、ほとんどの外国為替ペアでは0.0001)に合わせます。
  4. 末尾が不要な場合は、TrailingStopPoints をゼロに設定します。
  5. MQL の診断を反映する「Enter long」や「Exit short」などのメッセージのログを監視します。

リポジトリ構造

「」 API/3924/ §── CS/Up3x1ShiftedSmaStrategy.cs # C# ストラテジーを英語コメント付きで変換 §── README.md # 英語ドキュメント (このファイル) §── README_zh.md # 中国語翻訳 └── README_ru.md # ロシア語翻訳 「」

免責事項

取引には重大なリスクが伴います。この戦略は教育目的で提供されており、ライブ取引の前に過去のデータとシミュレートされたデータで検証する必要があります。

using System;

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

namespace StockSharp.Samples.Strategies;

public class Up3x1ShiftedSmaStrategy : Strategy
{
	private readonly StrategyParam<int> _fastPeriod;
	private readonly StrategyParam<int> _slowPeriod;
	private readonly StrategyParam<DataType> _candleType;

	private decimal _prevFast;
	private decimal _prevSlow;
	private bool _hasPrev;
	private int _cooldown;

	public int FastPeriod { get => _fastPeriod.Value; set => _fastPeriod.Value = value; }
	public int SlowPeriod { get => _slowPeriod.Value; set => _slowPeriod.Value = value; }
	public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }

	public Up3x1ShiftedSmaStrategy()
	{
		_fastPeriod = Param(nameof(FastPeriod), 8).SetDisplay("Fast WMA", "Fast WMA period", "Indicators");
		_slowPeriod = Param(nameof(SlowPeriod), 24).SetDisplay("Slow WMA", "Slow WMA period", "Indicators");
		_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(15).TimeFrame()).SetDisplay("Candle Type", "Candle timeframe", "General");
	}

	/// <inheritdoc />
	protected override void OnReseted()
	{
		base.OnReseted();
		_prevFast = default;
		_prevSlow = default;
		_hasPrev = default;
		_cooldown = default;
	}

	/// <inheritdoc />
	protected override void OnStarted2(DateTime time)
	{
		base.OnStarted2(time);
		_hasPrev = false;
		var fast = new SimpleMovingAverage { Length = FastPeriod };
		var slow = new SimpleMovingAverage { Length = SlowPeriod };
		var subscription = SubscribeCandles(CandleType);
		subscription.Bind(fast, slow, ProcessCandle).Start();
	}

	private void ProcessCandle(ICandleMessage candle, decimal fast, decimal slow)
	{
		if (candle.State != CandleStates.Finished) return;
		if (!IsFormedAndOnlineAndAllowTrading()) return;

		if (!_hasPrev) { _prevFast = fast; _prevSlow = slow; _hasPrev = true; return; }
		if (_cooldown > 0)
		{
			_cooldown--;
			_prevFast = fast;
			_prevSlow = slow;
			return;
		}

		if (_prevFast <= _prevSlow && fast > slow && Position <= 0)
		{
			var volume = Volume + Math.Abs(Position);
			BuyMarket(volume);
			_cooldown = 2;
		}
		else if (_prevFast >= _prevSlow && fast < slow && Position >= 0)
		{
			var volume = Volume + Math.Abs(Position);
			SellMarket(volume);
			_cooldown = 2;
		}

		_prevFast = fast; _prevSlow = slow;
	}
}