Strategi ini menggabungkan indikator garis rata dengan indikator kurva Hall untuk mengidentifikasi arah tren pasar dan melacak pergerakan tren.
Logika transaksi utama adalah:
Perhitungan rata-rata dinamis McKinney untuk menentukan arah tren pasar secara keseluruhan
Indikator kurva Hall melintasi dan mengirimkan sinyal khusus untuk melakukan lebih banyak pengosongan
Indikator tambahan yang dapat dipilih untuk verifikasi sinyal
Menetapkan mekanisme manajemen risiko berdasarkan prinsip stop loss dan stop loss
Kurva Hall terbalik saat posisi terhenti
Strategi ini menyederhanakan proses pelacakan tren, dengan tujuan untuk menyesuaikan ritme pasar dengan sistem mekanis dan mengurangi pengaruh pemikiran pribadi.
Garis rata menentukan arah keseluruhan, indikator tambahan dapat dipilih
Kurva Hall menghasilkan sinyal kosong yang lebih jelas
Pengelolaan risiko yang lebih teratur dan mengurangi kesalahan
Pengaturan parameter dan kondisi penyaringan memerlukan pengujian optimasi
Ada ketidakpastian tentang keakuratan penilaian tren.
Kurva Hall mungkin terlambat menghasilkan sinyal yang salah
Strategi ini bertujuan untuk menyesuaikan dengan tren sistem mekanisasi dan menyederhanakan proses operasi. Namun, optimasi parameter dan pembatasan indikator masih perlu diperhatikan untuk meningkatkan stabilitas.
/*backtest
start: 2023-08-14 00:00:00
end: 2023-09-13 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// © Milleman
//@version=4
strategy("Millebot", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.04)
// Risk management settings
Spacer2 = input(false, title="=== Risk management settings ===")
Risk = input(1.0, title="% Risk")/100
RRR = input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20)
SL = input(5,title="StopLoss %",step=0.25)/100
// Baseline : McGinley Dynamic
Spacer3 = input(false, title="=== Baseline - Switch L/S ===")
McG_Source = input(close, title="McGinley source")
McG_length = input(50, title=" McG length", minval=1)
McG_LS_Switch = 0.0
McG_LS_Switch := na(McG_LS_Switch[1]) ? ema(McG_Source, McG_length) : McG_LS_Switch[1] + (McG_Source - McG_LS_Switch[1]) / (McG_length * pow(McG_Source/McG_LS_Switch[1], 4))
// Confirmation indicator
Spacer4 = input(false, title="=== Confirmation indicator ===")
C1_Act = input(false, title=" Confirmation indicator Activation")
C1_src = input(ohlc4, title="Source")
C1_len = input(5,title="Length")
C1 = sma(C1_src,C1_len)
// Entry indicator : Hull Moving Average
Spacer5 = input(false, title="=== Entry indicator configuration ===")
src = input(ohlc4, title="Source")
length = input(50,title="Length HMA")
HMA = ema(wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length))),1)
//VARIABLES MANAGEMENT
TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1]
TriggerxATR = 0.0, TriggerxATR := TriggerxATR[1]
SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1]
isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1]
//LOGIC
GoLong = crossover(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] > 1) and (not C1_Act or C1>C1[1])
GoShort = crossunder(HMA[0],HMA[1]) and strategy.position_size == 0.0 and (McG_LS_Switch/McG_LS_Switch[1] < 1) and (not C1_Act or C1<C1[1])
//FRAMEWORK
//Long
if GoLong and not GoLong[1]
isLong := true, TriggerPrice := close
TPPrice := TriggerPrice * (1 + (SL * RRR))
SLPrice := TriggerPrice * (1-SL)
Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts
strategy.entry("Long", strategy.long, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts)
strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice, qty_percent = 100)
if isLong and crossunder(HMA[0],HMA[1])
strategy.close_all(comment="TrendChange")
isLong := false
//Short
if GoShort and not GoShort[1]
isShort := true, TriggerPrice := close
TPPrice := TriggerPrice * (1 - (SL * RRR))
SLPrice := TriggerPrice * (1 + SL)
Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice //Het aantal contracts moet meegegeven worden. => budget * risk / %afstand tot SL / prijs = aantal contracts
strategy.entry("Short", strategy.short, comment=tostring(round(TriggerxATR/TriggerPrice*1000)), qty=Entry_Contracts)
strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)//, qty_percent = 100)
if isShort and crossover(HMA[0],HMA[1])
strategy.close_all(comment="TrendChange")
isShort := false
//VISUALISATION
plot(McG_LS_Switch,color=color.blue,title="Baseline")
plot(C1_Act?C1:na,color=color.white,title="confirmation Indicator")
plot(HMA, color=(HMA[0]>HMA[1]? color.green : color.red), linewidth=4, transp=40, title="Entry Indicator")
plot(isLong or isShort ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr)
plot(isLong or isShort ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr)
bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice ? color.yellow : na, transp=75, title="SL Long")
bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice ? color.yellow : na, transp=75, title="SL Short")