ダブルレーザー トレンド 検索 戦略

作者: リン・ハーンチャオチャン開催日:2023年11月6日 (火) 10:01:42
タグ:

img

概要

この戦略は,ボリンガーバンド,ケルターチャネル,適応相対強度指数を使用して,現在のトレンド方向を決定し,エントリーをタイミングするためにパラボリックSARと組み合わせます.これらの3つの指標の判断が一致すると,取引信号が生成されます.この戦略は主にトレンド方向を判断し,トレンドが変化すると,利益を目指してタイムリーに入ります.

原則

この戦略は,次の3つの技術指標を組み合わせ,現在の傾向を決定します.

  1. SQUEEZEモメントインディケーター:ボリンジャー帯とケルターチャネルを計算する.両帯が重なり合っているとき,圧縮を生成し,迫りつつあるトレンド変化をシグナルします.圧縮状態と線形回帰傾斜を返します.

  2. RSI Volume Weighted: RSIをボリュームで計算する.オーバーカップ/オーバーセールレベルを決定するために中点を使用する.ボリュームの変化を強調する.

  3. パラボリックSAR:現在の価格の位置をSAR線との関係で判断する.価格上のSARは下落傾向を示し,価格下のSARは上昇傾向を示します.

この戦略は,トレンド方向を決定するためにボリンジャー帯,それを精製するためにケルトナーチャネル,過剰購入/過剰販売時に逆転機会を見つけるためにRSI,およびエントリーをタイミングするためにSARを使用します.論理は:

  1. ボリンガー帯,ケルトナーチャンネル,圧縮指標を計算します. 圧縮が起こると待機状態に入ります.

  2. RSIを計算します. 中点以上のRSIは上昇傾向を示し,中点以下の下落傾向を示します.

  3. 価格の下のSARは上昇傾向を示し,価格上のSARは下落傾向を示します.

  4. この3つの指標を組み合わせると,圧縮が起こると,RSIは中点以上,SARは価格を下回り,ロング信号が生成されます.圧縮が起こると,RSIは中点以下,SARは価格上回り,ショート信号が生成されます.

  5. シグナルが起動すると,前のバーの3つのインジケーターの判断が現在の信号の反対かどうかを確認します.そうであれば,取引を入力します.

  6. ストップ・ロスを設定して 利益を取ります

利点

この戦略の利点は

  1. 複数の指標の組み合わせにより,トレンド判断の正確性が向上します.Squeezeはトレンド変化を正確に検出し,RSIは過剰購入/過剰販売レベルを明確に識別し,SARはエントリーを正確に倍します.

  2. インディケーターの論理は シンプルで分かりやすいです

  3. 複数の指標の確認は 偽のブレイクをフィルタリングするのに役立ちます

  4. ストップ・ロストとテイク・プロフィートのメカニズムは 利益を固定し リスクを制限します

  5. バックテストのデータも豊富で 信頼性が保証されます

リスク

リスクもあります:

  1. 長い入力と短い入力ロジックは類似しており,矛盾する信号を生成することがあります.フィルタリングが必要です.

  2. すべての指標はパラメータ最適化を使います 過剰なフィッティングのリスクがあります

  3. 取引頻度が高く ポジションのサイズを制御する必要がある

  4. ストップ・ロスは近すぎると 簡単にストップされるかもしれません

解決策:

  1. 信号の振動を避けるため,インジケータ判断の持続性チェックを追加します.

  2. パラメータを調整し,オーバーフィッティングを防ぐために ウォーク・フォワード分析を使用します.

  3. ピラミッドのサイズを設定して 各方向の位置を制御します

  4. ストップ・ロスの価格を最適化するために,異なるストップ・ロスの範囲をテストします.

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

戦略を最適化するためのいくつかの方向性:

  1. 安定性のための指標パラメータを最適化します ダイナミック最適化を検討します

  2. 固定/等価のパーセントのような位置サイズロジックを追加します

  3. 変動や線形ストップ,ゼロポジションなど,さまざまなストップロスの方法をテストします.

  4. 固定分数位置のサイズなどです

  5. 機械学習モデルを使って ダイナミックな入力と出口をします

  6. 関連システムリスクを減らすために,長期と短期の両方を選択することで,ヘッジメカニズムを追加します.

  7. より多くの指標を考慮し 投票メカニズムを構築して 精度を向上させましょう

結論

この戦略は,トレンド方向を決定するために複数の指標を使用し,賢明に圧縮を入力する明確な論理を持っています.ストップ損失と利益のメカニズムはリスクを制限します.パラメータ最適化とリスク制御はバックテストとライブ結果をさらに改善することができます.これはトレンド製品に適した安定したトレンドフォロー戦略であり,毎日のようなより大きなタイムフレームでも動作できます.強力な実用的な価値により,この戦略は多くの側面でさらに最適化することができます.


/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © XaviZ

//#####©ÉÉÉɶN###############################################
//####*..´´´´´´,,,»ëN########################################
//###ë..´´´´´´,,,,,,''%©#####################################
//###'´´´´´´,,,,,,,'''''?¶###################################
//##o´´´´´´,,,,,,,''''''''*©#################################
//##'´´´´´,,,,,,,'''''''^^^~±################################
//#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N###########
//#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶########
//#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë######
//©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É####
//¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ###
//N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ##
//#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N#
//#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É#
//#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£#
//##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É#
//##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ#
//###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=##
//####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©##
//#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N###
//######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§####
//########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN#####
//#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@#######
//###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É#########
//##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É###########
//#################É=~~~~~~~~~~~~~~^^^*~'''*~?§##############
//#####################N§£I/~~~~~~»*?~»o§æN##################

//@version=4
strategy(title="M-SQUEEZE", overlay = true)

//study(title="M-SQUEEZE", overlay = true)

src = input(close, "SOURCE", type = input.source)

// ███▓▒░░ VARIABLES ░░▒▓███

var bool longCond = na, var bool shortCond = na
var int CondIni_long0 = 0, var int CondIni_short0 = 0
var int CondIni_long = 0, var int CondIni_short = 0
var float last_open_longCondition = na, var float last_open_shortCondition = na
var int last_longCondition0 = na, var int last_shortCondition0 = na
var int last_longCondition = na, var int last_shortCondition = na
var bool long_tp = na, var bool short_tp = na
var int last_long_tp = na, var int last_short_tp = na
var bool Final_Long_tp = na, var bool Final_Short_tp = na
var bool SMI_longCond = na, var bool SMI_shortCond = na
var bool RSI_longCond = na, var bool RSI_shortCond = na
var bool ADX_longCond = na, var bool ADX_shortCond = na
var bool SAR_longCond = na, var bool SAR_shortCond = na
var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na
var bool Final_longCondition = na, var bool Final_shortCondition = na

// ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███

Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR")
BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1)
BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1)
KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1)
KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1)

SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=>

    // Calculate BB
    basis = sma(_src, _BB_length)
    dev = _BB_mult * stdev(_src, _BB_length)
    upperBB = basis + dev
    lowerBB = basis - dev
    // Calculate KC
    ma = sma(src, _KC_length)
    rangema = sma(tr, _KC_length)
    upperKC = ma + rangema * _KC_mult
    lowerKC = ma - rangema * _KC_mult
    // Squeeze
    sqzOn = lowerBB > lowerKC and upperBB < upperKC
    sqzOff = lowerBB < lowerKC and upperBB > upperKC
    nosqz = sqzOn == false and sqzOff == false
    // Linear Regression curve
    val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0)
    [nosqz,val]
    
[NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult)

barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon)))

// ███▓▒░░ SAR ░░▒▓███

Act_SAR = input(true, "PARABOLIC SAR")
Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01)
Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01)
Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01)

SAR = sar(Sst, Sinc, Smax)
plot(SAR, style = plot.style_cross, title = "SAR")

// ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███

Act_RSI = input(true, "RSI VOLUME WEIGHTED")
RSI_len = input(22, "RSI LENGHT", minval = 1)
RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1)

WiMA(_src, _length)=> 
    var float MA_s=0.0
    MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length
    MA_s

RSI_Volume(fv, length)=>	
	up=iff(fv>fv[1],abs(fv-fv[1])*volume,0)
	dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0)
	upt=WiMA(up,length)
	dnt=WiMA(dn,length)
	100*(upt/(upt+dnt))

RSI_V = RSI_Volume(src, RSI_len)

// ███▓▒░░ STRATEGY ░░▒▓███

SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) 
RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond)
SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond)

SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) 
RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond)
SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond)

longCond := SMI_longCond and RSI_longCond and SAR_longCond
shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond

CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1]
CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1]

longCondition0 = (longCond and CondIni_long0[1] == -1)
shortCondition0 = (shortCond and CondIni_short0[1] == 1)

CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1]
CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1]

longCondition = (longCond[1] and CondIni_long[1] == -1)
shortCondition = (shortCond[1] and CondIni_short[1] == 1)

// ███▓▒░░ ALERTS & SIGNALS ░░▒▓███

plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny)
plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny)

//alertcondition(longCondition, title="Long Alert", message = "LONG") 
//alertcondition(shortCondition, title="Short Alert", message = "SHORT")

// ███▓▒░░ BACKTESTING ░░▒▓███

testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, 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)
testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222)
testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12)
testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false

strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod)
strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)


もっと