ハイローストップロストレーリング戦略


作成日: 2024-02-18 14:30:08 最終変更日: 2024-02-18 14:30:08
コピー: 7 クリック数: 599
1
フォロー
1617
フォロワー

ハイローストップロストレーリング戦略

概要

この戦略は,K線を基に高低のデータでエントリーを設計し,トレンドの反転点を探します.エントリー後にATR指標に基づいてストップラインを設定し,ストップを追跡します.戦略は,リスク・リターン比率に基づいてターゲットの位置を計算し,ターゲットに達した後にまたはストップされた後に平定します.

戦略原則

この戦略のエントリーシグナルは,開いた高低点からのものです. 一つのK線の開いた価格が最低価格に等しいとき,購入シグナルが生じ,開いた価格が最高価格に等しいとき,販売シグナルが生じ,トレンド反転の機会があることを示しています.

エントリーはATR指数に基づいて動的にストロップを追跡する.購入後ストロップラインは,最近のN根K線内の最低価格にATRを1倍減算する.販売後ストロップラインは,最近のN根K線内の最高価格にATRを1倍加算する.ストロップラインは動的に更新され,価格を追跡する.

目標利益は,設定されたリスク・リターン比率に従って計算されます. 購入のターゲット価格はエントリー価格と[…]の差のリスク・リターン比率の倍数; 販売のターゲット価格はエントリー価格と[…]の差のリスク・リターン比率の倍数).

価格が止損価格または目標価格に触れたときに平仓指示を発行する.

優位分析

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

  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.")