GitHub で見る
Up3x1 シフト SMA 戦略 (MT4 変換)
概要
MQL/8097 にある MetaTrader 4 エキスパートアドバイザー up3x1.mq4 の変換。
- 元のスクリプトとまったく同じように、チャートが正にシフトするトリプル単純移動平均クロスオーバーを実装します。
- 完了したローソク足のみを処理して、エキスパートにバーごとに 1 回の評価を強制する
Volume[0] > 1 ガードをエミュレートします。
- リスク管理機能には、テイクプロフィット、ストップロス、取引損失後の動的なロット削減、およびオプションのトレーリングストップが含まれます。
取引ロジック
- 指標
- 6 バーのチャートシフトを持つ 3 つの単純な移動平均 (デフォルトでは、高速 = 24、中 = 60、低速 = 120)。
- ロングエントリー
- 前のバー:
SMAfast₍t-1₎ < SMAmedium₍t-1₎ < SMAslow₍t-1₎。
- 現在の足:
SMAmedium₍t₎ < SMAfast₍t₎ < SMAslow₍t₎。
- 条件は MQL から
ma1 < ma2 < ma3 && ma5 < ma4 < ma6 を複製します。
- 短いエントリー
- 前のバー:
SMAfast₍t-1₎ > SMAmedium₍t-1₎ > SMAslow₍t-1₎。
- 現在の足:
SMAmedium₍t₎ > SMAfast₍t₎ > SMAslow₍t₎。
- 退出ルール
- テイクプロフィットとストップロスは、設定されたポイント距離に
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 抽象化との互換性を維持するために、検出された価格レベルでマーケット コマンドを使用して実行されます。
- すべてのインライン コメントは、プロジェクト ガイドラインに従って英語で書かれています。
使用法
- StockSharp デザイナーまたはコードで戦略を証券とポートフォリオに添付します。
- MT4 のタイムフレーム (デフォルトでは H1) に一致するローソク足シリーズ (
CandleType) を選択します。
- ポイントベースのリスクパラメータを確認して、商品のティックサイズ(たとえば、ほとんどの外国為替ペアでは0.0001)に合わせます。
- 末尾が不要な場合は、
TrailingStopPoints をゼロに設定します。
- 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;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import SimpleMovingAverage
from StockSharp.Algo.Strategies import Strategy
from datatype_extensions import *
from indicator_extensions import *
class up_3x1_shifted_sma_strategy(Strategy):
"""Simple SMA crossover (fast/slow) with cooldown between trades."""
def __init__(self):
super(up_3x1_shifted_sma_strategy, self).__init__()
self._fast_period = self.Param("FastPeriod", 8).SetDisplay("Fast SMA", "Fast SMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 24).SetDisplay("Slow SMA", "Slow SMA period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(15))).SetDisplay("Candle Type", "Timeframe", "General")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(up_3x1_shifted_sma_strategy, self).OnReseted()
self._prev_fast = 0
self._prev_slow = 0
self._has_prev = False
self._cooldown = 0
def OnStarted2(self, time):
super(up_3x1_shifted_sma_strategy, self).OnStarted2(time)
self._prev_fast = 0
self._prev_slow = 0
self._has_prev = False
self._cooldown = 0
fast = SimpleMovingAverage()
fast.Length = self._fast_period.Value
slow = SimpleMovingAverage()
slow.Length = self._slow_period.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(fast, slow, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, fast)
self.DrawIndicator(area, slow)
self.DrawOwnTrades(area)
def OnProcess(self, candle, fast_val, slow_val):
if candle.State != CandleStates.Finished:
return
if not self.IsFormedAndOnlineAndAllowTrading():
return
fv = float(fast_val)
sv = float(slow_val)
if not self._has_prev:
self._prev_fast = fv
self._prev_slow = sv
self._has_prev = True
return
if self._cooldown > 0:
self._cooldown -= 1
self._prev_fast = fv
self._prev_slow = sv
return
if self._prev_fast <= self._prev_slow and fv > sv and self.Position <= 0:
volume = self.Volume + abs(self.Position)
self.BuyMarket(volume)
self._cooldown = 2
elif self._prev_fast >= self._prev_slow and fv < sv and self.Position >= 0:
volume = self.Volume + abs(self.Position)
self.SellMarket(volume)
self._cooldown = 2
self._prev_fast = fv
self._prev_slow = sv
def CreateClone(self):
return up_3x1_shifted_sma_strategy()