トレンド追跡逆転戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-16 14:44:35
タグ:

img

概要

トレンドトラッキング逆転戦略は,15分間のNQ先物に基づいた短期トレンド取引戦略である.トレンドフィルタリングと逆転パターン認識を通じて取引機会を特定する.このシンプルで効果的な戦略は,活発な短期トレーダーに適している.

戦略の論理

この戦略は主に以下の原則を基に機能する.

  1. EMA の上にある長信号と EMA の下にある短信号で 8 期間の EMA を主なトレンドフィルターとして使用する.

  2. 入力信号として特定のキャンドルスタイク逆転パターンを特定する.長い信号では長い緑色のキャンドル,短い信号では短い赤色のキャンドル,短い信号では長い赤色のキャンドル,短い信号では短い緑色のキャンドルが続く.これらのパターンは潜在的なトレンド逆転を示唆する.

  3. 入力ポイントは逆転キャンドルの高値/低値に近い位置に設定され,ストップ・ロスは逆転キャンドルの高値/低値に設定され,効率的なリスク/リターン比率が可能になります.

  4. キャンドルストイック関係ルールを用いて反転信号を検証します.例えば,赤いキャンドルのオープン価格が最後の緑色のキャンドルのボディよりも高く,ボディが完全に吸収され,ノイズをフィルターします.

  5. 特定の取引時間にのみ戦略を実行し,不規則な価格動向による不必要な損失を防ぐために,主要な契約ロールオーバーなどの波動期を避けます.

利点分析

この戦略の主な利点は以下の通りである.

  1. シンプルで効果的な信号ロジックで 簡単に理解し実行できます

  2. トレンドと逆転をベースに 暴走する牛と熊の市場からの 衝撃を避けます

  3. 資本の維持のために合理的なストップロスの配置を伴う良好なリスク管理

  4. 低データ需要は様々なプラットフォームとツールに適しています

  5. 高い取引頻度は 短期間のアクティブ・トレーディングスタイルに適しています

リスク と 解決策

リスクはいくつかあります.

  1. 逆転の機会が不足し 信号が限られている. 逆転基準を緩和して,より多くの信号を許可する.

  2. 時折 誤った突破 組み合わせ論理のフィルターを追加

  3. 夜間と非メインセッションの変動 戦略操作を米国取引時間に制限する

  4. 制限された最適化柔軟性.よりよいパラメータ調整のために機械学習を考慮してください.

増進 の 機会

改善の余地があります

  1. トレンド定義を改善するために,より長い EMA 期間をテストします.

  2. 追加傾向フィルターとして株式指数フィルターを追加します.

  3. 機械学習技術を使って 自動入力と停止損失レベルを調整します

  4. 変動調整のポジションサイズと動的ストップを導入する.

  5. 単一の資産のシステムリスクの多様化のために,クロス・アセット・アービタージを模索する.

結論

トレンドトラッキング逆転戦略は,限られたパラメータと良好な個人リスク管理で実装しやすい非常に実用的な短期戦略フレームワークを提供しています.デイトレーディングフォーラムで活発な短期トレーダーに適しています.さらなるR&Dにより,中長期のアルゴリズム取引に潜在的に適用され,強力な汎用性と開発可能性を示しています.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 3h
basePeriod: 15m
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/
// © bdrex95

//@version=5

// Rob Reversal Strategy - Official
// Using Rob Reversal Indicator: Original
// Description
// This indicator is based on the strategy created by Trader Rob on the NQ 15m chart.
// 
// Timeframe for trading is 8:30am-1:15pm Central.
// 
// Above the EMA line, look for a long position. You will have a short candle, then a long candle that opens below the short candle. It will have a lower high and a lower low. Once the long candle closes, your entry will be 1 tick above the wick (green line) and stop loss will be at the bottom of the bottom wick (red line).
// 
// Below the EMA line, look for a short position. You will have a long candle, then a short candle that opens above the long candle. It will have a higher high and a higher low. Once the short candle closes, your entry will be 1 tick below the wick (green line) and stop loss will be at the top of the top wick (red line).
//

strategy("Trader Rob Reversal Strategy NQ 15min", shorttitle="Official Rob Rev Strat", overlay=true)


//--- Session Input ---
sess = input(defval = "0930-1415", title="Trading Session")
t = time(timeframe.period, sess)
sessionOpen = na(t) ? false : true

flat_time = input(defval = "1515-1558", title="Close All Open Trades")
ft = time(timeframe.period, flat_time)
flatOpen = na(ft) ? false : true


// Calculate start/end date and time condition
startDate = input(timestamp('2018-12-24T00:00:00'),group = "ALL STRATEGY SETTINGS BELOW")
finishDate = input(timestamp('2029-02-26T00:00:00'),group = "ALL STRATEGY SETTINGS BELOW")
time_cond = true


emaColor = input.color(color.orange, title="EMA Color")
emaLength = input.int(8, title="EMA Length")


emaInd = ta.ema(close, emaLength)


rr = input(1.0,"Enter RR",group = "TP/SL CONDITION INPUTS HERE")


sellShapeInput = input.string("Arrow", title="Sell Entry Shape", options=["Arrow", "Triangle"])
buyShapeInput = input.string("Arrow", title="Buy Entry Shape", options=["Arrow", "Triangle"])


sellShapeOption = switch sellShapeInput
    "Arrow" => shape.arrowdown
    "Triangle" => shape.triangledown
   
buyShapeOption = switch buyShapeInput
    "Arrow" => shape.arrowup
    "Triangle" => shape.triangleup


O = open
C = close
H = high
L = low


sellEntry = (C[1] > O[1]) and (C < O) and (H[1] < H) and (C < H[1]) and (C > L[1]) and (L > L[1]) and (C < emaInd) and sessionOpen and time_cond
buyEntry = (C[1] < O[1]) and (C > O) and (H[1] > H) and (L[1] > L) and (C < H[1]) and (C > L[1]) and (C > emaInd) and sessionOpen and time_cond


sellEntry_index = ta.valuewhen(sellEntry,bar_index,0)
sellEntry_hi = ta.valuewhen(sellEntry,high,0)
sellEntry_low = ta.valuewhen(sellEntry,low,0)
buyEntry_index = ta.valuewhen(buyEntry,bar_index,0)
buyEntry_hi = ta.valuewhen(buyEntry,high,0)
buyEntry_lo = ta.valuewhen(buyEntry,low,0)


plotshape(buyEntry, color = color.green, location = location.belowbar, style = buyShapeOption, size = size.small)
plotshape(sellEntry, color = color.red, location = location.abovebar, style = sellShapeOption, size = size.small)
plot(emaInd, color=emaColor)


// Risk Management
entry_price_long = (buyEntry_hi + syminfo.mintick)
entry_price_short = (sellEntry_low - syminfo.mintick)
long_sl_price = (buyEntry_lo-syminfo.mintick)
short_sl_price = (sellEntry_hi + syminfo.mintick)
long_tp_price = ((entry_price_long - long_sl_price)*rr) + entry_price_long
short_tp_price = entry_price_short - ((short_sl_price - entry_price_short)*rr)


long_sl_ticks = (entry_price_long - long_sl_price) / syminfo.mintick
short_sl_ticks = (short_sl_price - entry_price_short) / syminfo.mintick


long_tp_ticks = (long_tp_price - entry_price_long) / syminfo.mintick
short_tp_ticks = (entry_price_short - short_tp_price) / syminfo.mintick


// Positions
if (buyEntry)
    strategy.entry("Long", strategy.long,stop = H + syminfo.mintick)
if strategy.position_size > 0
    strategy.exit("Long Ex","Long", loss = long_sl_ticks, profit = long_tp_ticks, comment_loss = "SL Long", comment_profit = "TP Long")


if (sellEntry)
    strategy.entry("Short", strategy.short,stop = L - syminfo.mintick)
if strategy.position_size < 0
    strategy.exit("Short Ex","Short",loss = short_sl_ticks, profit = short_tp_ticks, comment_loss = "SL Short", comment_profit = "TP Short")


// Cancel order if close beyond ema
if (C < emaInd)
    strategy.cancel("Long")


if (C > emaInd)
    strategy.cancel("Short")


// Go flat at close (for futures funded account)
if strategy.position_size > 0 and flatOpen
    strategy.close_all(comment = "EOD Flat")
if strategy.position_size < 0 and flatOpen
    strategy.close_all(comment = "EOD Flat")
 
//END

もっと