GitHub で見る
Stochastic アクセラレータ戦略
概要
Stochastic アクセラレータ戦略は、MetaTrader 5 エキスパート #2 stoch mt5 の変換です。オリジナルロボットは3つを評価します
Bill Williams のアクセラレーター オシレーターとオーサム オシレーターを組み合わせた確率的オシレーター。ロングポジションがオープンされています
すべての確率的フィルターが強気の勢いに一致し、アクセラレーター オシレーターが感度しきい値を超えた場合にのみ発生します。
ショート ポジションでは対称ルールが使用されます。取引が実行されると、Awesome Oscillator は勢いの反転を監視して取引を終了します。
露出。 StockSharp ポートは、高レベルのキャンドル サブスクリプション API に依存しながら、これらのメカニズムを再現します。
インジケーターのバインディング。
この戦略では、資金管理プロファイルを EA から保持します。エントリーは固定ロット量でサイズ設定されますが、ストップロスと
テイクプロフィットディスタンスは MetaTrader ピップで表されます。 StockSharp 実装は StartProtection を使用するため、設定された
リスク制限はすべての新しいポジションに自動的に適用されます。価格ステップは、維持するために MetaTrader ピップ単位に変換されます。
ブローカー全体で同じ保護距離。
取引ロジック
CandleType によって定義されたプライマリ キャンドル シリーズをサブスクライブし、元の EA をミラーリングして、完成したキャンドルのみを処理します。
- 3 つの
StochasticOscillator インスタンスをフィードします。
- シグナル確率論は、%K が %D より上か下かをチェックします。
- エントリーストキャスティックは、強気シグナルが
EntryLevel を上回っていること (ショートの場合は 100 - EntryLevel を下回っていること) を検証します。
- 確率的フィルター により、強気のセットアップが
FilterLevel 未満 (ショートの場合は 100 - FilterLevel より上) にとどまることが保証されます。
- アクセラレータ オシレータを追跡し、ロング エントリを確認するには、それが
AcceleratorLevel を超えることを要求します。ショーツに求められるのは、
-AcceleratorLevelの下を渡ります。
- オーサム オシレーターが反対方向に
AwesomeLevel バンドを通過したら、オープン ポジションを閉じます。
- フラット化後、片側だけがすべてのエントリーフィルターを満たしている場合は、新しいポジションをオープンします。音量はセキュリティに合わせて調整されます
ロットステップを変更することで、リクエストは実際のブローカーに対して有効なままになります。
StartProtection を使用してストップロスとテイクプロフィット ディスタンスを適用し、MetaTrader と同じピップベースのリスク管理を維持します
専門家。
パラメーター
| 名前 |
種類 |
デフォルト |
説明 |
CandleType |
DataType |
4時間枠 |
戦略によって処理されたプライマリ キャンドル。 |
TradeVolume |
decimal |
0.01 |
新しいエントリーに使用されるボリューム (ロット)。 |
StopLossPips |
decimal |
40 |
MetaTrader ピップス単位のストップロス距離。 |
TakeProfitPips |
decimal |
70 |
MetaTrader ピップス単位の利食い距離。 |
SignalKPeriod |
int |
40 |
確認確率の %K 期間。 |
SignalDPeriod |
int |
10 |
%D 確認確率の平滑化。 |
SignalSlowing |
int |
10 |
確認確率のための追加の平滑化。 |
EntryKPeriod |
int |
40 |
エントリー確率の %K 期間。 |
EntryDPeriod |
int |
10 |
%D エントリー確率の平滑化。 |
EntrySlowing |
int |
10 |
エントリー確率論の追加の平滑化。 |
EntryLevel |
decimal |
20 |
強気の勢いを確認する下限しきい値 (ショートは 100 - EntryLevel を使用)。 |
FilterKPeriod |
int |
40 |
確率的フィルターの %K 期間。 |
FilterDPeriod |
int |
10 |
%D 確率的フィルターの平滑化。 |
FilterSlowing |
int |
10 |
確率的フィルターの追加の平滑化。 |
FilterLevel |
decimal |
75 |
強気の設定を制限する上限閾値 (ショートは 100 - FilterLevel を使用)。 |
AcceleratorLevel |
decimal |
0.0002 |
エントリに必要なアクセラレータ オシレータの最小振幅。 |
AwesomeLevel |
decimal |
0.0013 |
トレードエグジットを引き起こす素晴らしいオシレーターバンド。 |
- StockSharp ポートは、繰り返される
CopyBuffer 呼び出しの代わりに、インジケーター バインディングを備えたキャンドル サブスクリプションを使用します。
- 注文管理はネットポジションモードで行われます。 EA がすぐに反転する場合、変換はまず、
現在のエクスポージャーを削除し、反対側で新しい成行注文を発行します。
- ストップロスとテイクプロフィットの距離は、
楽器の価格ステップ。これにより、距離を MetaTrader ポイントと同じに保ちながら、チケットを手動で変更する必要がなくなります。
- ボリューム リクエストはセキュリティの
VolumeStep、MinVolume、および MaxVolume に対して正規化されるため、コードはライブで使用できるようになります
取引環境。
使い方のヒント
- ストラテジーを実行する前に、商品の最小ロットステップに一致するように
TradeVolume を調整します。
- 確率レベル (
EntryLevel および FilterLevel) とオシレーターのしきい値を微調整してフィルターを適応させます
市場に対する厳しさ。
- 可能な場合はチャート描画を有効にして、3 つの確率オシレーター、アクセラレーター オシレーター、オーサム オシレーターを視覚化します。
オシレーター、および実行された取引。
- ロジックはローソク足が終了するのを待つため、シグナルは各バーの終値で表示されます。同じ期間のバックテスターを使用する
一貫した結果を得るために。
インジケーター
- 独立したスムージングとしきい値設定を持つ 3 つの
StochasticOscillator インスタンス。
AcceleratorOscillator 入力確認用。
AwesomeOscillator 終了タイミング。
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Stochastic Accelerator strategy: Rate of Change crossover.
/// Buys when ROC crosses above zero, sells when ROC crosses below zero.
/// </summary>
public class StochasticAcceleratorStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private readonly StrategyParam<decimal> _rocLevel;
private readonly StrategyParam<int> _signalCooldownCandles;
private decimal _prevRoc;
private int _candlesSinceTrade;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public decimal RocLevel { get => _rocLevel.Value; set => _rocLevel.Value = value; }
public int SignalCooldownCandles { get => _signalCooldownCandles.Value; set => _signalCooldownCandles.Value = value; }
public StochasticAcceleratorStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 12)
.SetGreaterThanZero()
.SetDisplay("Period", "ROC period", "Indicators");
_rocLevel = Param(nameof(RocLevel), 0.2m)
.SetDisplay("ROC Level", "ROC threshold for crossover", "Signals");
_signalCooldownCandles = Param(nameof(SignalCooldownCandles), 4)
.SetGreaterThanZero()
.SetDisplay("Signal Cooldown", "Bars to wait between trades", "Trading");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevRoc = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevRoc = 0;
_candlesSinceTrade = SignalCooldownCandles;
_hasPrev = false;
var roc = new RateOfChange { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(roc, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rocValue)
{
if (candle.State != CandleStates.Finished) return;
if (_candlesSinceTrade < SignalCooldownCandles)
_candlesSinceTrade++;
if (_hasPrev)
{
if (_prevRoc <= -RocLevel && rocValue > -RocLevel && Position <= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
BuyMarket();
_candlesSinceTrade = 0;
}
else if (_prevRoc >= RocLevel && rocValue < RocLevel && Position >= 0 && _candlesSinceTrade >= SignalCooldownCandles)
{
SellMarket();
_candlesSinceTrade = 0;
}
}
_prevRoc = rocValue;
_hasPrev = true;
}
}
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 RateOfChange
from StockSharp.Algo.Strategies import Strategy
class stochastic_accelerator_strategy(Strategy):
def __init__(self):
super(stochastic_accelerator_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._period = self.Param("Period", 12)
self._roc_level = self.Param("RocLevel", 0.2)
self._signal_cooldown_candles = self.Param("SignalCooldownCandles", 4)
self._prev_roc = 0.0
self._candles_since_trade = 4
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 Period(self):
return self._period.Value
@Period.setter
def Period(self, value):
self._period.Value = value
@property
def RocLevel(self):
return self._roc_level.Value
@RocLevel.setter
def RocLevel(self, value):
self._roc_level.Value = value
@property
def SignalCooldownCandles(self):
return self._signal_cooldown_candles.Value
@SignalCooldownCandles.setter
def SignalCooldownCandles(self, value):
self._signal_cooldown_candles.Value = value
def OnReseted(self):
super(stochastic_accelerator_strategy, self).OnReseted()
self._prev_roc = 0.0
self._candles_since_trade = self.SignalCooldownCandles
self._has_prev = False
def OnStarted2(self, time):
super(stochastic_accelerator_strategy, self).OnStarted2(time)
self._prev_roc = 0.0
self._candles_since_trade = self.SignalCooldownCandles
self._has_prev = False
roc = RateOfChange()
roc.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(roc, self._process_candle).Start()
def _process_candle(self, candle, roc_value):
if candle.State != CandleStates.Finished:
return
if self._candles_since_trade < self.SignalCooldownCandles:
self._candles_since_trade += 1
roc_val = float(roc_value)
if self._has_prev:
if self._prev_roc <= -self.RocLevel and roc_val > -self.RocLevel and self.Position <= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.BuyMarket()
self._candles_since_trade = 0
elif self._prev_roc >= self.RocLevel and roc_val < self.RocLevel and self.Position >= 0 and self._candles_since_trade >= self.SignalCooldownCandles:
self.SellMarket()
self._candles_since_trade = 0
self._prev_roc = roc_val
self._has_prev = True
def CreateClone(self):
return stochastic_accelerator_strategy()