Strategi candlestick berasaskan corak


Tarikh penciptaan: 2023-09-22 12:28:59 Akhirnya diubah suai: 2023-09-22 12:28:59
Salin: 0 Bilangan klik: 724
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini berdasarkan bentuk grafik, mengenal pasti isyarat bentuk garisan garisan yang berbeza, melakukan perdagangan mengikut trend. Digabungkan dengan kaedah pengurusan risiko seperti berhenti, berhenti, dan berhenti bergerak, strategi ini bertujuan untuk mengurangkan kesan turun naik pasaran terhadap strategi.

Prinsip Strategi

Strategi ini menilai isyarat berdasarkan bentuk-bentuk yang berikut:

  • Pencerobohan: mengenalpasti pencerobohan berbilang kepala dan pencerobohan kosong
  • Garis graviti/kubah awan: mengenal pasti bentuk garis graviti berbilang kepala dan kubah awan kosong
  • Bintang salib: mengenal pasti bentuk bintang salib berbilang dan kosong
  • Bintang Pagi/Bintang Petang: mengenal pasti bentuk Bintang Pagi Berkepala Banyak dan Bintang Petang Berkepala Kosong
  • Garis tali pinggang: mengenal pasti bentuk tali pinggang yang berbilang dan kosong
  • Three Ravens/Three White Soldiers: Kenali bentuk Three Ravens dan Three White Soldiers
  • Samsung Selatan: Kenali bentuk Samsung Selatan
  • Garis tusuk: mengenal pasti bentuk garis tusuk
  • Garis mesyuarat: mengenal pasti bentuk baris mesyuarat berbilang dan kosong
  • Soket kaki: mengenali bentuk soket kaki berbilang dan kosong
  • Benda bawah tangga: mengenal pasti bentuk bawah tangga

Apabila isyarat hentian di atas diiktiraf, pesanan hentian berhenti tetap di dekat harga pembukaan tiang bawah, melakukan perdagangan mengikuti trend. Di samping itu, pengendalian risiko digabungkan dengan hentian bergerak, hentian bergerak.

Selain itu, strategi ini juga menyertakan penapis garis rata, yang mempertimbangkan isyarat hanya apabila harga menembusi garis rata.

Kelebihan Strategik

  1. Berdasarkan bentuk klasik, ia mempunyai sifat universal.

  2. Berdagang secara mekanikal mengikut peraturan bentuk yang ketat, tanpa pengaruh subjektif.

  3. Penetapan stop loss adalah munasabah untuk mengawal risiko perdagangan tunggal.

  4. Menambah mekanisme penangguhan kerugian bergerak, yang dapat menyesuaikan garis kerugian mengikut pasaran.

  5. Penapis rata-rata meningkatkan kefahaman dan mengelakkan kepalsuan.

Risiko dan tindakan

  1. Terdapat beberapa kesalahan pengiktirafan bentuk lempeng, dan mungkin terdapat isyarat palsu. Parameter bentuk lempeng boleh disesuaikan dengan betul, dan penapis bentuk lempeng tidak sah.

  2. Hentian statik tidak dapat sepenuhnya mengelakkan risiko kejadian kejutan pasaran. Hentian statik boleh ditetapkan lebih lebar, atau Hentian bergerak boleh digunakan.

  3. Strategi ini lebih sensitif kepada masa dagangan dan tidak boleh beroperasi 24 jam. Anda boleh menyesuaikan masa dagangan, atau memasukkan penapis harga tawaran set.

  4. Penapisan rata mungkin terlepas beberapa peluang. Anda boleh mengurangkan kitaran rata, atau membatalkan penapisan rata.

  5. Isyarat multihead dan isyarat kepala kosong tidak dapat difahami pada masa yang sama, terdapat batasan yang sukar untuk mendapatkan keuntungan pada masa yang sama. Anda boleh membuat strategi untuk pelbagai kepala dan kepala kosong secara berasingan, dan beroperasi pada waktu yang berbeza.

Arah pengoptimuman

  1. Untuk mengoptimumkan parameter bentuk lembu, untuk meningkatkan pengiktirafan.

  2. Uji pelbagai cara untuk menghentikan kerosakan bergerak dan mencari penyelesaian terbaik.

  3. Mencuba kaedah pengurusan risiko yang lebih maju, seperti pengurusan wang, penangguhan kadar turun naik, dan sebagainya.

  4. Tambah lebih banyak penapis untuk meningkatkan penapisan.

  5. Meneroka kaedah pembelajaran mesin dan lain-lain untuk membina model penghakiman yang berpatutan.

  6. Pembangunan logik strategi yang dapat merangkumi kedua-dua isyarat berbilang dan kosong.

ringkaskan

Strategi ini menggunakan corak klasik untuk menilai trend, berdagang dengan cara mekanis. Ia meningkatkan keputusan dengan pengurusan risiko hentian dan hentian yang ketat, dan penapisan sejajar. Strategi ini mempunyai kelebihan yang mudah difahami, mudah dilaksanakan, tetapi terdapat juga masalah untuk mengenal pasti kesilapan dan mendapatkan parameter penyesuaian.

Kod sumber strategi
/*backtest
start: 2022-09-15 00:00:00
end: 2023-02-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Candle Patterns Strategy - 2", shorttitle="CPS - 2", overlay=true)
// New risk management system: order entry, moving stop loss to breakeven + moving average filter (SMA)

//--- Patterns Input ---

OnEngulfing = input(defval=true, title="Engulfing", type=bool)
OnHarami = input(defval=true, title="Harami", type=bool)
OnPiercingLine = input(defval=true, title="Piercing Line / Dark Cloud Cover", type=bool)
OnMorningStar = input(defval=true, title="Morning Star / Evening Star ", type=bool)
OnBeltHold = input(defval=true, title="Belt Hold", type=bool)
OnThreeWhiteSoldiers = input(defval=true, title="Three White Soldiers / Three Black Crows", type=bool)
OnThreeStarsInTheSouth = input(defval=true, title="Three Stars in the South", type=bool)
OnStickSandwich = input(defval=true, title="Stick Sandwich", type=bool)
OnMeetingLine = input(defval=true, title="Meeting Line", type=bool)
OnKicking = input(defval=true, title="Kicking", type=bool)
OnLadderBottom = input(defval=true, title="Ladder Bottom", type=bool)

//--- Risk Management Input ---
tick = input (defval = 0.01, title="Tick Size", minval = 0.001)
inpsl = input(defval = 10, title="Stop Loss", minval = 1)
inptp = input(defval = 100, title="Take Profit", minval = 1)
inpbm = input (defval=10, title="Breakeven Margin", minval = 1)
inpindent = input(defval = 5, title="Price Movement Confirmation", minval = 0)
InpSmaFilter = input(defval=false, title="MA Filter", type=bool)
maPer=input(defval = 50, title="MA Period", minval = 1)
//inptrail = input(defval = 0, title="Trailing Stop", minval = 0)
// If the zero value is set for stop loss, take profit or trailing stop, then the function is disabled
//sl = inpsl >= 1 ? inpsl : na
sl = inpsl * tick
bm = inpbm * tick
tp = inptp //* tick
indent = inpindent * tick
//trail = inptrail >= 1 ? inptrail : na

//--- Session Input ---

sess = input(defval = "0000-0000", title="Trading Session")
t = time(timeframe.period, sess)
session_open = na(t) ? false : true

// --- Candlestick Patterns ---

//Engulfing 
bullish_engulfing = high[0]>high[1] and low[0]<low[1] and open[0]<open[1] and close[0]>close[1] and close[0]>open[0] and close[1]<close[2] and close[0]>open[1] ? OnEngulfing : na
bearish_engulfing = high[0]>high[1] and low[0]<low[1] and open[0]>open[1] and close[0]<close[1] and close[0]<open[0] and close[1]>close[2] and close[0]<open[1] ? OnEngulfing : na

//Harami
bullish_harami =  open[1]>close[1] and close[1]<close[2] and open[0]>close[1] and open[0]<open[1] and close[0]>close[1] and close[0]<open[1] and high[0]<high[1] and low[0]>low[1] and close[0]>=open[0] ? OnHarami : na
bearish_harami =   open[1]<close[1] and close[1]>close[2] and open[0]<close[1] and open[0]>open[1] and close[0]<close[1] and close[0]>open[1] and high[0]<high[1] and low[0]>low[1] and close[0]<=open[0] ? OnHarami : na

//Piercing Line/Dark Cloud Cover 
piercing_line = close[2]>close[1] and open[0]<low[1] and close[0]>avg(open[1],close[1]) and close[0]<open[1] ? OnPiercingLine : na
dark_cloud_cover = close[2]<close[1] and open[0]>high[1] and close[0]<avg(open[1],close[1]) and close[0]>open[1] ? OnPiercingLine : na

//Morning Star/Evening Star
morning_star = close[3]>close[2] and close[2]<open[2] and open[1]<close[2] and close[1]<close[2] and open[0]>open[1] and open[0]>close[1] and close[0]>close[2] and open[2]-close[2]>close[0]-open[0] ? OnMorningStar : na
evening_star = close[3]<close[2] and close[2]>open[2] and open[1]>close[2] and close[1]>close[2] and open[0]<open[1] and open[0]<close[1] and close[0]<close[2] and close[2]-open[2]>open[0]-close[0] ? OnMorningStar : na

//Belt Hold
bullish_belt_hold = close[1]<open[1] and low[1]>open[0] and close[1]>open[0] and open[0]==low[0] and close[0]>avg(close[0],open[0]) ? OnBeltHold :na
bearish_belt_hold =  close[1]>open[1] and high[1]<open[0] and close[1]<open[0] and open[0]==high[0] and close[0]<avg(close[0],open[0]) ? OnBeltHold :na

//Three White Soldiers/Three Black Crows 
three_white_soldiers = close[3]<open[3] and open[2]<close[3] and close[2]>avg(close[2],open[2]) and open[1]>open[2] and open[1]<close[2] and close[1]>avg(close[1],open[1]) and open[0]>open[1] and open[0]<close[1] and close[0]>avg(close[0],open[0]) and high[1]>high[2] and high[0]>high[1] ? OnThreeWhiteSoldiers : na
three_black_crows =  close[3]>open[3] and open[2]>close[3] and close[2]<avg(close[2],open[2]) and open[1]<open[2] and open[1]>close[2] and close[1]<avg(close[1],open[1]) and open[0]<open[1] and open[0]>close[1] and close[0]<avg(close[0],open[0]) and low[1]<low[2] and low[0]<low[1] ? OnThreeWhiteSoldiers : na

//Three Stars in the South
three_stars_in_the_south = open[3]>close[3] and open[2]>close[2] and open[2]==high[2] and open[1]>close[1] and open[1]<open[2] and open[1]>close[2] and low[1]>low[2] and open[1]==high[1] and open[0]>close[0] and open[0]<open[1] and open[0]>close[1] and open[0]==high[0] and close[0]==low[0] and close[0]>=low[1] ? OnThreeStarsInTheSouth : na

//Stick Sandwich
stick_sandwich = open[2]>close[2] and open[1]>close[2] and open[1]<close[1] and open[0]>close[1] and open[0]>close[0] and close[0]==close[2] ? OnStickSandwich : na

//Meeting Line 
bullish_ml = open[2]>close[2] and open[1]>close[1] and close[1]==close[0] and open[0]<close[0] and open[1]>=high[0] ? OnMeetingLine : na
bearish_ml = open[2]<close[2] and open[1]<close[1] and close[1]==close[0] and open[0]>close[0] and open[1]<=low[0] ? OnMeetingLine : na

//Kicking 
bullish_kicking =  open[1]>close[1] and open[1]==high[1] and close[1]==low[1] and open[0]>open[1] and open[0]==low[0] and close[0]==high[0] and close[0]-open[0]>open[1]-close[1] ? OnKicking : na
bearish_kicking = open[1]<close[1] and open[1]==low[1] and close[1]==high[1] and open[0]<open[1] and open[0]==high[0] and close[0]==low[0] and open[0]-close[0]>close[1]-open[1] ? OnKicking : na

//Ladder Bottom
ladder_bottom = open[4]>close[4] and open[3]>close[3] and open[3]<open[4] and open[2]>close[2] and open[2]<open[3] and open[1]>close[1] and open[1]<open[2] and open[0]<close[0] and open[0]>open[1] and low[4]>low[3] and low[3]>low[2] and low[2]>low[1] ? OnLadderBottom : na

// --- Plotting Patterns ---

plotshape(bullish_engulfing, text='Engulfing', style=shape.triangleup, color=#1FADA2, editable=true, title="Bullish Engulfing Text")
plotshape(bearish_engulfing,text='Engulfing', style=shape.triangledown, color=#F35A54, editable=true, title="Bearish Engulfing Text")
plotshape(bullish_harami,text='Harami', style=shape.triangleup, color=#1FADA2, editable=true, title="Bullish Harami Text")
plotshape(bearish_harami,text='Harami', style=shape.triangledown, color=#F35A54, editable=true, title="BEarish Harami Text")
plotshape(piercing_line,text='Piercing Line', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(dark_cloud_cover,text='Dark Cloud Cover', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(morning_star,text='Morning Star', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(evening_star,text='Evening Star', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(bullish_belt_hold,text='Belt Hold', style=shape.triangleup, color=#1FADA2, editable=false)    
plotshape(bearish_belt_hold,text='Belt Hold', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(three_white_soldiers,text='Three White Soldiers', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(three_black_crows,text='Three Black Crows', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(three_stars_in_the_south,text='3 Stars South', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(stick_sandwich,text='Stick Sandwich', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(bullish_ml,text='Meeting Line', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(bearish_ml,text='Meeting Line', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(bullish_kicking,text='Kicking', style=shape.triangleup, color=#1FADA2, editable=false)
plotshape(bearish_kicking,text='Kicking', style=shape.triangledown, color=#F35A54, editable=false)
plotshape(ladder_bottom,text='Ladder Bottom', style=shape.triangleup, color=#1FADA2, editable=false)

// --- STRATEGY ---

SignalUp = bullish_engulfing or bullish_harami or piercing_line or morning_star or bullish_belt_hold or three_white_soldiers or three_stars_in_the_south or stick_sandwich or bullish_ml or bullish_kicking or ladder_bottom
SignalDown = bearish_engulfing or bearish_harami or dark_cloud_cover or evening_star or bearish_belt_hold or three_black_crows or bearish_ml or bearish_kicking

PointOfEntry = SignalUp ? high[0] + indent : SignalDown ? low[0] - indent : na

bu = strategy.position_avg_price
shlo = strategy.position_size
stL = shlo > 0 and close [0] > bu + bm ? bu : shlo < 0 and close [0] < bu - bm ? bu : na
du = sma(close, maPer)
smaF = SignalUp and high[0]>du[0] ? true : SignalUp and high[0]<du[0] ? false : SignalDown and high[0]>du[0] ? false : SignalDown and high[0]<du[0] ? true : na 
smaFilter = InpSmaFilter ? smaF : true
duplot = InpSmaFilter ? du : na
plot(duplot, color=red)

// -- Orders --

strategy.order("buy", true, stop = PointOfEntry, oca_name = "trade",  when = SignalUp and session_open and smaFilter)
strategy.cancel("buy", when = not session_open or SignalDown or strategy.opentrades > 0)
strategy.order("stop sell", false, stop = bu-sl, oca_name = "trade",  when = strategy.opentrades > 0 and shlo > 0 and session_open)
strategy.cancel("stop sell", close [0] > bu + bm or not session_open or strategy.opentrades == 0 )
strategy.order("breakeven sell", false, stop = bu + 1*tick, oca_name = "trade",  when = strategy.opentrades > 0 and shlo > 0 and close [0] > bu + bm and session_open)
strategy.cancel("breakeven sell", when = strategy.opentrades == 0 or not session_open)

strategy.order("sell", false, stop = PointOfEntry, oca_name = "trade",  when = SignalDown and session_open and smaFilter)
strategy.cancel("sell", when = not session_open or SignalUp or strategy.opentrades > 0)
strategy.order("stop buy", true, stop = bu+sl, oca_name = "trade",  when = strategy.opentrades > 0 and shlo < 0 and session_open)
strategy.cancel("stop buy", when = close [0] < bu - bm or not session_open or  strategy.opentrades == 0 )
strategy.order("breakeven buy", true, stop = bu - 1 * tick, oca_name = "trade",  when = strategy.opentrades > 0 and shlo < 0 and close [0] < bu - bm and session_open)
strategy.cancel("breakeven buy", when = strategy.opentrades == 0 or not session_open)

strategy.close("buy", when = not session_open or SignalDown )
strategy.close("sell", when = not session_open or SignalUp)
strategy.exit("Take Profit", from_entry = "buy", profit = tp)
strategy.exit("Take Profit", from_entry = "sell", profit = tp)