Ini adalah strategi perdagangan automatik berdasarkan corak lilin. Strategi ini mengenal pasti pelbagai isyarat corak lilin dan memasuki kedudukan apabila keadaan corak dipenuhi, dengan stop loss, mengambil keuntungan dan berhenti menyusul yang dikonfigurasi untuk mengawal risiko.
Strategi ini terutamanya mengenal pasti corak candlestick berikut sebagai isyarat kemasukan: corak menelan, corak harami, garis menembusi / penutup awan gelap, bintang pagi / bintang petang, corak pegangan tali pinggang, tiga tentera putih / tiga gagak hitam corak, tiga bintang dalam corak selatan, dll. Ia pergi lama apabila isyarat menaik dikesan, dan pergi pendek apabila isyarat penurunan dikesan.
Di samping itu, stop loss, mengambil keuntungan dan stop trailing dikonfigurasi untuk kawalan risiko. Khususnya, stop loss ditetapkan pada peratusan tertentu di bawah harga kemasukan, mengambil keuntungan sasaran beberapa pip di atas harga kemasukan, dan trailing stop jejak pada tahap dinamik tertentu di atas kemasukan. Ini berkesan menghalang kerugian di luar jumlah yang boleh diterima.
Perlu diperhatikan bahawa semua kedudukan ditutup di luar sesi dagangan yang ditakrifkan dalam strategi, menghapuskan risiko semalam.
Kelebihan terbesar strategi ini terletak pada penggunaan corak lilin, penunjuk teknikal yang berkesan, untuk menentukan kemasukan. Data sejarah yang luas telah menunjukkan bahawa pembentukan lilin tertentu sering menandakan perubahan dalam dinamik permintaan / bekalan dan psikologi pasaran, dengan itu menyediakan masa yang baik untuk kemasukan.
Satu lagi kelebihan adalah mekanisme kawalan risiko yang komprehensif. Hentikan kerugian, ambil keuntungan dan hentikan trailing dapat meminimumkan kerugian di luar julat yang boleh diterima secara besar-besaran.
Akhirnya, strategi ini fleksibel untuk dijalankan dengan menyesuaikan parameter corak dan parameter kawalan risiko untuk menyesuaikan instrumen dan keutamaan perdagangan yang berbeza.
Risiko terbesar strategi ini berasal dari ketidakstabilan yang melekat pada corak lilin sendiri sebagai penunjuk teknikal. Walaupun corak lilin dapat mencerminkan perubahan trend pasaran dengan jelas, mereka juga terdedah kepada turun naik pasaran secara rawak, yang membawa kepada isyarat palsu yang berpotensi.
Di samping itu, tidak ada hubungan sebab antara pembentukan lilin dan tindakan harga berikutnya. Harga boleh bertentangan dengan hasil corak yang diharapkan walaupun corak biasa dikesan.
Untuk mengurangkan risiko di atas, mematuhi peraturan stop loss, take profit dan trailing stop adalah penting. Menggabungkan corak lilin dengan penunjuk lain yang lebih stabil juga dapat membantu mengelakkan potensi bahaya akibat hanya bergantung pada corak teknikal.
Memandangkan keterbatasan corak lilin, menggabungkannya dengan penunjuk yang lebih kukuh seperti Bollinger Bands, purata bergerak untuk trend, atau osilator seperti RSI dan MACD mungkin bernilai meningkatkan masa kemasukan dan kualiti isyarat.
Arah pengoptimuman prospektif lain adalah menggunakan model pembelajaran mesin yang dilatih pada data sejarah yang besar untuk mendedahkan hubungan statistik antara corak dan pergerakan harga sebenar, meningkatkan ketepatan isyarat corak.
Akhirnya, strategi ini boleh berfungsi sebagai rangka kerja untuk dinaik taraf dengan algoritma yang lebih canggih untuk perdagangan frekuensi tinggi, contohnya kaedah stop loss yang lebih halus, pemodelan yang kompleks dengan lebih banyak antara muka data melalui bahasa maju.
Kesimpulannya, ini adalah strategi yang patut diuji secara langsung, menggunakan corak lilin yang cekap untuk entri isyarat, dengan logik stop loss / take profit / trailing stop yang komprehensif mengawal risiko.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //DanyChe //The script allows you to test popular candlestick patterns on various instruments and timeframes. In addition, you can configure risk management (if the value is zero, it means the function is disabled), and you can also specify the time of the trading session (for example, so that the positions are not transferred to the next day). //The author is grateful to JayRogers and Phi35, their code examples helped a lot in writing the strategy. strategy("Candle Patterns Strategy", shorttitle="CPS", overlay=true) //--- Patterns Input --- OnEngulfing = input(defval=true, title="Engulfing") OnHarami = input(defval=true, title="Harami") OnPiercingLine = input(defval=true, title="Piercing Line / Dark Cloud Cover") OnMorningStar = input(defval=true, title="Morning Star / Evening Star ") OnBeltHold = input(defval=true, title="Belt Hold") OnThreeWhiteSoldiers = input(defval=true, title="Three White Soldiers / Three Black Crows") OnThreeStarsInTheSouth = input(defval=true, title="Three Stars in the South") OnStickSandwich = input(defval=true, title="Stick Sandwich") OnMeetingLine = input(defval=true, title="Meeting Line") OnKicking = input(defval=true, title="Kicking") OnLadderBottom = input(defval=true, title="Ladder Bottom") //--- Risk Management Input --- inpsl = input(defval = 100, title="Stop Loss", minval = 0) inptp = input(defval = 1000, title="Take Profit", minval = 0) inptrail = input(defval = 40, 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 tp = inptp >= 1 ? inptp : na trail = inptrail >= 1 ? inptrail : na //--- Session Input --- sess = input(defval = "0000-0000", title="Trading session") t = time('240', 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 --- 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 strategy.entry("long", true, when = SignalUp and session_open) strategy.entry("short", false, when = SignalDown and session_open) strategy.close("long", when = not session_open) strategy.close("short", when = not session_open) strategy.exit("Risk Exit long", from_entry = "long", profit = tp, trail_points = trail, loss = sl) strategy.exit("Risk Exit short", from_entry = "short", profit = tp, trail_points = trail, loss = sl )