ホーム
/
戦略のサンプル
GitHub で見る
Exp T3 TRIX 戦略 (ID 2946)
Exp T3 TRIX戦略は、三重平滑化TRIXオシレーターを中心に構築されたMetaTrader 5エキスパートアドバイザーを複製します。Tillson T3平滑化を適用して高速と低速のTRIXストリームを生成し、3つの選択可能なモードを使用してモメンタムの反転に反応します。各モードはヒストグラムまたは高速と低速コンポーネントの相対位置が戦略がポジションを入ったり出たりする前にどのように振る舞う必要があるかを制御します。
トレードロジック
Tillson T3 TRIX計算
同じ長さの6つの指数移動平均の2つのスタックが高速と低速のストリームのTillson T3値を生成します。
各T3値の導関数(現在値から前の値を引き前の値で割る)が意思決定に使用されるTRIXヒストグラムになります。
モード = Breakdown
ロングエントリー :ロングエントリーが有効な間、高速TRIXがゼロ以下からゼロ以上にクロス。開いているショートポジションはまず閉じられます(ショート決済が許可されている場合)。
ショートエントリー :ショートエントリーが有効な間、高速TRIXがゼロ以上からゼロ以下にクロス。開いているロングポジションはまず閉じられます(ロング決済が許可されている場合)。
決済のみ :クロスが発生しても対応するエントリーが無効な場合、関連する決済許可が有効であれば戦略は依然として反対のエクスポージャーをクローズします。
モード = Twist
ロングエントリー :高速TRIXの傾きが負から正に変化(つまり現在のバーが下落後に上昇)。戦略はBreakdownモードからのクローズと許可ルールを反映します。
ショートエントリー :高速TRIXの傾きが正から負に変化。
モード = CloudTwist
ロングエントリー :高速TRIXが前の完成したバーでその下にあった後に低速TRIXより上に移動。
ショートエントリー :高速TRIXが前のバーでその上にあった後に低速TRIXより下に落ちる。
注文処理
反転シグナルが現れ決済が許可されると、戦略はまず反対のエクスポージャーをクローズします。
新しい注文は Volume + |Position| を使用するので、許可されている場合に反転を単一のトレードで実行できます。
StartProtection() が起動されてオリジナルプロジェクトテンプレートからStockSharpの組み込みセーフティレイヤーを再利用します。
パラメーター
パラメーター
デフォルト値
説明
Fast Length
10
高速Tillson T3スタックに使用される深度(6つのリンクされたEMA)。
Slow Length
18
低速Tillson T3スタックに使用される深度。
Volume Factor
0.7
Tillson T3平滑化係数(0から1)。
Mode
Twist
Breakdown、Twist、またはCloudTwistシグナル検出を選択。
Allow Long Entry
true
ロングポジションのオープンを有効化。
Allow Short Entry
true
ショートポジションのオープンを有効化。
Allow Long Exit
true
ロングポジションのクローズを有効化。
Allow Short Exit
true
ショートポジションのクローズを有効化。
Candle Type
4時間時間軸
ローソク足を要求してインジケーターチェーンを供給するための集計間隔。
すべてのパラメーターは StrategyParam<T> を通じて公開されており、DesignerのUIで表示可能で最適化の準備ができています。
使用上の注意
ロジックは完成したローソク足のみで機能します。データソースが Candle Type で設定された時間軸を提供することを確認してください。
TRIX導関数は履歴値を必要とするため、最初の2つの完成したローソク足は初期化に使用されシグナルを生成しません。
MetaTraderの動作を複製するには、一方向のトレードや決済の抑制が必要な場合は対応する Allow ... フラグを無効にしてください。
ストップロスやテイクプロフィットレベルなどのリスク管理はオリジナルのエキスパートアドバイザーには含まれておらず、したがってここでは実装されていません。必要に応じてStockSharpのマネー管理モジュールと組み合わせてください。
変換の詳細
ソース:MQL/2156/exp_t3_trix.mq5 とインジケーター t3_trix.mq5。
APIポートはStockSharpの高レベルローソク足サブスクリプションとインジケータークラスを使用しながら同じ3つのシグナルモードを実装します。
Tillson T3平滑化は6つの連鎖指数移動平均と Volume Factor で調整可能な正規の0.7ボリュームファクターを使用して再作成されます。
using System;
using System.Collections.Generic;
using StockSharp.Algo.Indicators;
using StockSharp.Algo.Strategies;
using StockSharp.BusinessEntities;
using StockSharp.Messages;
namespace StockSharp.Samples.Strategies;
/// <summary>
/// T3 TRIX strategy using TRIX indicator for momentum signals.
/// Trades on TRIX zero-line crossovers.
/// </summary>
public class ExpT3TrixStrategy : Strategy
{
private readonly StrategyParam<DataType> _candleType;
private readonly StrategyParam<int> _period;
private decimal? _prevTrix;
public DataType CandleType
{
get => _candleType.Value;
set => _candleType.Value = value;
}
public int Period
{
get => _period.Value;
set => _period.Value = value;
}
public ExpT3TrixStrategy()
{
_candleType = Param(nameof(CandleType), TimeSpan.FromHours(1).TimeFrame())
.SetDisplay("Candle Type", "Timeframe", "General");
_period = Param(nameof(Period), 14)
.SetGreaterThanZero()
.SetDisplay("Period", "TRIX period", "Indicators");
}
public override IEnumerable<(Security sec, DataType dt)> GetWorkingSecurities()
{
return [(Security, CandleType)];
}
/// <inheritdoc />
protected override void OnReseted()
{
base.OnReseted();
_prevTrix = null;
}
protected override void OnStarted2(DateTime time)
{
base.OnStarted2(time);
_prevTrix = null;
var trix = new Trix { Length = Period };
var subscription = SubscribeCandles(CandleType);
subscription
.Bind(trix, ProcessCandle)
.Start();
var area = CreateChartArea();
if (area != null)
{
DrawCandles(area, subscription);
DrawOwnTrades(area);
}
var indArea = CreateChartArea();
if (indArea != null)
{
DrawIndicator(indArea, trix);
}
}
private void ProcessCandle(ICandleMessage candle, decimal trixValue)
{
if (candle.State != CandleStates.Finished)
return;
if (!IsFormedAndOnlineAndAllowTrading())
{
_prevTrix = trixValue;
return;
}
if (_prevTrix == null)
{
_prevTrix = trixValue;
return;
}
// TRIX crosses above zero → buy
if (_prevTrix.Value <= 0 && trixValue > 0)
{
if (Position < 0)
BuyMarket();
if (Position <= 0)
BuyMarket();
}
// TRIX crosses below zero → sell
else if (_prevTrix.Value >= 0 && trixValue < 0)
{
if (Position > 0)
SellMarket();
if (Position >= 0)
SellMarket();
}
_prevTrix = trixValue;
}
}
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 Trix
from StockSharp.Algo.Strategies import Strategy
class exp_t3_trix_strategy(Strategy):
def __init__(self):
super(exp_t3_trix_strategy, self).__init__()
self._candle_type = self.Param("CandleType", DataType.TimeFrame(TimeSpan.FromHours(1))) \
.SetDisplay("Candle Type", "Timeframe", "General")
self._period = self.Param("Period", 14) \
.SetDisplay("Period", "TRIX period", "Indicators")
self._prev_trix = None
@property
def CandleType(self):
return self._candle_type.Value
@property
def Period(self):
return self._period.Value
def OnReseted(self):
super(exp_t3_trix_strategy, self).OnReseted()
self._prev_trix = None
def OnStarted2(self, time):
super(exp_t3_trix_strategy, self).OnStarted2(time)
self._prev_trix = None
trix = Trix()
trix.Length = self.Period
subscription = self.SubscribeCandles(self.CandleType)
subscription.Bind(trix, self._on_process).Start()
area = self.CreateChartArea()
if area is not None:
self.DrawCandles(area, subscription)
self.DrawOwnTrades(area)
ind_area = self.CreateChartArea()
if ind_area is not None:
self.DrawIndicator(ind_area, trix)
def _on_process(self, candle, trix_value):
if candle.State != CandleStates.Finished:
return
tv = float(trix_value)
if not self.IsFormedAndOnlineAndAllowTrading():
self._prev_trix = tv
return
if self._prev_trix is None:
self._prev_trix = tv
return
# TRIX crosses above zero
if self._prev_trix <= 0 and tv > 0:
if self.Position < 0:
self.BuyMarket()
if self.Position <= 0:
self.BuyMarket()
# TRIX crosses below zero
elif self._prev_trix >= 0 and tv < 0:
if self.Position > 0:
self.SellMarket()
if self.Position >= 0:
self.SellMarket()
self._prev_trix = tv
def CreateClone(self):
return exp_t3_trix_strategy()