GitHub で見る
スキャルピングアシスタント
スキャルピング アシスタント 戦略は、MetaTrader 4 エキスパート アドバイザー「Scalper Assistant v1.0」を直接変換したものです。独自にエントリを生成することはありません。代わりに、設定された証券のオープンポジションを監視し、MetaTrader のような方法で保護注文を管理します。
仕組み
- 新しいポジションが検出されると、戦略は設定された距離 (価格ステップで表される) を使用してストップロス注文とテイクプロフィット注文を即座に登録します。
- この戦略はレベル 1 データをサブスクライブし、ポジションの現在の利益を推定するために最良の買い/売りを継続的に追跡します。
- 未実現利益が
BreakEvenTriggerPoints に達すると、最初のストップはキャンセルされ、損益分岐点価格に設定されたオフセットを加えた値で再登録されます。
- ストップレベルは損益分岐点に留まります。それ以上のトレーリングは実行されません。利益確定注文はそのまま残されます。
- ポジションがクローズされるとすぐに、すべての保護注文がキャンセルされ、内部状態がリセットされ、次の手動取引の準備が整います。
使用上の注意
- 戦略をコネクタ/ポートフォリオにアタッチし、手動または別のアルゴリズムから取引を開きます。アシスタントはそれらのポジションの保護を引き継ぎます。
- このロジックはレベル 1 の引用符に依存しています。選択したコネクタが最良の買値/売値の更新を提供することを確認してください。
- ポイント という用語は、商品の価格ステップ (
Security.PriceStep) を指します。小数点以下 5 桁の外国為替記号の場合、これは 1 ピップに相当します。
パラメーター
| 名前 |
種類 |
デフォルト |
説明 |
StopLossPoints |
decimal |
30 |
最初の保護ストップを配置するときに使用される距離 (価格ステップ)。逆指値注文の送信をスキップするには、0 に設定します。 |
TakeProfitPoints |
decimal |
100 |
最初の利益確定注文を出すときに使用される距離 (価格ステップ)。テイクプロフィットをスキップするには、0 に設定します。 |
BreakEvenTriggerPoints |
decimal |
15 |
ストップが損益分岐点に移動する前に到達する必要がある価格ステップでの利益。 |
BreakEvenOffsetPoints |
decimal |
5 |
ストップが損益分岐点に移行するときに、エントリー価格の上下に追加される追加距離 (価格ステップ単位)。 |
変換ステータス
- ✅ コアロジック: MetaTrader 入力パラメータに基づく損益分岐点処理。
- ✅ API の高レベルの使用法: デリゲート バインディングを使用した
SubscribeLevel1()。
- ✅ 秘密保持命令:
SellStop、BuyStop、SellLimit、および BuyLimit ヘルパーを介して作成されます。
- ❌ Python ポートはありません – リクエストに一致する C# 戦略のみが提供されます。
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Scalping Assistant strategy: RSI + EMA filter.
/// Buys when RSI crosses above 30 with price above EMA, sells when RSI crosses below 70 with price below EMA.
/// </summary>
public class ScalpingAssistantStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _emaPeriod;
private decimal _prevRsi;
private bool _hasPrev;
public DataType CandleType { get => _candleType.Value; set => _candleType.Value = value; }
public int RsiPeriod { get => _rsiPeriod.Value; set => _rsiPeriod.Value = value; }
public int EmaPeriod { get => _emaPeriod.Value; set => _emaPeriod.Value = value; }
public ScalpingAssistantStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(5).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_emaPeriod = Param(nameof(EmaPeriod), 20)
.SetGreaterThanZero()
.SetDisplay("EMA Period", "EMA trend filter period", "Indicators");
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevRsi = 0;
_hasPrev = false;
}
/// <inheritdoc />
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_hasPrev = false;
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var ema = new ExponentialMovingAverage { Length = EmaPeriod };
var subscription = SubscribeCandles(CandleType);
subscription.Bind(rsi, ema, ProcessCandle).Start();
}
private void ProcessCandle(ICandleMessage candle, decimal rsiValue, decimal emaValue)
{
if (candle.State != CandleStates.Finished) return;
if (_hasPrev)
{
if (_prevRsi < 30 && rsiValue >= 30 && candle.ClosePrice > emaValue && Position <= 0)
BuyMarket();
else if (_prevRsi > 70 && rsiValue <= 70 && candle.ClosePrice < emaValue && Position >= 0)
SellMarket();
}
_prevRsi = rsiValue;
_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 RelativeStrengthIndex, ExponentialMovingAverage
from StockSharp.Algo.Strategies import Strategy
class scalping_assistant_strategy(Strategy):
def __init__(self):
super(scalping_assistant_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromMinutes(5)))
self._rsi_period = self.Param("RsiPeriod", 14)
self._ema_period = self.Param("EmaPeriod", 20)
self._prev_rsi = 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 RsiPeriod(self):
return self._rsi_period.Value
@RsiPeriod.setter
def RsiPeriod(self, value):
self._rsi_period.Value = value
@property
def EmaPeriod(self):
return self._ema_period.Value
@EmaPeriod.setter
def EmaPeriod(self, value):
self._ema_period.Value = value
def OnReseted(self):
super(scalping_assistant_strategy, self).OnReseted()
self._prev_rsi = 0.0
self._has_prev = False
def OnStarted2(self, time):
super(scalping_assistant_strategy, self).OnStarted2(time)
self._has_prev = False
rsi = RelativeStrengthIndex()
rsi.Length = self.RsiPeriod
ema = ExponentialMovingAverage()
ema.Length = self.EmaPeriod
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(rsi, ema, self._process_candle).Start()
def _process_candle(self, candle, rsi_value, ema_value):
if candle.State != CandleStates.Finished:
return
rsi_val = float(rsi_value)
ema_val = float(ema_value)
close = float(candle.ClosePrice)
if self._has_prev:
if self._prev_rsi < 30 and rsi_val >= 30 and close > ema_val and self.Position <= 0:
self.BuyMarket()
elif self._prev_rsi > 70 and rsi_val <= 70 and close < ema_val and self.Position >= 0:
self.SellMarket()
self._prev_rsi = rsi_val
self._has_prev = True
def CreateClone(self):
return scalping_assistant_strategy()