Strategi Dagangan Algoritma Crossover Rata-rata Bergerak Eksponensial Berganda

Penulis:ChaoZhang, Tarikh: 2024-01-25 14:04:23
Tag:

img

Ringkasan

Strategi ini dinamakan Dual Exponential Moving Average Crossover Algorithmic Trading Strategy. Ia mengira purata bergerak eksponen dua (EMA) dan menghasilkan isyarat perdagangan apabila EMA melintasi. Digabungkan dengan prinsip perdagangan algoritma untuk kemasukan pesanan, ia mengotomatiskan keseluruhan proses perdagangan.

Logika Strategi

Logik teras strategi ini adalah berdasarkan crossover EMA berganda. Penunjuk 1 adalah EMA 20 hari dan Penunjuk 2 adalah EMA 50 hari. Isyarat beli dihasilkan apabila EMA jangka pendek melintasi EMA jangka panjang dari bawah. Isyarat jual dihasilkan apabila EMA jangka pendek melintasi EMA jangka panjang dari atas. Jadi silang EMA dengan parameter yang berbeza digunakan untuk menentukan titik masuk dan keluar pasaran.

Di samping itu, penunjuk Vortex digunakan untuk membantu mengenal pasti trend dan menghasilkan isyarat perdagangan. Indikator Vortex menentukan momentum menaik atau menurun dengan membandingkan perbezaan antara harga tertinggi dan penutupan semalam, dan harga terendah dan pembukaan semalam, dalam tempoh 1 hari dan 3 hari. Menggunakan Vortex dapat membantu menapis beberapa isyarat yang kurang penting dari salib EMA.

Apabila isyarat perdagangan dihasilkan, modul pengurusan wang terbina dalam membantu menguruskan risiko dengan mengawal saiz kedudukan berdasarkan nisbah kerugian keuntungan yang telah ditentukan.

Analisis Kelebihan

  1. Strategi ini mengintegrasikan silang EMA berganda dan penunjuk Vortex untuk memanfaatkan kedua-duanya, dengan itu meningkatkan ketepatan isyarat

  2. Sistem perdagangan automatik menghilangkan kesilapan emosi manusia dan meminimumkan risiko

  3. Fungsi Stop Loss / Take Profit automatik mengehadkan kerugian maksimum untuk setiap perdagangan

  4. Modul pengurusan wang mengawal peruntukan modal untuk setiap perdagangan, dengan itu menguruskan risiko keseluruhan

Analisis Risiko

  1. EMA crossover boleh menghasilkan isyarat palsu dan indikator Vortex juga tidak dapat menapis isyarat palsu.

  2. Kejadian Black Swan boleh membawa kepada kerugian besar pada kedudukan terbuka.

Peluang Penambahbaikan:

  1. Lebih banyak penunjuk boleh ditambah kepada isyarat penapis yang lebih baik

  2. Algoritma pembelajaran mesin boleh membantu mengoptimumkan parameter secara automatik

Kesimpulan


/*backtest
start: 2023-01-18 00:00:00
end: 2024-01-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © smottybugger 

//@version= 5
strategy("The  Averages Moving_X_Vortex", shorttitle="2.5billion BTC lol" , calc_on_order_fills=true, calc_on_every_tick=true, commission_type=strategy.commission.percent, commission_value=0.02, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, margin_long=0, margin_short=0,overlay=true)
// Dual Vortex
period_1 = input(15, "short Time")
period_2 = input(25, "long time")
VMP = math.sum(math.abs(high - low[3]), period_1)
VMM = math.sum(math.abs(low - high[1]), period_2)
STR = math.sum(ta.atr(1), period_1)
STR2 = math.sum(ta.atr(1), period_2)
VXpower= (input(5,"Vortex Power")/10000)*close
shorterV =(VMP / STR)*VXpower
longerV = (VMM / STR2)*VXpower

// MACross
shortlen = input(20, "ShortMa")
longlen = input(29, "LongMA")
shorterMA = ta.sma(close, shortlen)
longerMA = ta.sma(close, longlen)

// Vortex "MACross Stabilized"
Varance = input(1, "Vortex Stabilize")
Vpercent = (Varance / 100)
shortV= ((((shorterMA-close)* Vpercent)+shorterV)/2)+close
longV = ((((longerMA -close )*Vpercent)+longerV)/2)+close

//MAcross vortex stabilized
Marance = input(1, "MACross Stabilize")
MApercent = Marance / 100
shortMA = ((((shorterMA-close)*MApercent)+shorterV)/2)+close
longMA = ((((longerMA-close)*MApercent)+longerV)/2)+close

//VMXadveraged Moving cross adveraged
VMXL=(longV+longMA)/2
VMXS=(shortV+shortMA)/2
VXcross= ta.cross(VMXS,VMXL) ? VMXS : na
VMXcross= ta.cross(VMXS,VMXL)

//plot
plot(VMXS,"BUY",color=#42D420)
plot(VMXL,"SELL",color=#e20420)
crossV= ta.cross(shortV, longV) ? shortV : na
plot(shortV ,"shortV", color=#42D420)
plot(longV,"longV", color=#e20420)
plot(crossV,"crossV", color=#2962FF, style=plot.style_cross, linewidth=4)
crossMA = ta.cross(shortMA, longMA) ? shortMA : na
plot(shortMA,"shortMA", color=#42D420)
plot(longMA,"longMA", color=#e20420)
plot(crossMA,"crossMA", color=#2962FF, style=plot.style_cross, linewidth=4)
plot(VXcross,"VMXcross",color=#2962FF, style= plot.style_cross,linewidth=4)
plot(close,color=#999999)

// Vortex Condistyle
is_Vlong =shortV< longV
is_Vshort =shortV>longV


// Vortex commands
Vlong =  ta.crossunder(longV, shortV)
Vshort =ta.crossover(shortV,longV)
VorteX = ta.cross(longV, shortV)

// MACross Conditions
is_MAlong = shortMA < longV
is_MAshort = shortMA > shortV


//VMX Conditions
is_VMXlong=VMXS<VMXL
is_VMXshort=VMXS>VMXL

// MA commands
MAlong = ta.crossunder(shortMA, longV)
MAshort =ta.crossover(shortMA, shortV)
MAcross =  ta.cross(shortMA, longMA)
 
//VMX COMMANss
VMXBUY=ta.crossover( VMXS,VMXL)
VMXSELL=ta.crossunder(VMXS,VMXL)

// Close Crossing PositionLMXs

CS=is_MAshort or is_VMXshort
CL= is_MAlong or is_VMXlong
OS=MAshort or VMXSELL
OL=MAlong or VMXBUY


if VMXcross
    strategy.close_all ("closed")

//if CS and  OL
    strategy.close("Short",comment="Short Closed")


//if CL and  OS
    strategy.close("Long",comment="Long Closed" ) 

//CA1= is_MAcross and is_VorteX
//if CA1
   // strategy.close_all(comment="X2X")

// Defalongyntry qty

if is_VMXlong and VMXSELL
    strategy.entry("sell",strategy.short)


if is_VMXshort and VMXBUY
    strategy.entry("buy",strategy.long)



// Stop Losses & Taking Profit
sllp = input(0, "Stop Loss Long")
sll = (1 - sllp / 100) * strategy.position_avg_price
is_sll = input(true, "Stop Long")

tplp = input(0, "Take Profit Long")
tpl = (1 + tplp / 100) * strategy.position_avg_price
is_tpl = input(true, "Take Long")

slsp = input(0, "Stop Loss Short")
sls = (1 + slsp / 100) * strategy.position_avg_price
is_sls = input(true, "Stop Short")

tpsp = input(0, "Take Profit Short")
tps = (1 - tpsp / 100) * strategy.position_avg_price
is_tps = input(true, "Take Short")

if (is_sll or is_sls) 
    strategy.close("Stop Losses", qty_percent=100)

if (is_tpl or is_tps) 
    strategy.close("Take Profits", qty_percent=100)


 //Strategy Backtest
//plot(strategy.equity, "Equity", color=color.red, linewidth=2, style=plot.style_areabr)


Lebih lanjut