モメントブレイクは戦略を特定する

作者: リン・ハーンチャオチャン,日付: 2023年11月2日 14:39:22
タグ:

img

概要

この戦略は,急上昇する株を特定し,価格が新たな高値に突入するとロングポジションを取ります. 利益をロックするために固定パーセントの利益を取ります. この戦略はトレンドフォロー戦略に属します.

原則

この戦略は主に2つの指標に基づいています.

  1. Fast RSI: 価格動向を判断するために最近の3バーの上昇と低下を計算する. 急速なRSIが10を下回ると,過剰販売状態とみなされます.

  2. 身体フィルター:近年の20バーの平均体サイズを計算します.体サイズが平均体サイズの2.5倍以上の場合,有効なブレイクアウトとみなされます.

Fast RSIが10未満でボディフィルタが有効である場合,ロングポジションが開かれます.その後,20%の固定テイク利益が設定されます.価格がオープン価格 * (1 +テイク利益パーセント) を超えると,ポジションは閉鎖されます.

この戦略の利点は,トレンドの開始時にブレイクアウトの機会を捕捉できるということです. 急速なRSIは過剰販売レベルを判断し,ボディフィルターは偽のブレイクアウトを回避します. 固定パーセントの利益は各取引の利益にロックされ,トレンドを捕捉し続けます.

利点分析

この戦略の利点は

  1. 急速なRSIは過売値を特定し 入場精度を高めます

  2. 身体フィルターは変動によって引き起こされる 偽ブレイクを回避します

  3. 安定した利益を得て 傾向を把握します

  4. 論理は単純で明快で 分かりやすく実行できます

  5. エレガントなコード構造で 拡張性が高く 最適化も簡単です

  6. バックテストで安定したポジティブなリターンと高い勝利率です

リスク分析

注意すべきリスクは:

  1. ストップ・ロスのメカニズムがないため 損失が増えるリスクがあります

  2. 不適切な取利益レベルは 早期または深すぎる退出につながる可能性があります

  3. 不安定な市場では 連続して小規模な損失が発生する可能性があります

  4. 資金調達コストは考慮されません 実際の収益は低いかもしれません

  5. 異なる製品でパラメータの最適化が不十分です

オプティマイゼーションの方向性

いくつかの側面は最適化できる:

  1. ストップロスを追加して単一の取引損失を制御します.

  2. 動向を最適化して 傾向を追求して 利益を得る

  3. 突破論理を改良して 入力精度を向上させる

  4. ポジションサイズモジュールを追加して 資本利用を最適化します

  5. パラメータ最適化モジュールを 異なる製品に追加します

  6. 市場が不安定で 損失を避けるため フィルターを追加します

  7. 平均コスト管理を加えると考えてください

結論

概要すると,これは優雅でシンプルなトレンドフォロー戦略である.過売りレベルを特定するために高速RSI,有効なブレイクアウトを確認するためにボディフィルター,安定したリターンを生むために固定パーセントの利益を得ることを使用する.最適化のための余地があるにもかかわらず,戦略は迅速に変化する市場に対応し,非常に実践的な取引戦略に適しています.継続的な最適化により,堅牢な長期戦略になることができます.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// this is based on https://www.tradingview.com/v/PbQW4mRn/
strategy(title = "ONLY LONG V4 v1", overlay = true, initial_capital = 1000, pyramiding = 1000,
   calc_on_order_fills = false, calc_on_every_tick = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 50, commission_value = 0.075)

//study(title = "ONLY LONG V4 v1", overlay = true)

//Fast RSI
src = close
fastup = rma(max(change(src), 0), 3)
fastdown = rma(-min(change(src), 0), 3)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Body Filter
body = abs(close - open)
abody = sma(body, 20)

mac = sma(close, 20)
len = abs(close - mac)
sma = sma(len, 100)
max = max(open, close)
min = min(open, close)
up = close < open and len > sma * 2 and min < min[1] and fastrsi < 10 and body > abody * 2.5

// Strategy
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

var bool longCondition = na

longCondition := up == 1 ? 1 : na

// Get the price of the last opened long

var float last_open_longCondition = na

last_open_longCondition := longCondition ? close : nz(last_open_longCondition[1])

// Get the bar time of the last opened long

var int last_longCondition = 0

last_longCondition := longCondition ? time : nz(last_longCondition[1])

// Take profit
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

tp = input(20, "TAKE PROFIT %", type = input.float, minval = 0, step = 0.5)

long_tp = crossover(high, (1+(tp/100))*last_open_longCondition) and not longCondition

// Get the time of the last tp close

var int last_long_tp = na

last_long_tp := long_tp ? time : nz(last_long_tp[1])

Final_Long_tp = long_tp and last_longCondition > nz(last_long_tp[1])

// Count your long conditions

var int sectionLongs = 0

sectionLongs := nz(sectionLongs[1])

var int sectionTPs = 0

sectionTPs := nz(sectionTPs[1])

// Longs Counter

if longCondition
    sectionLongs := sectionLongs + 1
    sectionTPs := 0

if Final_Long_tp
    sectionLongs := 0
    sectionTPs := sectionTPs + 1
    
// Signals
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

// Long

// label.new(
//    x = longCondition[1] ? time : na, 
//    y = na, 
//    text = 'LONG'+tostring(sectionLongs), 
//    color=color.lime, 
//    textcolor=color.black,  
//    style = label.style_labelup, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.belowbar,
//    size = size.tiny)
   
// Tp

// label.new(
//    x = Final_Long_tp ? time : na, 
//    y = na, 
//    text = 'PROFIT '+tostring(tp)+'%', 
//    color=color.orange, 
//    textcolor=color.black,  
//    style = label.style_labeldown, 
//    xloc = xloc.bar_time, 
//    yloc = yloc.abovebar,
//    size = size.tiny) 

ltp = iff(Final_Long_tp, (last_open_longCondition*(1+(tp/100))), na), plot(ltp, style=plot.style_cross, linewidth=3, color = color.white, editable = false)

// Backtesting
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

testStartYear = input(2019, "BACKTEST START YEAR", minval = 1, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

strategy.entry("long", strategy.long, when = longCondition and (time >= testPeriodStart))
strategy.exit("TP", "long", limit = (last_open_longCondition*(1+(tp/100))))

// Alerts
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

alertcondition(longCondition[1], title="Long Alert", message = "LONG")
alertcondition(Final_Long_tp, title="Long TP Alert", message = "LONG TP")


もっと