資源の読み込みに... 荷物...

クロスオーバー TSI戦略

作者: リン・ハーンチャオチャン,日付: 2024-06-07 16:36:24
タグ:TSIについてエイマATRTEMA について

img

概要

この戦略は,TSIインジケーターを主要取引信号として使用する.TSIインジケーターが信号線を横切り,TSIインジケーターが下限以下または上限以上になると,戦略はオープンポジション信号を生成する.同時に,戦略のパフォーマンスを最適化するためにEMAとATRなどの指標も使用する.戦略は特定の取引セッション内でのみ実行され,過剰取引を制御するための最低取引頻度を設定する.

戦略原則

  1. TSI インジケーター値と信号線値を計算する.
  2. 現在の時間が許容される取引範囲内にあり,現在のバーは少なくとも最後の取引から指定された最小数のバーであるかどうかを決定します.
  3. TSI インジケーターが信号線を下から上を通過し,信号線が指定された下限以下であれば,長い信号が生成される.
  4. TSI インジケーターが上から信号線を下に横断し,信号線が指定された上限を超えると,ショート信号が発生する.
  5. 現在ロングポジションを保持している場合は,TSI指示が上から信号線を下に突入すると,すべてのロングポジションを閉じる.
  6. 現在ショートポジションを保持している場合,TSI指示が信号線を下から上を通過すると,すべてのショートポジションを閉じる.

利点分析

  1. 戦略の論理は明確で,TSI指標のクロスを ポジションの開設と閉じる唯一の条件として使用し,単純で理解が容易です.
  2. 取引セッションと取引頻度を制限することで,過剰取引のリスクは効果的に制御されます.
  3. 適時ストップ・ロストとストップ・プロフィット 反対の信号が表示されると,決定的にポジションを閉じて,単一の取引のリスクを制御します
  4. 判断に役立つ複数の指標が用いられ,EMA,ATRなどの指標が戦略の信頼性を高めます.

リスク分析

  1. この戦略は,STI指標パラメータの選択に非常に敏感で,異なるパラメータは大きな性能差をもたらし,慎重に選択する必要があります.
  2. オープニングと終了条件は比較的シンプルで,トレンド判断や波動性の制約が欠けていて,振動する市場で損失をもたらす可能性があります.
  3. ポジション管理やファンド管理がないため,引き上げをコントロールするのは困難です. 一旦継続的な損失が発生すると,大きな引き上げになります.
  4. トレンドトラッキングではなく 長い短期逆転をするだけで 多くのトレンド機会を逃します

最適化方向

  1. より堅牢なパラメータ組み合わせを見つけるため,TSI指標のパラメータを最適化します.遺伝子アルゴリズムなどの自動最適化方法を使用できます.
  2. トレンド判断指標,例えばMAまたはMACDを追加し,成功率を向上させるためにポジションを開くときにトレンド方向を選択します.
  3. ATRなどの変動指標を追加し,高変動市場環境での取引数を減らす.
  4. ポジション管理モデルを導入し,最近の市場業績と口座純額に基づいて,各取引のポジションサイズを動的に調整する.
  5. トレンド・トラッキング・ロジックは,大きなトレンドを把握する戦略の能力を向上させるために,トレンド・マーケットのポジションを維持するために追加することができます.

概要

この戦略は,TSIインジケーターをベースに,TSIとその信号線の交差点を通じて取引信号を生成する.同時に,リスクを制御するために取引時間と頻度を制限する.戦略の利点は,論理が単純で明確で,損失と利益を間に合って停止することである.しかし,デメリットは,トレンド判断とポジション管理の欠如,TSIパラメータに対する敏感性であり,トレンドの逆転市場を捕捉するだけで市場を欠けている.将来,戦略はトレンドと変動判断,ポジション管理,パラメータ最適化などの側面から改善することができる.


/*backtest
start: 2024-05-30 00:00:00
end: 2024-06-06 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © nikgavalas

//@version=5
strategy("TSI Entries", overlay=true, margin_long=100, margin_short=100)

//
// INPUTS
//

// Define the start and end hours for trading
string sessionInput = input("1000-1530", "Session")

// Day of the week.
string daysInput = input.string("23456", tooltip = "1 = Sunday, 7 = Saturday")

// Minimum number of bar's between entries
requiredBarsBetweenEntries = input.int(12, "Required Bars Between Entries")

// Show debug labels
bool showDebugLabels = input.bool(false, "Show Debug Labels")

//
// FUNCTIONS
//

//@function Define the triple exponential moving average function
tema(src, len) => tema = 3 * ta.ema(src, len) - 3 * ta.ema(ta.ema(src, len), len) + ta.ema(ta.ema(ta.ema(src, len), len), len)

//@function Atr with EMA
atr_ema(length) =>
    trueRange = na(high[1])? high-low : math.max(math.max(high - low, math.abs(high - close[1])), math.abs(low - close[1]))
    //true range can be also calculated with ta.tr(true)
    ta.ema(trueRange, length)

//@function Check if time is in range
timeinrange() => 
    sessionString = sessionInput + ":" + daysInput
    inSession = not na(time(timeframe.period, sessionString, "America/New_York"))

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, y, style) =>
    if (showDebugLabels) 
        label.new(bar_index, y, text = txt, color = color, style = style, textcolor = color.black, size = size.small)


//
// INDICATOR CODE
//

long = input(title="TSI Long Length", defval=8)
short = input(title="TSI Short Length", defval=8)
signal = input(title="TSI Signal Length", defval=3)
lowerLine = input(title="TSI Lower Line", defval=-50)
upperLine = input(title="TSI Upper Line", defval=50)

price = close
double_smooth(src, long, short) =>
	fist_smooth = ta.ema(src, long)
	ta.ema(fist_smooth, short)

pc = ta.change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(math.abs(pc), long, short)
tsiValue = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
signalValue = ta.ema(tsiValue, signal)

//
// COMMON VARIABLES
//

var color trendColor = na
var int lastEntryBar = na

bool tradeAllowed = timeinrange() == true and (na(lastEntryBar) or bar_index - lastEntryBar > requiredBarsBetweenEntries)

// 
// CROSSOVER
//

bool crossOver = ta.crossover(tsiValue, signalValue)
bool crossUnder = ta.crossunder(tsiValue,signalValue)

if (tradeAllowed) 
	if (signalValue < lowerLine and crossOver == true)
		strategy.entry("Up", strategy.long)
		lastEntryBar := bar_index

	else if (signalValue > upperLine and crossUnder == true)

		strategy.entry("Down", strategy.short)
		lastEntryBar := bar_index

// 
// EXITS
// 

if (strategy.position_size > 0 and crossUnder == true)
	strategy.close("Up", qty_percent = 100)

else if (strategy.position_size < 0 and crossOver == true)
	strategy.close("Down", qty_percent = 100)


関連性

もっと