オープン・ハイ・ロースト・ロスト・トラッキング戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-18 14:30:08
タグ:

img

概要

この戦略は,エントリのためのトレンド逆転点を特定するために,キャンドルスティックチャートのオープン,ハイ,ローデータに基づいて設計されています.エントリ後,ATR指標に基づいてストップ損失ラインが設定され,追跡されます.リスク・リワード比率に基づいてターゲットは計算されます.価格がストップ損失または利益目標に達すると,オーダーが閉鎖されます.

戦略の論理

この戦略のエントリーシグナルは,オープン価格,高値,低値から発生する.開通価格がキャンドルスティックの低値に等しいとき,購入信号が生成され,開通価格が高値に等しいとき,販売信号が生成され,潜在的なトレンド逆転の機会を示します.

入力後,動的トレーリングストップロスはATR指標に基づいて計算されます.ロングストップロスは最近のNバーマイナス1ATRの最低値に設定され,ショートストップロスは最近のNバープラス1ATRの最高値に設定されます.ストップロスはトレルの価格動きに動的に更新されます.

利益目標は,リスク・リターン比の設定に基づいて計算される.ロングターゲットはエントリー価格プラス (エントリー価格とストップ損失との間のリスク差をリスク・リターン比で掛け合わせ) で設定される.ショートターゲットはエントリー価格マイナス (ストップ損失とエントリー価格との間のリスク差をリスク・リターン比で掛け合わせ) で設定される.

価格がストップ・ロストまたは利益目標に達すると,オーダーはフラットポジションに送られます.

利点分析

この戦略の利点は以下の通りです.

  1. シンプルで明瞭な入口信号で 複数回の鞭打ちを避けます

  2. ダイナミックなATR追跡ストップは 利益のロックを防ぎ 高低を追いかけるのを防ぎます

  3. リスク・報酬比の制御は 利益をテーブルに置き去ることや 過剰な取引を 避けます

  4. 異なる製品に適用され,最適化が簡単です

リスク分析

この戦略にはいくつかのリスクもあります:

  1. 市場への入場が遅れて 市場への入場が最悪になる可能性があります

  2. ストップ・ロスは,必要のないストップ・ロスを発生させたり,利益を失わせたりします.

  3. トレンドが決まっていないので 市場が変わってしまう傾向があります

  4. 夜間のポジションを処理できない.

最適化方向は以下のとおりです.

  1. 傾向偏見の他の指標を組み込む

  2. ATR パラメータを調整したり ストップロスの改善のために 波動性制御を追加したりします

  3. 信号ノイズを減らすために 傾向フィルタを追加します

  4. 特定の製品では夜間位置処理を追加します.

結論

結論として,これは明確なエントリーロジック,合理的なストップ・ロスの方法論,良質なリスク制御を持つシンプルで直接的な戦略です.しかし,十分なトレンドバイアス,シグナル遅延などのようないくつかの制限があります.これらの欠陥は,将来の最適化の方向性も指摘しています.より多くの指標フィルターとリスク管理モジュールを組み込むことで,この戦略はさらに強化され,より堅牢にすることができます.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



もっと