GitHub で見る
Alligator キャンドルクロス戦略
この戦略は、MetaTrader の専門家 ワニ キャンドル クロス アップ/ダウンを StockSharp のハイレベルの API に移植します。これは、中央価格の平滑化移動平均から構築されたビル Williams Alligator インジケーターを監視し、完成したローソク体が Alligator の口の一方の側からもう一方の側に移動するたびに反応します。パラメーターを通じてエントリーを強気、弱気、または両方向に制限でき、固定ピップベースのストップとターゲットがリスク管理を処理します。
取引ロジック
インジケーターの準備
- 従来の 13/8/5 の長さの平滑化移動平均を使用して、Alligator 顎、歯、唇を計算します。
- 従来の前方シフト (デフォルトでは 8/5/3 バー) を適用して、各ラインをその前に形成されるローソク足と比較します。
- すべての価格は、MetaTrader の実装と一致するように、ローソク足の中央値
(High + Low) / 2 からサンプリングされます。
ロングセットアップ(「キャンドルクロスアップ」)
- 直前に終了したローソク足は、(シフト適用後) 最下位の Alligator ライン以下で終了する必要があります。
- 現在のローソク足の実体は、シフトされた最大の Alligator 値以下で開き、同じ値を超えて閉じます。これは、実体が Alligator の口を上向きに横切ったことが証明されています。
- 現在オープンしているポジションはなく、取引は可能です。
- すべての条件が一致すると、戦略は設定された数量の市場購入を送信します。
短いセットアップ (「キャンドルクロスダウン」)
- 前回の終値は、最もシフトされた Alligator ライン以上である必要があります。
- 現在のローソク足本体は、シフトされた最低値 Alligator 値以上で始まり、その下で終了し、Alligator を通過する弱気のクロスを確認します。
- オープンなポジションはなく、取引は可能です。
- 設定された量に対して成行 売り注文が送信されます。
ポジション管理
- 新しいポジションがオープンされると、ストラテジーはシンボル価格ステップを使用して、ピップからのストップロスとテイクプロフィットの距離を絶対価格に変換します。
- ロングポジションは、ローソク足がストップロスに触れたとき、ターゲットに到達したとき、またはシフトされたティースラインとリップスラインの最小値を下回って終了したときに終了します。
- ショート ポジションは、ストップロス、ターゲット、またはシフトされたティースとリップの値の最大値を上回る終値で終了します。
- 異常な充填が安全に閉じられるように、組み込みの StartProtection 呼び出しが起動時にアクティブ化されます。
パラメーター
| 名前 |
種類 |
デフォルト |
説明 |
OrderVolume |
decimal |
0.1 |
ロットまたは契約における取引サイズ。 |
StopLossPips |
int |
50 |
エントリー価格から保護ストップまでの距離 (ピップ単位)。ゼロは停止を無効にします。 |
TakeProfitPips |
int |
50 |
エントリーから固定利益目標までの距離 (pips)。ゼロはターゲットを無効にします。 |
JawPeriod |
int |
13 |
Alligator ジョー (青) ラインの平滑化された移動平均の長さ。 |
JawShift |
int |
8 |
信号を評価する前に顎のラインに適用される前方変位。 |
TeethPeriod |
int |
8 |
Alligator 歯 (赤) の線の平滑化移動平均長。 |
TeethShift |
int |
5 |
歯列の前方変位。 |
LipsPeriod |
int |
5 |
Alligator 唇 (緑) ラインの平滑化された移動平均の長さ。 |
LipsShift |
int |
3 |
唇のラインを前方に移動します。 |
CandleType |
DataType |
TimeSpan.FromHours(1).TimeFrame() |
計算に使用されるローソク足シリーズ。 |
EntryMode |
AlligatorCrossMode |
Both |
戦略が長いセットアップ、短いセットアップ、またはその両方をトレードするかを選択します。 |
使用上の注意
- StockSharp がサポートするあらゆる機器で動作します。
CandleType が元の MetaTrader テンプレートで使用されている期間と一致していることを確認してください。
- ピップは商品の価格ステップから推測されます。3 または 5 桁の小数引用符 (EURUSD など) の場合、ピップは 10 の価格ステップに相当します。
- このロジックは完了したローソク足にのみ作用し、ティック データには依存しないため、MetaTrader バックテストとの整合性が保たれます。
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Alligator Candle Cross strategy: DEMA trend crossover.
/// Buys when close crosses above DEMA, sells when close crosses below.
/// </summary>
public class AlligatorCandleCrossStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private decimal _prevClose;
private decimal _prevDema;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int Period { get => _period.Value; set => _period.Value = value; }
public AlligatorCandleCrossStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(60).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_period = Param(nameof(Period), 50)
.SetGreaterThanZero()
.SetDisplay("Period", "DEMA period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevClose = 0;
_prevDema = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevClose = 0;
_prevDema = 0;
_hasPrev = false;
var dema = new ExponentialMovingAverage { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(dema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal demaValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevClose <= _prevDema && candle.ClosePrice > demaValue && Position <= 0)
BuyMarket();
else if (_prevClose >= _prevDema && candle.ClosePrice < demaValue && Position >= 0)
SellMarket();
}
_prevClose = candle.ClosePrice;
_prevDema = demaValue;
_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 ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class alligator_candle_cross_strategy(Strategy):
def __init__(self):
super(alligator_candle_cross_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(60)))
self._period = self.Param("Period", 50)
self._prev_close = 0.0
self._prev_dema = 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 Period(self):
return self._period.Value
@Period.setter
def Period(self, value):
self._period.Value = value
def OnReseted(self):
super(alligator_candle_cross_strategy, self).OnReseted()
self._prev_close = 0.0
self._prev_dema = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(alligator_candle_cross_strategy, self).OnStarted2(time)
self._prev_close = 0.0
self._prev_dema = 0.0
self._has_prev = False
dema = ExponentialMovingAverage()
dema.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(dema, self._process_candle).Start()
def _process_candle(self, candle, dema_value):
if candle.State != CandleStates.Finished:
return
close = float(candle.ClosePrice)
dema_val = float(dema_value)
if self._has_prev:
if self._prev_close <= self._prev_dema and close > dema_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_close >= self._prev_dema and close < dema_val and self.Position >= 0:
self.SellMarket()
self._prev_close = close
self._prev_dema = dema_val
self._has_prev = True
def CreateClone(self):
return alligator_candle_cross_strategy()