Strategi perdagangan panjang dan pendek berdasarkan EMA dan volum terkumpul


Tarikh penciptaan: 2023-09-20 11:48:34 Akhirnya diubah suai: 2023-09-20 11:48:34
Salin: 0 Bilangan klik: 793
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini menggabungkan EMA dan indikator jumlah dagangan yang terkumpul untuk menilai trend pasaran berdasarkan persilangan kedua-duanya, menghasilkan isyarat beli dan jual. Ia adalah strategi trend-following yang tipikal, mengesan arah pasaran di peringkat garis panjang.

Prinsip Strategi

Hitung EMA purata 50 hari, dan 100 hari penjumlahan penjumlahan penjumlahan. Apabila EMA dari bawah ke atas menembusi penjumlahan penjumlahan, menghasilkan isyarat beli lebih banyak; Apabila EMA dari atas ke bawah menembusi penjumlahan penjumlahan penjumlahan, menghasilkan isyarat jual kosong.

Semasa memegang kedudukan, setkan hentian tetap dan berhenti exiting Strategi. Hentian ditetapkan sebagai 8% di bawah harga masuk; Hentian ditetapkan sebagai 8% di atas harga masuk, dan kosongkan sebahagian daripada kedudukan apabila harga mencapai titik hentian.

Analisis kelebihan

Strategi ini digabungkan dengan indikator trend EMA dan indikator aliran wang untuk mengumpul jumlah transaksi, memanfaatkan maklumat harga dan jumlah transaksi, dan dapat mengenal pasti trend garis tengah dengan berkesan. Strategi berhenti berhenti tetap sangat berkesan dan menguntungkan untuk mengunci sebahagian keuntungan dan mengawal risiko.

Parameter kitaran EMA boleh disesuaikan secara bebas untuk menyesuaikan diri dengan pelbagai jenis. Anda boleh melakukan banyak shorting dan melakukan perdagangan linear. Data retrospektif menunjukkan bahawa strategi ini berfungsi dengan baik dalam keadaan trend.

Analisis risiko

Strategi ini terlalu bergantung pada indikator garis rata, mudah menghasilkan isyarat salah dalam keadaan gegaran di dalam kawasan. Hentian berhenti tetap juga boleh menyebabkan keluar terlalu awal atau berhenti terlalu besar. Hanya mengambil kira maklumat harga dan jumlah transaksi, dan tidak mempertimbangkan faktor lain.

Parameter garis purata boleh diperluaskan dengan sewajarnya, mengurangkan isyarat salah. Ia juga boleh memperkenalkan penilaian bantuan indikator seperti kadar turun naik, RSI. Pengoptimuman mekanisme hentian hentian, seperti memperkenalkan hentian hentian, hentian dinamik dan sebagainya.

Arah pengoptimuman

  1. Uji optimumkan kombinasi parameter EMA untuk mencari parameter optimum.

  2. Memperkenalkan penunjuk teknikal lain untuk membentuk strategi gabungan penunjuk

  3. Menggunakan pembelajaran mesin untuk meramalkan trend harga dan meningkatkan kesan EMA.

  4. Mengoptimumkan strategi hentian hentian, digabungkan dengan mekanisme pengesanan hentian dan hentian dinamik.

  5. Memperkenalkan modul pengurusan wang, penyesuaian kedudukan secara dinamik.

  6. Menyesuaikan parameter untuk ciri-ciri varieti, membentuk gabungan strategi.

ringkaskan

Strategi ini mengintegrasikan EMA dan indikator kuantiti transaksi untuk menilai trend garis tengah dan panjang. Tetapi terdapat masalah dengan ketergantungan berlebihan pada garis rata-rata dan hentian hentian tetap. Menambah lebih banyak penilaian indikator dan mengoptimumkan strategi hentian hentian dapat meningkatkan kestabilan strategi dan ruang untuk keuntungan.

Kod sumber strategi
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
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/
// © mohanee

//@version=4
strategy("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(false, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  linewidth=2, transp=25)

bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : ( close[1] * 2 )
if(takePartialProfits==true)
    strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])
    
strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)

//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  close<shortTakeProfit )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) and (tradeDirection=="SHORT") )

strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )