GitHub で見る
Alexav D1 利益 GBPUSD 戦略
概要
Alexav D1 Profit GBPUSD は、MetaTrader 4 Expert Advisor Alexav_d1_profit_gbpusd.mq4 から変換された日次ブレイクアウト システムです。この戦略は GBP/USD の毎日のローソク足で動作し、完了したセッションを 1 日 1 回 (火曜日から金曜日まで) 評価します。モメンタムの確認は RSI と MACD によって提供され、ボラティリティ調整されたストップと段階的な利益目標は ATR から得られます。
取引ロジック
- インジケーターの準備
- 同じ期間の 2 つの EMA が毎日の高値と安値に適用され、強気と弱気の基準レベルが定義されます。
- 10 期間のルックバックを使用した RSI は勢いを測定します。 RSI の測定値が極端に高いと、その方向への新規取引が一時的にブロックされます。
- MACD (5/24/14) は、最後の 2 つのヒストグラム値を比較することによって加速フィルターを提供します。
- ATR (28) は、ストップと利益目標に使用されるボラティリティ単位を提供します。
- セッションフィルター
- 火曜日から金曜日までの完了した日次キャンドルごとに 1 つの評価のみが実行されます。月曜日と週末は省略されます。
- 長いセットアップ
- 前回の日次ローソク足は、2 セッション前に計算された高値の EMA を上回って終了する必要があります。
- 前のセッションの RSI は、上限レベル (デフォルト 60) を超え、上限 (デフォルト 80) を下回っている必要があります。
- MACD は、2 セッション前にゼロ未満になっているか、前の値と比較して十分な正の加速度を示している必要があります。
- 前回の始値が高値の EMA を下回った場合、この戦略ではブロックがリセットされた後に新しいバッチの購入が可能になります。
- 簡単なセットアップ
- EMA の低値、RSI の下限しきい値 (39 / 25)、および MACD フィルターを使用した、長いセットアップのミラー ロジック。
注文管理
設定が確認されると、戦略は 4 つの成行注文のバッチを開始します (それぞれ戦略 Volume を使用します)。
- ストップ: 各注文は、エントリー価格から
ATR * AtrStopMultiplier (デフォルト 1.6) 離れた同じ保護ストップを共有します。
- 目標: 利益目標は、
[0..3] の注文インデックス i に対して AtrTargetMultiplier * (1 + i / 2) ずつスケールされ、元の EA の 1.0、1.5、2.0、および 2.5 ATR オフセットを複製します。
- 競合処理: 新しいバッチを開く前に、反対のポジションがフラット化されます。長いバッチをトリガーすると、保留中の短いバッチがクリアされます (逆も同様)。
この戦略は完成したキャンドルを監視します。毎日の安値がストップに接触した場合、対応するロング注文は市場でクローズされます。高値が目標に達した場合、注文もクローズされます。ショートはストップのローソク高値とターゲットの安値を使用して対称的に処理されます。
パラメーター
| パラメータ |
説明 |
デフォルト |
CandleType |
プライマリーキャンドルシリーズ、デフォルトで毎日。 |
1日 |
MaPeriod |
高値/安値に適用される EMA の期間。 |
6 |
RsiPeriod |
運動量フィルターの RSI 期間。 |
10 |
AtrPeriod |
ストップ/ターゲットのサイジングの期間は ATR です。 |
28 |
AtrStopMultiplier |
停留所の場合は ATR 倍です。 |
1.6 |
AtrTargetMultiplier |
ターゲットの基本 ATR 倍数。 |
1.0 |
RsiUpperLevel |
RSI のしきい値は強気の勢いを裏付けています。 |
60 |
RsiUpperLimit |
新しいロングをブロックする RSI キャップ。 |
80 |
RsiLowerLevel |
RSI のしきい値は弱気の勢いを裏付けています。 |
39 |
RsiLowerLimit |
新しいショーツをブロックする RSI 階。 |
25 |
FastMaPeriod |
MACD の高速 EMA 期間。 |
5 |
SlowMaPeriod |
MACDのEMA期間が遅いです。 |
24 |
SignalMaPeriod |
MACD の EMA 期間を信号で知らせます。 |
14 |
MacdDiffBuy |
ロングの最小加速度は MACD です。 |
0.5 |
MacdDiffSell |
ショートパンツの最小加速度は MACD です。 |
0.15 |
戦略を開始する前に、戦略 Volume を注文ごとに希望のロットサイズに設定します。
注意事項
- 変換では、元の Expert Advisor にある 1 日あたり 1 回の評価ロジックが維持されます。
- 意図した動作を再現するためにバックテストを行う場合は、GBP/USD の日次履歴データを使用します。
- 保護的なストップとターゲットは、完成したローソク足の極値を使用してシミュレートされます。日次ローソク足内の日中のスパイクは戦略には表示されません。
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Alexav D1 Profit breakout strategy.
/// Buys when price breaks above EMA and RSI is rising.
/// Sells when price breaks below EMA and RSI is falling.
/// </summary>
public class AlexavD1ProfitGbpUsdBreakoutStrategy : Strategy
{
private readonly StrategyParam<int> _emaPeriod;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<DataType> _candleType;
private decimal _prevClose;
private decimal _prevEma;
private decimal _prevRsi;
private bool _hasPrev;
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public AlexavD1ProfitGbpUsdBreakoutStrategy()
{
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetDisplay("EMA Period", "EMA period", "Indicators");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetDisplay("RSI Period", "RSI period", "Indicators");
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
}
/// <inheritdoc />
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0m;
_prevEma = 0m;
_prevRsi = 0m;
_hasPrev = false;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(ema, rsi, ProcessCandle)
.Start();
}
private void ProcessCandle(ICandleMessage candle, decimal emaValue, decimal rsiValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
if (!_hasPrev)
{
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
_hasPrev = true;
return;
}
// Breakout above EMA with rising RSI
if (_prevClose <= _prevEma && close > emaValue && rsiValue > _prevRsi && Position <= 0)
{
if (Position < 0)
BuyMarket();
BuyMarket();
}
// Breakout below EMA with falling RSI
else if (_prevClose >= _prevEma && close < emaValue && rsiValue < _prevRsi && Position >= 0)
{
if (Position > 0)
SellMarket();
SellMarket();
}
_prevClose = close;
_prevEma = emaValue;
_prevRsi = rsiValue;
}
}
import clr
clr.AddReference("StockSharp.Messages")
clr.AddReference("StockSharp.Algo")
clr.AddReference("StockSharp.Algo.Indicators")
clr.AddReference("StockSharp.Algo.Strategies")
from System import TimeSpan, Math
from StockSharp.Messages import DataType, CandleStates
from StockSharp.Algo.Indicators import ExponentialMovingAverage, RelativeStrengthIndex
from StockSharp.Algo.Strategies import Strategy
class alexav_d1_profit_gbp_usd_breakout_strategy(Strategy):
"""Alexav D1 Profit breakout strategy.
Buys when price breaks above EMA and RSI is rising.
Sells when price breaks below EMA and RSI is falling."""
def __init__(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).__init__()
self._ema_period = self.Param("EmaPeriod", 20) \
.SetDisplay("EMA Period", "EMA period", "Indicators")
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candle timeframe", "General")
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@CandleType.setter
def CandleType(self, value):
self._candle_type.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@property
def RsiPeriod(self):
return self._rsi_period.Value
def OnReseted(self):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_ema = 0.0
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alexav_d1_profit_gbp_usd_breakout_strategy, self).OnStarted2(time)
self._has_prev = False
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema, rsi, self._process_candle).Start()
def _process_candle(self, candle, ema_value, rsi_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
ema_val = float(ema_value)
rsi_val = float(rsi_value)
if not self._has_prev:
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
self._has_prev = True
return
# Breakout above EMA with rising RSI
if self._prev_close <= self._prev_ema and close > ema_val and rsi_val > self._prev_rsi and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
self.BuyMarket()
# Breakout below EMA with falling RSI
elif self._prev_close >= self._prev_ema and close < ema_val and rsi_val < self._prev_rsi and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
self.SellMarket()
self._prev_close = close
self._prev_ema = ema_val
self._prev_rsi = rsi_val
def CreateClone(self):
return alexav_d1_profit_gbp_usd_breakout_strategy()