GitHub で見る
Alexav D1 Profit GBPUSD戦略
高値に対して計算されたEMA、RSIフィルター、MACDモメンタム確認、ATRベースのリスク管理を組み合わせたGBPUSDの日足ブレイクアウトシステム。スクリプトはオリジナルのMetaTraderバージョンの4段階の利益確定と損益分岐点動作を再現します。
主要事実
- 市場: GBP/USD スポットまたはCFD
- 時間軸: 日足ローソク足(設定可能)
- 方向: ロングとショート
- ポジションスタイル: 共有ストップロスを持つマルチターゲットスケーリング
- 使用インストゥルメント: EMA (High)、RSI、MACDメインライン、ATR
インジケーター設定
- 高値のEMA – デフォルト長6、動的ブレイクアウトレベルを近似します。
- RSI – デフォルト長10、モメンタムフィルターとして使用される買われすぎ/売られすぎのコリドーを定義します。
- MACDメインライン – 速い5、遅い21、シグナル14。モメンタムの傾きを測定するためにメインラインのみが使用されます。
- ATR – 長28、ボラティリティに依存するストップとターゲットを提供します。
エントリーロジック
ロングエントリー
- 前の日足バーはEMA (High)を下回って開き、その上で閉じます(上昇クロス確認)。
- RSIは60と80の間に留まります – 弱いモメンタム時のトレードを防ぎ、過度に伸びたラリーを避けます。
- MACDメインラインは2つのモメンタムチェックのうちの1つを満たします:
- 2バー前の値が負(トレンドが最近プラスに転じたことを示す)、または
- 最後の2バーの間の絶対MACD相対削減が設定可能なMacdDiffBuyしきい値(デフォルト0.5)を超える。
すべての条件が満たされると、4つの等しい成行買い注文が発注されます(デフォルト各0.1ロット)。新しいバッチが送られる前に、既存のショートエクスポージャーはフラット化されます。
ショートエントリー
- バーはEMA (High)を上回って開き、その下で閉じます。
- RSIは25と39の間にあります – ロング側のしきい値を反映します。
- 2バー前のMACDがプラス、または最後の2バーの間の絶対MACDの相対変化がMacdDiffSell(デフォルト0.15)を上回ります。
確認時、戦略は既存のロングをフラット化してから4つの等しい成行売りを送ります。
トレード管理
- 初期ストップ: エントリークローズから計算された共有ATRストップ。ロングは
entry - ATR * StopLossMultiplier(デフォルト1.6)を使用します。ショートはentry + ATR * StopLossMultiplierを使用します。
- 利益ターゲット: 方向ごとに4つのインクリメンタルATRベースのレベル:
TakeProfitMultiplierパラメーター(デフォルト1)でスケールされた1.0、1.5、2.0、2.5 ATR倍数。各レベルは価格がレベルを通過したときに成行注文で元のポジションの4分の1をクローズします。
- 損益分岐点動作: 各部分出口後、残りのポジションの保護ストップが最新のターゲット価格に移動されます。これはTPトレードが発生するたびにストップロスをフィルされたテイクプロフィット価格に変更するオリジナルEAを模倣します。
- ストップ処理: 価格が保護レベルにイントラバーで触れた場合(ローソク足の高値/安値を使用)、残りのポジションは即座に成行でクローズされます。
リスク管理の注意事項
- 戦略は4エントリーバッチを超えてピラミッドしません。同じ方向にエクスポージャーが残っている間、新しいシグナルは無視されます。
- ATRは正でなければなりません;ボラティリティインジケーターがまだ形成されていない場合、シグナルはスキップされます。
- ランタイムでのパラメーター変更は将来の注文のみに影響します;注文ごとのボリュームはエントリー時に出口での正しいスケーリングのために取得されます。
パラメーター
| 名前 |
説明 |
デフォルト |
OrderVolume |
バッチ内の個別成行注文ごとのボリューム |
0.1 |
EmaPeriod |
ローソク足の高値に適用されるEMA長 |
6 |
RsiPeriod |
RSI平均期間 |
10 |
AtrPeriod |
ATR平均期間 |
28 |
StopLossMultiplier |
保護ストップのATR倍数 |
1.6 |
TakeProfitMultiplier |
利益ターゲットの基本ATR倍数 |
1.0 |
MacdFastPeriod |
MACD速いEMA長 |
5 |
MacdSlowPeriod |
MACD遅いEMA長 |
21 |
MacdSignalPeriod |
MACDシグナルEMA長 |
14 |
MacdDiffBuyThreshold |
ロングトレードの最小MACD傾き改善 |
0.5 |
MacdDiffSellThreshold |
ショートトレードの最小MACD傾き改善 |
0.15 |
RsiUpperLimit |
ロングエントリー前の最大許容RSI |
80 |
RsiUpperLevel |
ロングエントリーに必要な最小RSI |
60 |
RsiLowerLevel |
ショートエントリーの最大許容RSI |
39 |
RsiLowerLimit |
ショート前の最小必要RSI |
25 |
CandleType |
ローソク足サブスクリプションに使用される時間軸 |
1 Day |
デプロイのヒント
- RSIとMACDしきい値を一緒に最適化します;MACDアクセラレーションフィルターを調整せずにRSIコリドーを緩めると、だましが生まれる可能性があります。
- 部分出口はローソク足の極値に依存するため、高値/安値の正確なデータはリアルなバックテストに重要です。
- 常にシグナルごとに4つの同時注文を処理するのに十分な資本で運用します。
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Alexav D1 Profit GBPUSD strategy (simplified). Uses EMA crossover with RSI
/// filter for breakout entries with ATR-based stop/take management.
/// </summary>
public class AlexavD1ProfitGbpUsdStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _emaFastLength;
private readonly StrategyParam<int> _emaSlowLength;
private readonly StrategyParam<int> _rsiLength;
private readonly StrategyParam<decimal> _rsiUpperLevel;
private readonly StrategyParam<decimal> _rsiLowerLevel;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int EmaFastLength
{
get => _emaFastLength.Value;
set => _emaFastLength.Value = value;
}
public int EmaSlowLength
{
get => _emaSlowLength.Value;
set => _emaSlowLength.Value = value;
}
public int RsiLength
{
get => _rsiLength.Value;
set => _rsiLength.Value = value;
}
public decimal RsiUpperLevel
{
get => _rsiUpperLevel.Value;
set => _rsiUpperLevel.Value = value;
}
public decimal RsiLowerLevel
{
get => _rsiLowerLevel.Value;
set => _rsiLowerLevel.Value = value;
}
public AlexavD1ProfitGbpUsdStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_emaFastLength = Param(nameof(EmaFastLength), 6)
.SetGreaterThanZero()
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators");
_emaSlowLength = Param(nameof(EmaSlowLength), 21)
.SetGreaterThanZero()
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators");
_rsiLength = Param(nameof(RsiLength), 10)
.SetGreaterThanZero()
.SetDisplay("RSI Length", "RSI period", "Indicators");
_rsiUpperLevel = Param(nameof(RsiUpperLevel), 65m)
.SetDisplay("RSI Upper", "Max RSI for buy", "Filters");
_rsiLowerLevel = Param(nameof(RsiLowerLevel), 35m)
.SetDisplay("RSI Lower", "Min RSI for sell", "Filters");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var emaFast = new ExponentialMovingAverage { Length = EmaFastLength };
var emaSlow = new ExponentialMovingAverage { Length = EmaSlowLength };
decimal prevFast = 0, prevSlow = 0;
var hasPrev = false;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(emaFast, emaSlow, (ICandleMessage candle, decimal fastVal, decimal slowVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!hasPrev)
{
prevFast = fastVal;
prevSlow = slowVal;
hasPrev = true;
return;
}
if (!IsFormedAndOnlineAndAllowTrading())
{
prevFast = fastVal;
prevSlow = slowVal;
return;
}
var close = candle.ClosePrice;
// EMA fast crosses above slow - buy signal
var bullishCross = prevFast <= prevSlow && fastVal > slowVal;
// EMA fast crosses below slow - sell signal
var bearishCross = prevFast >= prevSlow && fastVal < slowVal;
if (bullishCross && Position <= 0)
BuyMarket();
else if (bearishCross && Position >= 0)
SellMarket();
prevFast = fastVal;
prevSlow = slowVal;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, emaFast);
DrawIndicator(area, emaSlow);
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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class alexav_d1_profit_gbp_usd_strategy(Strategy):
def __init__(self):
super(alexav_d1_profit_gbp_usd_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._ema_fast_length = self.Param("EmaFastLength", 6) \
.SetDisplay("EMA Fast", "Fast EMA period", "Indicators")
self._ema_slow_length = self.Param("EmaSlowLength", 21) \
.SetDisplay("EMA Slow", "Slow EMA period", "Indicators")
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
@property
def CandleType(self):
return self._candle_type.Value
@property
def EmaFastLength(self):
return self._ema_fast_length.Value
@property
def EmaSlowLength(self):
return self._ema_slow_length.Value
def OnReseted(self):
super(alexav_d1_profit_gbp_usd_strategy, self).OnReseted()
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alexav_d1_profit_gbp_usd_strategy, self).OnStarted2(time)
self._prev_fast = 0.0
self._prev_slow = 0.0
self._has_prev = False
ema_fast = ExponentialMovingAverage()
ema_fast.Length = self.EmaFastLength
ema_slow = ExponentialMovingAverage()
ema_slow.Length = self.EmaSlowLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(ema_fast, ema_slow, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, ema_fast)
self.DrawIndicator(area, ema_slow)
self.DrawOwnTrades(area)
def _on_process(self, candle, fast_value, slow_value):
if candle.State != CandleStates.Finished:
return
fv = float(fast_value)
sv = float(slow_value)
if not self._has_prev:
self._prev_fast = fv
self._prev_slow = sv
self._has_prev = True
return
if self._prev_fast <= self._prev_slow and fv > sv and self.Position <= 0:
self.BuyMarket()
elif self._prev_fast >= self._prev_slow and fv < sv and self.Position >= 0:
self.SellMarket()
self._prev_fast = fv
self._prev_slow = sv
def CreateClone(self):
return alexav_d1_profit_gbp_usd_strategy()