GitHub で見る
FiveMinutesScalpingEA v1.1 (StockSharp ポート)
概要
FiveMinutesScalpingEaV11Strategy は、MetaTrader 4 エキスパート アドバイザー 5MinutesScalpingEA v1.1 の変換です。この戦略は、複数期間のハル移動平均、モメンタム フィッシャー変換、ATR ブレイクアウト検出器、トレンド フィルターを組み合わせて 5 分足チャートの短期間の動きをスキャルピングするという元の概念を維持しています。この実装は、StockSharp の高レベル API に従い、インジケーター バインディングを持つローソク足サブスクリプションを使用して、エキスパート アドバイザーの動作を再現します。
この戦略は単一シンボル取引向けに設計されています。常に 1 つのネット ポジションのみが維持され、すべてのシグナルは完了したローソク足で評価されます。ろうそくの高値と安値を監視することにより、戦略内で保護命令がシミュレーションされます。
インジケータースタック
| コンポーネント |
StockSharp の実装 |
目的 |
i1 カスタム ハル MA |
HullMovingAverage ピリオド Period1 (デフォルトは 30) |
ハル移動平均の傾きから速いトレンドの方向を検出します。 |
i2 カスタム ハル MA |
HullMovingAverage ピリオド Period2 (デフォルトは 50) |
より広範なトレンドの方向性を確認します。両方のハル フィルターは、通常モードのエントリについて一致する必要があります。 |
i3 フィッシャーの勢い |
FisherTransform with period Period3 |
運動量発振器として機能します。正の値は長いセットアップを優先し、負の値は短いセットアップを優先します。 |
i4 ATR ブレイクアウト矢印 |
AverageTrueRange と期間 Period4 をローソク足比較と組み合わせた |
現在の高値/安値が前の 2 つの高値/安値を少なくとも 1 ATR 超える強いブレイクアウトを検索します。 |
i5 フィッシャー トレンド フィルター |
FisherTransform with period Period5 |
元の EA トレンド ヒストグラムと同様の、平滑化されたトレンド確認を提供します。 |
各インジケーターについて、戦略は履歴値を保存して、MQL4 IndicatorsShift パラメーターと一致する値 IndicatorShift ローソク足を読み取ることができるようにします。すべてのフィルターは、それぞれのパラメーターを使用して個別に無効にすることができます。
取引ロジック
- このストラテジーは、
CandleType によって定義されたローソク足シリーズ (デフォルト: 5 分足ローソク足) にサブスクライブします。
- 終了したキャンドルごとに、ハル、フィッシャー、ATR のインジケーターが更新されます。十分な履歴が利用可能な場合、戦略は
IndicatorShift バー先のローソク足を評価します。
- 通常モード (
SignalMode = Normal):
- 長いエントリでは、すべての有効なフィルターが強気の状態 (正のハル勾配、ゼロを上回るフィッシャーの勢い、ATR のブレイクアウト、ゼロを上回るトレンドのフィッシャー) を報告する必要があります。
- 短い エントリでは、すべての有効なフィルターが弱気条件 (負のハル傾き、ゼロ以下のフィッシャーの勢い、ATR のブレイクアウト下降、ゼロ以下のフィッシャーのトレンド) を報告する必要があります。
- リバース モード (
SignalMode = Reverse) は、単純に強気条件と弱気条件の解釈を入れ替えます。
- 新しい信号は内部の
_lastSignal フラグを反転します。 CloseOnSignal が有効な場合、反対のポジションは新しいエントリーが送信される直前にクローズされます。
- パラメータ
UseTimeFilter は、エントリを [StartHour, EndHour) 範囲に制限します (ラップアラウンド動作は MQL4 EA と同じです)。
リスク管理
StockSharp ポートは次の保護機能を実装しています。
- ストップロス / テイクプロフィット – 有効にすると、ストップ価格とターゲット価格がエントリー価格から一定の距離 (
StopLossPips、TakeProfitPips) に配置され、すべてのローソク足で監視されます。
- トレーリング ストップ –
UseTrailingStop が有効な場合、トレーリング アンカーが維持されます。価格が TrailingStepPips だけ進むと、現在の極値から TrailingStopPips 離れたままになるようにストップが移動します。
- 損益分岐点 –
UseBreakEven が有効で、価格が BreakEvenPips + BreakEvenAfterPips だけ変動した場合、ストップはエントリーから離れた BreakEvenPips まで狭まります。
- 単一ポジション – すべての決済は成行注文 (
SellMarket / BuyMarket) によって実行され、ネット ポジション全体が決済されます。
パラメーター
| 名前 |
デフォルト |
説明 |
CandleType |
M5 |
主な時間枠。 |
IndicatorShift |
1 |
フィルターを評価するときに振り返る閉じたローソク足の数。 |
SignalMode |
ノーマル |
正信号または逆信号を使用してください。 |
UseIndicator1..UseIndicator5 |
本当の |
各フィルターを切り替えます。 |
Period1, Period2, Period3, Period4, Period5 |
30、50、10、14、18 |
ハル、フィッシャー、および ATR の計算の期間。 |
PriceMode3 |
高低 |
元のフィッシャー価格選択の互換性パラメーター。 StockSharp 実装は、常にデフォルトのローソク足価格をフィッシャー インジケーターに供給します。 |
CloseOnSignal |
偽 |
新しいエントリーシグナルが現れたら、反対のポジションを閉じます。 |
UseTimeFilter, StartHour, EndHour |
偽、0、0 |
オプションの日中取引ウィンドウ。 |
UseTakeProfit, TakeProfitPips |
本当、10 |
利益管理をしましょう。 |
UseStopLoss, StopLossPips |
本当、10 |
ストップロス管理。 |
UseTrailingStop, TrailingStopPips, TrailingStepPips |
偽、1、1 |
トレーリングストップ管理。 |
UseBreakEven, BreakEvenPips, BreakEvenAfterPips |
偽、4、2 |
損益分岐点ストップロジック。 |
TradeVolume |
0.01 |
市場参入のボリューム。 |
オリジナルの EA との違い
- StockSharp 戦略は単一のネット ポジションで機能するため、バスケット クローズ ロジック (
UseBasketClose、CloseInProfit、CloseInLoss) は実装されていません。
- 自動ロットサイジング (
AutoLotSize / RiskFactor) とスプレッドチェックはこのポートの一部ではありません。ホスティング環境を使用して、ボリュームとスリッページを制御します。
- フィッシャー価格モード パラメータは互換性のために公開されていますが、現在、StockSharp
FisherTransform はデフォルトのローソク足価格を使用しています。必要に応じてインジケーターを拡張することで、他の価格モードをエミュレートできます。
- 取引管理は完了したローソク足で実行され、
IndicatorsShift >= 1 のときの EA の動作を反映します。
使い方のヒント
- この戦略をスプレッドが狭い流動性の高い商品に適用します (EA はもともと EUR/USD M5 用に設計されました)。
- アカウントのサイズ設定ルールに従って
TradeVolume を構成します。
- リスク許容度に合わせてインジケーターの期間を調整するか、フィルターを無効にします。
- 組み込みの時間フィルターと組み合わせて、流動性の低いセッションを回避します。
- ライブデータを実行する前に、必ず StockSharp テスターの設定を検証してください。
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// 5 Minutes Scalping EA V11 strategy: WMA crossover scalper.
/// Buys when fast WMA crosses above slow WMA. Sells on cross below.
/// </summary>
public class FiveMinutesScalpingEaV11Strategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _fastPeriod;
private readonly StrategyParam<int> _slowPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int FastPeriod
{
get => _fastPeriod.Value;
set => _fastPeriod.Value = value;
}
public int SlowPeriod
{
get => _slowPeriod.Value;
set => _slowPeriod.Value = value;
}
public FiveMinutesScalpingEaV11Strategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_fastPeriod = Param(nameof(FastPeriod), 6)
.SetGreaterThanZero()
.SetDisplay("Fast WMA", "Fast WMA period", "Indicators");
_slowPeriod = Param(nameof(SlowPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("Slow WMA", "Slow WMA period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var fast = new WeightedMovingAverage { Length = FastPeriod };
var slow = new WeightedMovingAverage { Length = SlowPeriod };
decimal? prevFast = null;
decimal? prevSlow = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(fast, slow, (candle, fastVal, slowVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevFast.HasValue && prevSlow.HasValue)
{
if (prevFast.Value <= prevSlow.Value && fastVal > slowVal && Position <= 0)
BuyMarket();
else if (prevFast.Value >= prevSlow.Value && fastVal < slowVal && Position >= 0)
SellMarket();
}
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, fast);
DrawIndicator(area, slow);
DrawOwnTrades(area);
}
}
}
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 WeightedMovingAverage
from StockSharp.Algo.Strategies import Strategy
class five_minutes_scalping_ea_v11_strategy(Strategy):
def __init__(self):
super(five_minutes_scalping_ea_v11_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._fast_period = self.Param("FastPeriod", 6) \
.SetGreaterThanZero() \
.SetDisplay("Fast WMA", "Fast WMA period", "Indicators")
self._slow_period = self.Param("SlowPeriod", 14) \
.SetGreaterThanZero() \
.SetDisplay("Slow WMA", "Slow WMA period", "Indicators")
self._prev_fast = None
self._prev_slow = None
@property
def candle_type(self):
return self._candle_type.Value
def OnReseted(self):
super(five_minutes_scalping_ea_v11_strategy, self).OnReseted()
self._prev_fast = None
self._prev_slow = None
def OnStarted2(self, time):
super(five_minutes_scalping_ea_v11_strategy, self).OnStarted2(time)
self._fast_ind = WeightedMovingAverage()
self._fast_ind.Length = self._fast_period.Value
self._slow_ind = WeightedMovingAverage()
self._slow_ind.Length = self._slow_period.Value
subscription = self.SubscribeCandles(self.candle_type)
subscription.Bind(self._fast_ind, self._slow_ind, self._process_candle).Start()
def _process_candle(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
if not self.IsFormedAndOnlineAndAllowTrading():
return
fast_val = float(fast_value)
slow_val = float(slow_value)
if self._prev_fast is not None and self._prev_slow is not None:
if self._prev_fast <= self._prev_slow and fast_val > slow_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fast_val < slow_val and self.Position >= 0:
self.SellMarket()
self._prev_fast = fast_val
self._prev_slow = slow_val
def CreateClone(self):
return five_minutes_scalping_ea_v11_strategy()