トレンドフォロー戦略 ストップ損失を追う距離に基づいた戦略

作者: リン・ハーンチャオチャン,日付: 2023年11月15日 11:24:16
タグ:

img

概要

この戦略は,価格トレンドを決定するためにディスタンス・クローズ・バーズ (DCB) インジケーターとフィルターとして急速なRSIインジケーターを使用し,取引後のトレンドのためにストップロスを実行します.また,ポジションサイズ化のためにマルチンゲール原理を使用します.中長期トレンド取引に適しています.

原則

  1. 最後の緑色のバーの閉じると最後の赤いバーの閉じるを表すlastgとlastrを計算します.

  2. lastg と lastr の差としてdist を計算する.

  3. 30 期間の SMA の dist として計算します.

  4. Dist は 2 倍以上の時 取引信号を生成します

  5. 信号をフィルタリングするために 速度のRSIインジケータを使用し 誤ったブレイクを回避します

  6. シグナルがポジションがない場合,株式の固定パーセントで取引を行う.

  7. マルティンゲルは敗戦後 拡大する

  8. ストップ・ロストまたは/または/または/または/または/または/または/または/または/または/または/または/または/または/または

利点

  1. DCB指標は 中長期の傾向を効果的に把握しています

  2. RSIフィルターで 誤ったブレイクによる損失を回避します

  3. 利潤を抑え リスクをコントロールします

  4. マルティンゲルは損失後にポジションを増やして 利益を増やします

  5. 合理的なパラメータ設定は 異なる市場環境に適しています

リスク

  1. DCBは間違った信号を生成するかもしれない 他のフィルターが必要です

  2. マルティンゲルは損失を拡大し 厳格なリスク管理が必要です

  3. 誤ったストップ損失設定は過度の損失につながる可能性があります.

  4. 過剰なレバレッジを防ぐために,ポジションのサイズ化が制限されるべきです.

  5. 不適切な契約設定は 極端な市場では大きな損失をもたらす可能性があります

最適化

  1. DCBのパラメータを最適化して

  2. 速度のRSIフィルターを他の指標で交換してみてください.

  3. ストップ・ロスを最適化し 利益を得て 勝率を上げます

  4. マルティンゲールのパラメータを最適化して リスクを減らす

  5. 最適な資産配分のために異なる製品でテストする.

  6. マシン学習を使って パーマータを動的に最適化します

概要

DCBは,トレンドの方向性を決定し,誤ったエントリを避けるためにRSIをフィルタリングする.ストップ・ロストとテイク・プロフィートは,単一のトレード損失を効果的に制御する.しかし,リスクは依然として存在し,リスクを軽減し,安定性を向上させるためにパラメータはさらに最適化する必要があります.論理は明確で理解しやすいため,中長期トレンドトレーダーに適しています.


/*backtest
start: 2023-11-07 00:00:00
end: 2023-11-14 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Distance Strategy v1.0", shorttitle = "Distance str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(true, defval = true, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usersi = input(true, defval = true, title = "Use RSI-Filter")
periodrsi = input(7, defval = 7, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(30, defval = 30, minval = 1, maxval = 50, title = "RSI Limit")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

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

//Distance
bar = close > open ? 1 : close < open ? -1 : 0
lastg = bar == 1 ? close : lastg[1]
lastr = bar == -1 ? close : lastr[1]
dist = lastg - lastr
adist = sma(dist, 30)
plot(lastg, linewidth = 3, color = lime)
plot(lastr, linewidth = 3, color = red)
up = bar == -1 and dist > adist * 2
dn = bar == 1 and dist > adist * 2

//RSI Filter
rsidn = fastrsi < limitrsi or usersi == false
rsiup = fastrsi > 100 - limitrsi or usersi == false

//Signals
up1 = up and rsidn
dn1 = dn and rsiup
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open))

//Arrows
plotarrow(up1 ? 1 : na, colorup = blue, colordown = blue)
plotarrow(dn1 ? -1 : na, colorup = blue, colordown = blue)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

signalup = up1
if signalup
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

signaldn = dn1
if signaldn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

もっと