GitHub で見る
ヒスト・スカルパー戦略
概要
Histo Scalper Strategy は、MetaTrader エキスパート アドバイザー HistoScalperEA v1.0 の C# ポートです。このアルゴリズムは 8 つのヒストグラム スタイルのインジケーター (ADX、ATR、Bollinger バンド、強気/弱気パワー、CCI、MACD、RSI、および Stochastic) を融合し、取引を開始する前に有効なすべてのフィルターからの全会一致の同意を必要とします。 2 番目の要件は、少なくとも 1 つのフィルターが前のバーで反対方向をレポートすることです。これにより、フラット市場中に戦略がエントリーするのが防止され、元の「2 つのバー」確認ロジックが模倣されます。
信号の生成
- ADX フィルター – +DI が -DI より大きいかどうかをチェックします。必要に応じて、決定を覆します。
- ATR フィルタ – 現在の ATR を SMA ベースラインと比較し、偏差のパーセンテージを測定します。ロングトレードには、
AtrPositiveThreshold を超えるプラスの偏差が必要です。ショートトレードでは、AtrNegativeThreshold を下回るマイナスの偏差が必要です。
- Bollinger ブレイクアウト – 終値が上限/下限バンドをブレイクすると予想されます。
- ブルズ/ベアーズパワー – ロングエントリーにはブルズパワーを使用し、ショートエントリーにはベアーズパワーの大きさを使用します。
- CCI – CCI の値が設定された売られ過ぎ/買われ過ぎのレベルを超えるとトリガーされます。
- MACD ヒストグラム – MACD とその信号線の間の距離を測定します。
- RSI – 従来の売られ過ぎ/買われ過ぎゾーンを使用します。
- Stochastic – %K 行を読み取り、構成された境界と比較します。
有効なフィルターのいずれかが中立値を生成した場合、ストラテジーは現在のローソク足の処理を中止します。各フィルターの履歴状態は、「前のバーの反対」ルールを適用するために保存されます。
リスク管理
- 市場エントリーでは、
TradeVolume パラメーターを使用します。
- オプションのピラミディングによりオープンポジションが追加されます。それ以外の場合、戦略は信号が変化したときにのみ方向を反転します。
- テイクプロフィットとストップロスのレベルは商品価格ステップで表され、
SetTakeProfit と SetStopLoss を介して注文を送信した直後に適用されます。
- セッション フィルタ (
UseTimeFilter、SessionStart、SessionEnd) により、設定された時間外の取引を無効にすることができます。
パラメーター
| パラメータ |
説明 |
TradeVolume |
新規取引の基本ボリューム。 |
AllowPyramiding |
すでに配置されている間に追加の取引を積み重ねることができます。 |
CloseOnOppositeSignal |
集約されたシグナルが反転すると、既存のポジションをクローズします。 |
UseTimeFilter, SessionStart, SessionEnd |
取引をカスタムの日次ウィンドウに制限します。 |
UseTakeProfit, TakeProfitPoints |
価格ステップでのテイクプロフィットを有効にして設定します。 |
UseStopLoss, StopLossPoints |
価格ステップでストップロスを有効にして設定します。 |
UseIndicator1 … UseIndicator8 |
個別のフィルターを有効にします。 |
ModeIndicatorX |
各フィルターのストレートロジックと反転ロジックを切り替えます。 |
| インジケーター固有の設定 |
元のエキスパートアドバイザーの入力を再現する期間、しきい値、およびレベル。 |
MQL エキスパートとの違い
- バスケット損益管理、サウンドアラート、グリッドオーダー管理は意図的に省略されています。
- リスクの自動化 (自動ロットサイジング、損益分岐点およびトレーリングロジック) は含まれていません。代わりに上記のリスクパラメータを使用してください。
- スプレッドチェックとブローカー固有の保護は移植されません。
使用上の注意
- 戦略を開始する前に、
Security と Portfolio を設定します。
- 希望の時間枠に合わせてローソクのタイプ (
CandleType) を調整します。
- ターゲット商品のボラティリティに合わせてインジケーターのしきい値を設定します。
- フィルターを個別に有効または無効にして、最適化を簡素化します。
AllowPyramiding と CloseOnOppositeSignal を使用して、高速市場でのエクスポージャを制御します。
namespace StockSharp.Samples.Strategies;
using System;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.Messages;
/// <summary>
/// Multi-indicator scalping strategy combining MACD, RSI, and CCI filters.
/// Buys when all indicators agree on bullish signal. Sells on bearish agreement.
/// </summary>
public class HistoScalperStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _rsiPeriod;
private readonly StrategyParam<int> _cciPeriod;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int RsiPeriod
{
get => _rsiPeriod.Value;
set => _rsiPeriod.Value = value;
}
public int CciPeriod
{
get => _cciPeriod.Value;
set => _cciPeriod.Value = value;
}
public HistoScalperStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromMinutes(30).TimeFrame())
.SetDisplay("Candle Type", "Candle timeframe", "General");
_rsiPeriod = Param(nameof(RsiPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("RSI Period", "RSI period", "Indicators");
_cciPeriod = Param(nameof(CciPeriod), 14)
.SetGreaterThanZero()
.SetDisplay("CCI Period", "CCI period", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var macd = new MovingAverageConvergenceDivergence();
var rsi = new RelativeStrengthIndex { Length = RsiPeriod };
var cci = new CommodityChannelIndex { Length = CciPeriod };
decimal? prevMacd = null;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(macd, rsi, cci, (candle, macdLine, rsiVal, cciVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
if (prevMacd.HasValue)
{
if (prevMacd.Value <= 0 && macdLine > 0 && rsiVal < 70m && cciVal > -100m && Position <= 0)
BuyMarket();
else if (prevMacd.Value >= 0 && macdLine < 0 && rsiVal > 30m && cciVal < 100m && Position >= 0)
SellMarket();
}
prevMacd = macdLine;
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
}
}
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 MovingAverageConvergenceDivergence, RelativeStrengthIndex, CommodityChannelIndex
from StockSharp.Algo.Strategies import Strategy
class histo_scalper_strategy(Strategy):
def __init__(self):
super(histo_scalper_strategy, self).__init__()
self._rsi_period = self.Param("RsiPeriod", 14) \
.SetDisplay("RSI Period", "RSI period", "Indicators")
self._cci_period = self.Param("CciPeriod", 14) \
.SetDisplay("CCI Period", "CCI period", "Indicators")
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
@property
def rsi_period(self):
return self._rsi_period.Value
@property
def cci_period(self):
return self._cci_period.Value
def OnReseted(self):
super(histo_scalper_strategy, self).OnReseted()
self._macd = None
self._rsi = None
self._cci = None
self._prev_macd = None
def OnStarted2(self, time):
super(histo_scalper_strategy, self).OnStarted2(time)
self._macd = MovingAverageConvergenceDivergence()
self._rsi = RelativeStrengthIndex()
self._rsi.Length = self.rsi_period
self._cci = CommodityChannelIndex()
self._cci.Length = self.cci_period
subscription = self.SubscribeCandles(DataType.TimeFrame(TimeSpan.FromMinutes(30)))
subscription.Bind(self._macd, self._rsi, self._cci, self._process_candle)
subscription.Start()
def _process_candle(self, candle, macd_value, rsi_value, cci_value):
if candle.State != CandleStates.Finished:
return
if not self._macd.IsFormed or not self._rsi.IsFormed or not self._cci.IsFormed:
return
macd_line = float(macd_value)
rsi_val = float(rsi_value)
cci_val = float(cci_value)
if self._prev_macd is not None:
if self._prev_macd <= 0.0 and macd_line > 0.0 and rsi_val < 70.0 and cci_val > -100.0 and self.Position <= 0:
self.BuyMarket()
elif self._prev_macd >= 0.0 and macd_line < 0.0 and rsi_val > 30.0 and cci_val < 100.0 and self.Position >= 0:
self.SellMarket()
self._prev_macd = macd_line
def CreateClone(self):
return histo_scalper_strategy()