GitHub で見る
SilverTrend ColorJFatl Digit MMRec 戦略
概要
この戦略は MetaTrader エキスパートアドバイザー Exp_SilverTrend_ColorJFatl_Digit_MMRec の StockSharp 版である。2つの独立したロジックモジュールが独自の仮想ポジションサイズを管理し、それらを最終的な戦略のポジションに組み合わせるデュアルブロックアーキテクチャを再現する:
- SilverTrend ブロック – SilverTrend インジケーターが生成するローソク足の色を読み取り、価格が適応チャネル境界を越えるタイミングを検出する。
- ColorJFatl ブロック – 公開されたウェイトテーブルと MetaTrader で使用される Jurik 移動平均をエミュレートする EMA ベースのスムーザーを使用して、フィルター処理された FATL(Fast Adaptive Trend Line)を計算する。
両モジュールは独立してロングとショートの取引を開き、新しいシグナルで反対のエクスポージャーを決済し、それぞれのストップロスとテイクプロフィット距離を適用できる。戦略の最終ポジションは2つのブロックが管理する仮想ポジションの合計に等しい。
デフォルト設定
- シンボル: StockSharp で選択された戦略の銘柄。
- 時間軸: 両モジュールはデフォルトで6時間足を使用(パラメーターで設定可能)。
- 注文サイズ: 各モジュールは個別のボリュームパラメーターで成行注文を送る(デフォルト
1)。
インジケーターとシグナルロジック
SilverTrend ブロック
- 最後の
SSP 本のローソク足からローリング価格チャネルを構築する。
- チャネル境界を高値/安値の範囲内に移動させるために元の
Risk シフト (33 - Risk) / 100 を適用する。
- MetaTrader インジケーターと同様に、アクティブなトレンドに従って各ローソク足を色付けする(
0/1 強気、3/4 弱気、2 中立)。
- シグナル:
- ロング: 設定された
Signal Bar のローソク足が前のバーが強気でなかった間に強気になる(color < 2 かつ前の > 1)。
- ショート: 前のバーが弱気でなかった間に弱気になる(
color > 2 かつ前の < 3)。
- オプションのストップロスとテイクプロフィットレベルは、銘柄の価格ステップを使用してポイントで測定される。
ColorJFatl ブロック
- 選択した
Applied Price ソースに公式係数テーブルを適用して FATL 値を構築する。
- 長さ
JMA Length の EMA で結果をスムーズにする(Jurik フェーズ入力は互換性とドキュメント目的のために保持される)。
- 傾斜に従って FATL ラインを色付けする:
2 は上昇、0 は下降、1 は平坦セグメント。
- シグナル:
- ロング: 前の色が
0 または 1 の間に FATL の色が 2 に変わる。
- ショート: 前の値が
1 または 2 の間に色が 0 に変わる。
- 各方向は、新しい取引を開く前にオプションで反対のブロックポジションを決済できる。
リスク管理
- SilverTrend と ColorJFatl はそれぞれ独自のエントリー価格とストップ/ターゲット距離を維持する。
- ストップまたはターゲットが達成されると、影響を受けたブロックのみが仮想ポジションを決済する(他のブロックはオープンのままである可能性がある)。
- 両方のブロックが同じ方向で一致すると、ボリュームが累積される。
パラメーター
| グループ |
名前 |
説明 |
| SilverTrend |
Silver Candle Type |
SilverTrend インジケーターに使用するローソク足サブスクリプション。 |
| SilverTrend |
SSP |
ローリング高値/安値レンジの長さ。 |
| SilverTrend |
Risk |
チャネル収縮係数(オリジナルの Risk 入力)。 |
| SilverTrend |
Signal Bar |
シグナルに使用するバーシフト(0 = 現在の閉じたバー、1 = 前のバーなど)。 |
| SilverTrend |
Allow Silver Long/Short |
各方向のエントリーを有効にする。 |
| SilverTrend |
Close Silver Long/Short |
反対のポジションの自動決済を許可する。 |
| SilverTrend |
Silver Volume |
SilverTrend ブロックが開く取引のボリューム。 |
| SilverTrend |
Silver SL/TP |
ポイント単位のストップロスとテイクプロフィット距離。 |
| ColorJFatl |
Color Candle Type |
FATL 計算に使用するローソク足サブスクリプション。 |
| ColorJFatl |
JMA Length |
JMA をエミュレートする EMA スムーザーの長さ。 |
| ColorJFatl |
JMA Phase |
完全性のために保持(StockSharp 内での直接的な影響なし)。 |
| ColorJFatl |
Applied Price |
ソース価格(終値、中央値、典型値、トレンドフォローなど)。 |
| ColorJFatl |
Digits |
FATL 値に適用される小数精度。 |
| ColorJFatl |
Color Signal Bar |
FATL シグナルに使用するバーシフト。 |
| ColorJFatl |
Allow/Close スイッチ |
各方向のエントリーと自動エグジットを有効にする。 |
| ColorJFatl |
Color Volume |
ColorJFatl ブロックが開く取引のボリューム。 |
| ColorJFatl |
Color SL/TP |
ブロックのポイント単位のストップロスとテイクプロフィット距離。 |
注意事項
- 戦略は両方のローソク足ストリームが同一であっても両方にサブスクライブする。重複したサブスクリプションは StockSharp が内部で処理する。
- Jurik フェーズパラメーターはオリジナルのエキスパートアドバイザーに近い状態を保つために保持される。StockSharp の EMA ベースのスムーザーは、パラメーターを将来の拡張のために利用可能に保ちながら、曲線的な FATL 動作を再現する。
- ポイントベースのリスク制限を使用するために、銘柄に
PriceStep が設定されていることを確認する。
使用上のヒント
- 戦略の
Volume プロパティを設定するか、ブロック固有のボリュームパラメーターを調整して絶対的なエクスポージャーを制御する。
- 組み合わせる前に各ブロックを個別にテストするために有効/無効フラグを使用する。
- ブロックは独立して動作するため、戦略は同時にネットロングとショートを保持できる(例:SilverTrend からロング、ColorJFatl からショート)。結果のポジションは両方の代数和である。
- 自動パラメーター検索を使用する予定がある場合は、ターゲット市場に合わせて
SSP、Risk、JMA Length を最適化する。
using System;
using System.Collections.Generic;
using Ecng.Common;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// SilverTrend ColorJFatl Digit MMRec strategy (simplified). Uses Highest/Lowest
/// channel breakout with EMA slope for trend confirmation and martingale recovery.
/// </summary>
public class SilverTrendColorJfatlDigitMmrecStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _channelLength;
private readonly StrategyParam<int> _emaLength;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int ChannelLength
{
get => _channelLength.Value;
set => _channelLength.Value = value;
}
public int EmaLength
{
get => _emaLength.Value;
set => _emaLength.Value = value;
}
public SilverTrendColorJfatlDigitMmrecStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(4).TimeFrame())
.SetDisplay("Candle Type", "Candles", "General");
_channelLength = Param(nameof(ChannelLength), 21)
.SetGreaterThanZero()
.SetDisplay("Channel Length", "Highest/Lowest lookback", "Indicators");
_emaLength = Param(nameof(EmaLength), 14)
.SetGreaterThanZero()
.SetDisplay("EMA Length", "EMA period for confirmation", "Indicators");
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
var highest = new Highest { Length = ChannelLength };
var lowest = new Lowest { Length = ChannelLength };
var lastTrend = 0;
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(highest, lowest, (ICandleMessage candle, decimal highVal, decimal lowVal) =>
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
return;
var range = highVal - lowVal;
if (range <= 0)
return;
var close = candle.ClosePrice;
var mid = (highVal + lowVal) / 2m;
// Channel breakout detection
if (close > highVal - range * 0.1m)
lastTrend = 1;
else if (close < lowVal + range * 0.1m)
lastTrend = -1;
// Confirm with position relative to midpoint
if (lastTrend > 0 && close > mid && Position <= 0)
BuyMarket();
else if (lastTrend < 0 && close < mid && Position >= 0)
SellMarket();
})
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawIndicator(area, highest);
DrawIndicator(area, lowest);
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 Highest, Lowest
from StockSharp.Algo.Strategies import Strategy
class silver_trend_color_jfatl_digit_mmrec_strategy(Strategy):
def __init__(self):
super(silver_trend_color_jfatl_digit_mmrec_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(4))) \
.SetDisplay("Candle Type", "Candles", "General")
self._channel_length = self.Param("ChannelLength", 21) \
.SetDisplay("Channel Length", "Highest/Lowest lookback", "Indicators")
self._last_trend = 0
@property
def CandleType(self):
return self._candle_type.Value
@property
def ChannelLength(self):
return self._channel_length.Value
def OnReseted(self):
super(silver_trend_color_jfatl_digit_mmrec_strategy, self).OnReseted()
self._last_trend = 0
def OnStarted2(self, time):
super(silver_trend_color_jfatl_digit_mmrec_strategy, self).OnStarted2(time)
self._last_trend = 0
highest = Highest()
highest.Length = self.ChannelLength
lowest = Lowest()
lowest.Length = self.ChannelLength
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(highest, lowest, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawIndicator(area, highest)
self.DrawIndicator(area, lowest)
self.DrawOwnTrades(area)
def _on_process(self, candle, high_value, low_value):
if candle.State != CandleStates.Finished:
return
hv = float(high_value)
lv = float(low_value)
rng = hv - lv
if rng <= 0:
return
close = float(candle.ClosePrice)
mid = (hv + lv) / 2.0
if close > hv - rng * 0.1:
self._last_trend = 1
elif close < lv + rng * 0.1:
self._last_trend = -1
if self._last_trend > 0 and close > mid and self.Position <= 0:
self.BuyMarket()
elif self._last_trend < 0 and close < mid and self.Position >= 0:
self.SellMarket()
def CreateClone(self):
return silver_trend_color_jfatl_digit_mmrec_strategy()