ホーム
/
戦略のサンプル
GitHub で見る
Exp Skyscraper Fix Color AML MMRec戦略
Exp Skyscraper Fix Color AML MMRecは、MQL5エキスパートアドバイザー Exp_Skyscraper_Fix_ColorAML_MMRec のStockSharpへのポートです。元のロボットは2つの独立したインジケーター — Skyscraper Fix と Color AML — を組み合わせ、連続損失後に注文サイズを削減するMMRecマネー管理ロジックを適用します。C#実装は両方のシグナルソースと適応的なポジションサイジングを維持しながら、注文ルーティングにStockSharpの高レベルAPIを使用します。
トレードワークフロー
Skyscraper Fixモジュール はSkyscraperCandleTypeの完了したローソク足から適応チャンネルを構築します。チャンネルの色がtealになる(トレンド > 0)と、すべてのショートポジションをクローズでき、前の色がtealでなかった場合は新しいロングトレードが開かれます。色が赤になる(トレンド < 0)と、ロジックはショートトレード用に反転されます。ヘルパークラスSkyscraperFixIndicatorは戦略3040_Exp_Skyscraper_Fix_Duplexから再利用されます。
Color AMLモジュール はColorAmlCandleTypeからのローソク足を処理します。翻訳されたColorAmlIndicatorは適応市場レベルを再現し、カラーコードを出力します:2(強気)、0(弱気)または1(ニュートラル)。モジュールは強気または弱気の色が検出されるたびに反対側をクローズし、色が前の遅延サンプルから変化した場合は新しいポジションを開きます。
シグナル遅延 はSkyscraperSignalBarとColorAmlSignalBarを通じて両モジュールで独立して制御されます。戦略はインジケーター出力のキューを維持し、設定された数のクローズ済みローソク足の後にのみ注文を実行し、エキスパートアドバイザーのCopyBuffer(..., shift, ...)動作と一致させます。
リスク管理 は元のストップ/テイクプロフィット距離を反映します。各モジュールは価格ステップ(ティック)で独自の保護距離を定義します。戦略はそれらを絶対価格に変換し、完了したすべてのローソク足で、バーのレンジがストップロスまたはテイクプロフィットに触れたかどうかを確認します。そうであれば、ポジションは成行注文でフラット化され、すべての保護レベルがクリアされます。
MMRecマネー管理 はSkyscraperロング、Skyscraperショート、Color AMLロング、Color AMLショートエントリーの連続損失トレードを個別に追跡します。ある方向の損失ストリークが対応するトリガー(*LossTrigger)に達すると、ボリュームが*Mmから削減値*SmallMmに切り替わります。利益のあるトレードが現れると、ストリークはゼロにリセットされます。サンプル戦略は単一のネットポジションで実行されるため、Lot管理モードのみが実際の効果を持ちます;他のモードは直接ロットサイジングにフォールバックします。
実装メモ
コードはStockSharpの高レベルAPIのみに依存します:ローソク足サブスクリプションが両インジケーターを供給し、すべての取引決定はBuyMarket、SellMarket、ClosePositionヘルパーを通じて実行されます。
保護注文は個別のストップ/リミット注文ではなく成行エグジットで実装されます。これにより、両モジュールが同じネットポジションを共有する際の競合を避けます。
マネー管理はOnOwnTradeReceivedで受け取った実行データを使用して前のトレードの結果を決定します。ポジションを開いたモジュールはその識別子を保存し、ポジションがクローズされたときに正しい損失カウンターが更新されます。
翻訳されたColorAmlIndicatorはローソク足と平滑化値をキャッシュし、フラクタルレンジに基づくダイナミックアルファとカラーコーディングロジック(AML上昇には青、下降には赤、それ以外はグレー)を含む元の指数平滑化スキームに従います。
MQL5バージョンのマジックナンバーと明示的なスリッページ設定はStockSharpでは不要であり、省略されています。
パラメーター
Skyscraper Fixモジュール
パラメーター
デフォルト
説明
SkyscraperCandleType
H4ローソク足
Skyscraper Fixチャンネルの計算に使用するタイムフレーム。
SkyscraperLength
10
適応チャンネルステップを定義するATRルックバック。
SkyscraperKv
0.9
ATRベースのステップサイズに適用される乗数。
SkyscraperPercentage
0
中間線に適用されるパーセントオフセット。
SkyscraperMode
HighLow
エンベロープの価格ソース(high/lowまたはclose)。
SkyscraperSignalBar
1
Skyscraperシグナルを遅延させるクローズ済みローソク足の数。
SkyscraperEnableLongEntry
true
チャンネルが強気になったときのロングエントリーを許可。
SkyscraperEnableShortEntry
true
チャンネルが弱気になったときのショートエントリーを許可。
SkyscraperEnableLongExit
true
弱気のSkyscraperシグナルでロングポジションをクローズ。
SkyscraperEnableShortExit
true
強気のSkyscraperシグナルでショートポジションをクローズ。
SkyscraperBuyLossTrigger
2
削減ボリュームに切り替えるために必要な連続ロング損失数。
SkyscraperSellLossTrigger
2
削減ボリュームに切り替えるために必要な連続ショート損失数。
SkyscraperSmallMm
0.01
損失トリガー到達後に使用する注文ボリューム。
SkyscraperMm
0.1
Skyscraperシグナルのデフォルト注文ボリューム。
SkyscraperMmMode
Lot
マネー管理モード(LotのみがC#ポートに影響)。
SkyscraperStopLossTicks
1000
価格ステップでのストップロス距離。0でストップを無効化。
SkyscraperTakeProfitTicks
2000
価格ステップでのテイクプロフィット距離。0でターゲットを無効化。
Color AMLモジュール
パラメーター
デフォルト
説明
ColorAmlCandleType
H4ローソク足
Color AMLインジケーターが使用するタイムフレーム。
ColorAmlFractal
6
AMLレンジ計算のフラクタルウィンドウ。
ColorAmlLag
7
AML指数平均のスムージングラグ。
ColorAmlSignalBar
1
Color AMLシグナルを遅延させるクローズ済みローソク足の数。
ColorAmlEnableLongEntry
true
AMLが強気になったとき(色2)のロングエントリーを許可。
ColorAmlEnableShortEntry
true
AMLが弱気になったとき(色0)のショートエントリーを許可。
ColorAmlEnableLongExit
true
弱気のAML色でロングポジションをクローズ。
ColorAmlEnableShortExit
true
強気のAML色でショートポジションをクローズ。
ColorAmlBuyLossTrigger
2
削減ボリュームに切り替える前の連続ロング損失数。
ColorAmlSellLossTrigger
2
削減ボリュームに切り替える前の連続ショート損失数。
ColorAmlSmallMm
0.01
損失トリガー到達後に使用する注文ボリューム。
ColorAmlMm
0.1
Color AMLシグナルのデフォルト注文ボリューム。
ColorAmlMmMode
Lot
マネー管理モード(LotのみがC#ポートに影響)。
ColorAmlStopLossTicks
1000
価格ステップでのストップロス距離。無効にするには0に設定。
ColorAmlTakeProfitTicks
2000
価格ステップでのテイクプロフィット距離。無効にするには0に設定。
使用方法
戦略をポートフォリオと取引したい計器にアタッチします。ローソク足のセキュリティはSkyscraperCandleTypeとColorAmlCandleTypeで定義されたシリーズを提供する必要があります。
ブローカーが異なるロットステップを使用する場合は、マネー管理パラメーターを調整します。直接ロットサイジングのみが適用されるため、それに応じて*Mmと*SmallMmを設定してください。
オプションで各モジュールのストップロスとテイクプロフィット距離(ティック単位)を変更します。距離をゼロに設定すると対応する保護が無効になります。
戦略を開始します。両方のローソク足ストリームを購読し、インジケーターを計算し、上記のルールに従って自動的にエントリーとエグジットを管理します。
READMEはCS/ExpSkyscraperFixColorAmlMmrecStrategy.csの動作を反映しており、このStockSharp実装のリファレンスドキュメントとして使用する必要があります。
namespace StockSharp.Samples.Strategies;
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
public class ExpSkyscraperFixColorAmlMmrecStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _trendPeriod;
private readonly StrategyParam<int> _filterPeriod;
private readonly StrategyParam<decimal> _upperLevel;
private readonly StrategyParam<decimal> _lowerLevel;
private decimal? _previousTrend;
private decimal? _previousClose;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int TrendPeriod { get => _trendPeriod.Value; set => _trendPeriod.Value = value; }
public int FilterPeriod { get => _filterPeriod.Value; set => _filterPeriod.Value = value; }
public decimal UpperLevel { get => _upperLevel.Value; set => _upperLevel.Value = value; }
public decimal LowerLevel { get => _lowerLevel.Value; set => _lowerLevel.Value = value; }
public ExpSkyscraperFixColorAmlMmrecStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame()).SetDisplay("Candle Type", "Timeframe", "General");
_trendPeriod = Param(nameof(TrendPeriod), 18).SetGreaterThanZero().SetDisplay("Trend Period", "Trend WMA period", "Indicators");
_filterPeriod = Param(nameof(FilterPeriod), 12).SetGreaterThanZero().SetDisplay("Filter Period", "DeMarker period", "Indicators");
_upperLevel = Param(nameof(UpperLevel), 0.55m).SetDisplay("Upper Level", "Buy filter level", "Signals");
_lowerLevel = Param(nameof(LowerLevel), 0.45m).SetDisplay("Lower Level", "Sell filter level", "Signals");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities() => [(Security, CandleType)];
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_previousTrend = null;
_previousClose = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_previousTrend = null;
_previousClose = null;
var trend = new WeightedMovingAverage { Length = TrendPeriod };
var filter = new DeMarker { Length = FilterPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(trend, filter, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal trendValue, decimal filterValue)
{
if (candle.State != CandleStates.Finished)
return;
var previousClose = _previousClose;
var previousTrend = _previousTrend;
_previousClose = candle.ClosePrice;
_previousTrend = trendValue;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (previousClose is null || previousTrend is null)
return;
var crossedUp = previousClose.Value <= previousTrend.Value && candle.ClosePrice > trendValue;
var crossedDown = previousClose.Value >= previousTrend.Value && candle.ClosePrice < trendValue;
var buySignal = crossedUp && filterValue >= UpperLevel;
var sellSignal = crossedDown && filterValue <= LowerLevel;
if (buySignal && Position <= 0)
{
if (Position < 0)
{
BuyMarket();
return;
}
BuyMarket();
}
else if (sellSignal && Position >= 0)
{
if (Position > 0)
{
SellMarket();
return;
}
SellMarket();
}
}
}
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, DeMarker
from StockSharp.Algo.Strategies import Strategy
class exp_skyscraper_fix_color_aml_mmrec_strategy(Strategy):
def __init__(self):
super(exp_skyscraper_fix_color_aml_mmrec_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._trend_period = self.Param("TrendPeriod", 18) \
.SetDisplay("Trend Period", "Trend WMA period", "Indicators")
self._filter_period = self.Param("FilterPeriod", 12) \
.SetDisplay("Filter Period", "DeMarker period", "Indicators")
self._upper_level = self.Param("UpperLevel", 0.55) \
.SetDisplay("Upper Level", "Buy filter level", "Signals")
self._lower_level = self.Param("LowerLevel", 0.45) \
.SetDisplay("Lower Level", "Sell filter level", "Signals")
self._previous_trend = None
self._previous_close = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def TrendPeriod(self):
return self._trend_period.Value
@property
def FilterPeriod(self):
return self._filter_period.Value
@property
def UpperLevel(self):
return self._upper_level.Value
@property
def LowerLevel(self):
return self._lower_level.Value
def OnReseted(self):
super(exp_skyscraper_fix_color_aml_mmrec_strategy, self).OnReseted()
self._previous_trend = None
self._previous_close = None
def OnStarted2(self, time):
super(exp_skyscraper_fix_color_aml_mmrec_strategy, self).OnStarted2(time)
self._previous_trend = None
self._previous_close = None
trend = WeightedMovingAverage()
trend.Length = self.TrendPeriod
filt = DeMarker()
filt.Length = self.FilterPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(trend, filt, self._on_process).Start()
def _on_process(self, candle, trend_value, filter_value):
if candle.State != CandleStates.Finished:
return
tv = float(trend_value)
fv = float(filter_value)
previous_close = self._previous_close
previous_trend = self._previous_trend
self._previous_close = float(candle.ClosePrice)
self._previous_trend = tv
if previous_close is None or previous_trend is None:
return
crossed_up = previous_close <= previous_trend and float(candle.ClosePrice) > tv
crossed_down = previous_close >= previous_trend and float(candle.ClosePrice) < tv
buy_signal = crossed_up and fv >= float(self.UpperLevel)
sell_signal = crossed_down and fv <= float(self.LowerLevel)
if buy_signal and self.Position <= 0:
if self.Position < 0:
self.BuyMarket()
return
self.BuyMarket()
elif sell_signal and self.Position >= 0:
if self.Position > 0:
self.SellMarket()
return
self.SellMarket()
def CreateClone(self):
return exp_skyscraper_fix_color_aml_mmrec_strategy()