ホーム
/
戦略のサンプル
GitHub で見る
Parabolic SAR フィボナッチ制限
概要
Parabolic SAR フィボ リミットは、MetaTrader 4 エキスパート アドバイザー FT_0tk80i9uw4ep_Parabolic の StockSharp ポートです。オリジナルのロボットは、デュアル Parabolic SAR スタックと Fibonacci リトレースメント レベルを組み合わせて、主要なプルバック ゾーンで制限エントリーをステージングします。 C# 戦略では、段階的な注文の配置、組み込みの損益分岐点およびトレーリング保護、およびオプションの取引セッション フィルターが保存されるため、ソース EA が完成したローソク足のチャートにアタッチされたときに動作が一致します。
戦略ロジック
信号の準備
デュアル Parabolic SAR アライメント – 2 つの Parabolic SAR インジケーターが同じ時間枠で計算されます。高速な SAR は早期警告として使用され、低速な SAR は状態の変化を確認します。速い SAR が価格を上回った一方で、遅い SAR が価格を下回ったままの場合、この戦略は潜在的なロングセットアップを準備します。速い SAR が価格を下回っている一方で、遅い SAR が価格を上回っている場合、潜在的なショートセットアップが準備されています。遅い SAR がそれぞれの方向の価格を横切るとすぐに、セットアップはクリアされます。
スイング検出 – この戦略は、構成可能な Bar Search ウィンドウで最高値と最低値をクエリし、EA から MaximumMinimum ヘルパーを複製します。前回終了したローソク足は、Fibonacci の計算を固定する反対の極値 (High[1] または Low[1]) を提供します。
発注と管理
Fibonacci の未決注文 – 両方の SAR が価格の同じ側に位置し、セットアップが準備完了すると、ストラテジーは検出されたスイングの 50% Fibonacci レベル (Entry Fibonacci %) で指値注文を送信します。保護ストップは設定されたポイント数だけスイングの極値からオフセットされ、テイクプロフィットは拡張された Fibonacci プロジェクション (Target Fibonacci %) に配置されます。注文は、現在の価格、計画ストップ、目標値がすべて相互に少なくとも 5 価格ステップ離れている場合にのみ受け付けられ、EA の Point*5 安全フィルターを反映しています。
注文の自動クリーンアップ – 速い SAR が価格を超えて戻るたびに、間違った市場フェーズに入るのを避けるために、その方向の未決の指値注文がキャンセルされます。指値注文を約定すると、反対側の未決注文が自動的にキャンセルされます。
リスク管理
最初のストップとターゲット – EA の未決注文のストップロスとテイクプロフィットのパラメーターは、指値注文が約定されるとすぐに、計算されたストップとターゲットのレベルを適用することによってエミュレートされます。
損益分岐点シフト – Break Even (points) がゼロより大きい場合、取引が指定されたポイント数を獲得すると、ストップはエントリー価格に 1 価格ステップを加えた値 (ショートの場合はマイナス 1 ステップ) に移動し、元の BBU ルーチンを再現します。
トレーリングストップ – Trailing Stop (points) が有効な場合、ストップは選択した距離だけ価格に従います。ストップは、新しいストップが前のストップを少なくとも Trailing Step (points) 改善する場合にのみ更新され、EA の TrailingShag の動作と一致します。
手動決済トリガー – 価格が完成したローソク足で計算されたストップまたはターゲットレベルに達した場合、MT4 の自動注文執行をシミュレートするためにポジションは成行注文でクローズされます。
時間フィルター
オプションのセッション制御 – Use Time Filter を有効にすると、新しいエントリが交換時間の Start Hour と Stop Hour の間の包括的なウィンドウに制限されます。保護ロジック (損益分岐点、トレーリング、出口) は、MQL の実装と同様に、セッション外でも動作し続けます。
パラメーター
時間フィルターを使用 – 取引セッション フィルターを切り替えます。
開始時間 / 終了時間 – 時間フィルターが有効な場合に使用されるセッション時間を含みます。
高速 SAR ステップ / 高速 SAR 最大 – 高速 Parabolic SAR の加速係数と最大加速度。
低速 SAR ステップ / 低速 SAR 最大 – 低速 Parabolic SAR の加速係数と最大加速度。
バー検索 – スイングの高値/低値の計算に含まれるバーの数。
オフセット (ポイント) – ストップロスを計算するときにスイングの極値を超えて追加される価格ステップの数。
エントリ Fibonacci % – 指値注文価格に使用される Fibonacci パーセント (0 ~ 200+ で表されます)。
ターゲット Fibonacci % – テイクプロフィット予測の計算に適用される Fibonacci パーセンテージ。
損益分岐点 (ポイント) – ストップがエントリー価格 (+/- 1 ステップ) にジャンプする前に必要なポイント単位の利益。無効にするには、0 に設定します。
トレーリングストップ (ポイント) – 価格とトレーリングストップ間の距離。末尾を無効にするには、0 に設定します。
トレーリング ステップ (ポイント) – トレーリング ストップに進む前の最小限の改善 (ポイント)。
ローソクのタイプ – インジケーターとスイングの計算を駆動する時間枠。
数量 – StockSharp Strategy クラスから継承された基本注文数量 (デフォルトは 0.1)。
追加の注意事項
すべてのポイントベースのパラメータは、商品の価格ステップを使用して価格オフセットに自動的に変換されます。したがって、5 桁の FX シンボル、インデックス、その他のアセットは、手動スケーリングを行わずに EA 設定を再利用します。
この戦略は、構成されたサブスクリプションによって提供される完了したローソク足のみを処理し、EA の足ごとの実行と正確に一致します。
この戦略の Python バージョンはありません。 API パッケージでは C# 実装のみが利用可能です。
using System;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// Parabolic SAR strategy with Fibonacci retracement-based targets.
/// Enters on SAR flip, uses Highest/Lowest range for Fibonacci levels.
/// </summary>
public class ParabolicSarFiboLimitsStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _lookback;
private decimal _prevSar;
private bool _hasPrevSar;
private decimal _entryPrice;
public ParabolicSarFiboLimitsStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(3).TimeFrame())
.SetDisplay("Candle Type", "Timeframe for analysis.", "General");
_lookback = Param(nameof(Lookback), 20)
.SetDisplay("Lookback", "Period for Highest/Lowest range.", "Indicators");
}
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int Lookback
{
get => _lookback.Value;
set => _lookback.Value = value;
}
/// <inheritdoc />
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevSar = 0;
_hasPrevSar = false;
_entryPrice = 0;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevSar = 0;
_hasPrevSar = false;
_entryPrice = 0;
var sar = new ParabolicSar();
var highest = new Highest { Length = Lookback };
var lowest = new Lowest { Length = Lookback };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(sar, highest, lowest, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, sar);
DrawOwnTrades(area);
}
}
private void ProcessCandle(ICandleMessage candle, decimal sarValue, decimal highestValue, decimal lowestValue)
{
if (candle.State != CandleStates.Finished)
return;
var close = candle.ClosePrice;
var range = highestValue - lowestValue;
// SAR flip detection
var sarBelow = sarValue < close;
var prevSarBelow = _hasPrevSar && _prevSar < close;
var sarAbove = sarValue > close;
var prevSarAbove = _hasPrevSar && _prevSar > close;
// Fibonacci levels from the range
var fib382 = lowestValue + range * 0.382m;
var fib618 = lowestValue + range * 0.618m;
// Position management
if (Position > 0)
{
// Exit at 61.8% Fibonacci or SAR flip above
if (close >= fib618 || sarAbove)
{
SellMarket();
}
}
else if (Position < 0)
{
// Exit at 38.2% Fibonacci or SAR flip below
if (close <= fib382 || sarBelow)
{
BuyMarket();
}
}
// Entry on SAR flip with range confirmation
if (Position == 0 && _hasPrevSar && range > 0)
{
if (sarBelow && !prevSarBelow && close > fib382)
{
// SAR flipped below price - bullish
_entryPrice = close;
BuyMarket();
}
else if (sarAbove && !prevSarAbove && close < fib618)
{
// SAR flipped above price - bearish
_entryPrice = close;
SellMarket();
}
}
_prevSar = sarValue;
_hasPrevSar = 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 ParabolicSar, Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class parabolic_sar_fibo_limits_strategy(Strategy):
def __init__(self):
super(parabolic_sar_fibo_limits_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(3))).SetDisplay("Candle Type", "Timeframe", "General")
self._lookback = self.Param("Lookback", 20).SetDisplay("Lookback", "Period for Highest/Lowest range", "Indicators")
@property
def CandleType(self): return self._candle_type.Value
@CandleType.setter
def CandleType(self, value): self._candle_type.Value = value
def OnReseted(self):
super(parabolic_sar_fibo_limits_strategy, self).OnReseted()
self._prev_sar = 0
self._has_prev_sar = False
self._entry_price = 0
def OnStarted2(self, time):
super(parabolic_sar_fibo_limits_strategy, self).OnStarted2(time)
self._prev_sar = 0
self._has_prev_sar = False
self._entry_price = 0
sar = ParabolicSar()
highest = Highest()
highest.Length = self._lookback.Value
lowest = Lowest()
lowest.Length = self._lookback.Value
sub = self.SubscribeCandles(self.CandleType)
sub.Bind(sar, highest, lowest, self.OnProcess).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, sub)
self.DrawIndicator(area, sar)
self.DrawOwnTrades(area)
def OnProcess(self, candle, sar_value, highest_value, lowest_value):
if candle.State != CandleStates.Finished:
return
close = candle.ClosePrice
rng = highest_value - lowest_value
sar_below = sar_value < close
prev_sar_below = self._has_prev_sar and self._prev_sar < close
sar_above = sar_value > close
prev_sar_above = self._has_prev_sar and self._prev_sar > close
fib382 = lowest_value + rng * 0.382
fib618 = lowest_value + rng * 0.618
if self.Position > 0:
if close >= fib618 or sar_above:
self.SellMarket()
elif self.Position < 0:
if close <= fib382 or sar_below:
self.BuyMarket()
if self.Position == 0 and self._has_prev_sar and rng > 0:
if sar_below and not prev_sar_below and close > fib382:
self._entry_price = close
self.BuyMarket()
elif sar_above and not prev_sar_above and close < fib618:
self._entry_price = close
self.SellMarket()
self._prev_sar = sar_value
self._has_prev_sar = True
def CreateClone(self):
return parabolic_sar_fibo_limits_strategy()