この戦略は,図形状に基づいて,異なる線形状の信号を識別し,トレンドを追跡する取引を行う. ストップ,ストップ,移動ストップなどのリスク管理手段を組み合わせて,市場波動が戦略への影響を軽減することを目的としている.
この戦略は,主に以下の形状に基づいて信号判断を行います.
上述の停止信号が認識されたとき,次柱の開盤価格の近くで固定ストップストップで注文を出し,トレンドフォロー取引を行う.同時に,移動ストップ,移動ストップと組み合わせてリスク管理を行う.
また,平均線フィルターが加えられ,平均線を越えた時のみの信号が考慮されます.
クラシックの形状をベースに,ある種のユニバーサルな性質を持つ.
形状の規則を厳格に遵守し,主観的な影響を受けない機械的な取引を行う.
ストップ・ロスト・ストップの設定は合理的で,単一取引のリスクを最大限にコントロールする.
モバイル・ストップ・ストップ・メカニズムが追加され,市場に応じてストップラインを調整することができる.
平均線フィルターは判断力を高め 誤魔化されないようにします
形には一定の認識誤差があり,偽信号が発生する可能性がある。 形パラメータを適切に調整し,形を無効にフィルターすることができる。
静的ストップは,市場突発のリスクを完全に回避することはできません.より宽松なストップを設定するか,移動ストップを採用することができます.
この策略は取引時間に敏感であり,24時間稼働することはできません.取引時間を調整したり,集合入札価格フィルターに追加することもできます.
均線フィルタは,部分的な機会を逃す可能性があります.均線周期を下げたり,均線フィルタをキャンセルしたりできます.
多頭信号と空頭信号は同時に把握できない.同時に利益を得ることのできない限界がある.分時間稼働して,多頭と空頭に対してそれぞれ戦略を策定することができる.
の形状のパラメータを最適化し,識別効果を向上させる.
移動式止損の様々な方法を試し,最適の解決策を探します.
資金管理,変動率の停止など,より高度なリスク管理方法を試す.
フィルタリングの効果を高めるため,さらに多くのフィルタリング指標を追加します.
形的な判断モデルを構築するために,機械学習などの方法を試す.
複数の頭と空頭信号の両方を兼ね備えた戦略的論理を開発した.
この戦略は,クラシック形状を用いてトレンド判断を行い,機械化された方法で取引する.厳格なストップとモバイルストップの管理リスク,および均線フィルターにより判断効果を高める.この戦略は,理解しやすく,実行しやすいという利点があるが,エラーを識別し,カスタマイズパラメータを取得するという一定の難しさもある.将来,より多くの技術指標と機械学習などの導入によって最適化され,より良い戦略効果を得ることができる.
/*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)