Chiến lược giao dịch theo hướng tăng động suất giá đôi đáy của PPO là một chiến lược giao dịch theo xu hướng sử dụng việc xác định các hình thành giá đôi đáy bằng chỉ số PPO (Percentage Price Oscillator) để tạo ra các tín hiệu giao dịch. Nó kết hợp nhận dạng mô hình đáy kép của PPO và các đặc điểm động lực giá để đạt được vị trí chính xác của các điểm đảo ngược giá đôi đáy.
Chiến lược sử dụng chỉ số PPO để xác định các tính năng đáy giá kép, trong khi kết hợp đánh giá điểm tối thiểu giá để theo dõi sự hình thành đáy của chỉ số PPO trong thời gian thực.
Mặt khác, chiến lược hợp tác với việc xác định giá trị tối thiểu để xác định xem giá có ở mức tương đối thấp hay không.
Thông qua cơ chế xác nhận tính năng đảo ngược của PPO và xác nhận mức giá kép, cơ hội đảo ngược giá tiềm năng có thể được xác định hiệu quả, lọc ra các tín hiệu sai và cải thiện chất lượng tín hiệu.
Mô hình đáy kép PPO cho phép thời gian chính xác tại các điểm nhập cảnh.
Kết hợp xác nhận mức giá lọc ra các tín hiệu sai xảy ra ở mức tương đối cao, cải thiện chất lượng tín hiệu.
PPO nhạy cảm và nhanh chóng nắm bắt sự thay đổi xu hướng giá, phù hợp với việc theo dõi xu hướng.
Cơ chế xác nhận hai lần làm giảm hiệu quả rủi ro giao dịch.
PPO có xu hướng tạo ra các tín hiệu sai, đòi hỏi xác nhận từ các chỉ số khác.
Sự đảo ngược đáy đôi có thể không duy trì, đối mặt với rủi ro giảm hơn nữa.
Cấu hình tham số không phù hợp dẫn đến việc bỏ lỡ lợi nhuận hoặc nhập sai.
Có một khối lượng mã đáng kể với việc sao chép.
Tích hợp mô-đun dừng lỗ và tối ưu hóa các chiến lược kích thước vị trí.
Đưa ra các chỉ số trung bình động hoặc biến động như các công cụ xác nhận.
Mô-đun hóa mã để tránh các phán đoán logic dư thừa.
Tiếp tục điều chỉnh tham số để tăng sự ổn định.
Kiểm tra các ứng dụng giao dịch phân tán trên nhiều sản phẩm hơn.
Chiến lược giao dịch theo hướng độ nhạy của giá PPO nắm bắt các tính năng đáy kép của chỉ số PPO cùng với xác nhận hai lần vị trí mức giá để xác định hiệu quả các điểm đảo ngược giá. So với đánh giá chỉ số duy nhất, nó có lợi thế về độ chính xác và khả năng lọc ra tiếng ồn. Tuy nhiên, một số rủi ro của tín hiệu sai vẫn còn, đòi hỏi tối ưu hóa thêm về sự kết hợp của chỉ số và chiến thuật định kích thước vị trí nghiêm ngặt trước khi có thể đạt được lợi nhuận ổn định trong giao dịch trực tiếp.
/*backtest start: 2024-01-27 00:00:00 end: 2024-01-28 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/ // © luciancapdefier //@version=4 strategy("PPO Divergence ST", overlay=true, initial_capital=30000, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) // time FromYear = input(2019, "Backtest Start Year") FromMonth = input(1, "Backtest Start Month") FromDay = input(1, "Backtest Start Day") ToYear = input(2999, "Backtest End Year") ToMonth = input(1, "Backtest End Month") ToDay = input(1, "Backtest End Day") start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => time >= start and time <= finish ? true : false source = close topbots = input(true, title="Show PPO high/low triangles?") long_term_div = input(true, title="Use long term divergences?") div_lookback_period = input(55, minval=1, title="Lookback Period") fastLength = input(12, minval=1, title="PPO Fast") slowLength=input(26, minval=1, title="PPO Slow") signalLength=input(9,minval=1, title="PPO Signal") smoother = input(2,minval=1, title="PPO Smooth") fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) macd = fastMA - slowMA macd2=(macd/slowMA)*100 d = sma(macd2, smoother) // smoothing PPO bullishPrice = low priceMins = bullishPrice > bullishPrice[1] and bullishPrice[1] < bullishPrice[2] or low[1] == low[2] and low[1] < low and low[1] < low[3] or low[1] == low[2] and low[1] == low[3] and low[1] < low and low[1] < low[4] or low[1] == low[2] and low[1] == low[3] and low[1] and low[1] == low[4] and low[1] < low and low[1] < low[5] // this line identifies bottoms and plateaus in the price oscMins= d > d[1] and d[1] < d[2] // this line identifies bottoms in the PPO BottomPointsInPPO = oscMins bearishPrice = high priceMax = bearishPrice < bearishPrice[1] and bearishPrice[1] > bearishPrice[2] or high[1] == high[2] and high[1] > high and high[1] > high[3] or high[1] == high[2] and high[1] == high[3] and high[1] > high and high[1] > high[4] or high[1] == high[2] and high[1] == high[3] and high[1] and high[1] == high[4] and high[1] > high and high[1] > high[5] // this line identifies tops in the price oscMax = d < d[1] and d[1] > d[2] // this line identifies tops in the PPO TopPointsInPPO = oscMax currenttrough4=valuewhen (oscMins, d[1], 0) // identifies the value of PPO at the most recent BOTTOM in the PPO lasttrough4=valuewhen (oscMins, d[1], 1) // NOT USED identifies the value of PPO at the second most recent BOTTOM in the PPO currenttrough5=valuewhen (oscMax, d[1], 0) // identifies the value of PPO at the most recent TOP in the PPO lasttrough5=valuewhen (oscMax, d[1], 1) // NOT USED identifies the value of PPO at the second most recent TOP in the PPO currenttrough6=valuewhen (priceMins, low[1], 0) // this line identifies the low (price) at the most recent bottom in the Price lasttrough6=valuewhen (priceMins, low[1], 1) // NOT USED this line identifies the low (price) at the second most recent bottom in the Price currenttrough7=valuewhen (priceMax, high[1], 0) // this line identifies the high (price) at the most recent top in the Price lasttrough7=valuewhen (priceMax, high[1], 1) // NOT USED this line identifies the high (price) at the second most recent top in the Price delayedlow = priceMins and barssince(oscMins) < 3 ? low[1] : na delayedhigh = priceMax and barssince(oscMax) < 3 ? high[1] : na // only take tops/bottoms in price when tops/bottoms are less than 5 bars away filter = barssince(priceMins) < 5 ? lowest(currenttrough6, 4) : na filter2 = barssince(priceMax) < 5 ? highest(currenttrough7, 4) : na //delayedbottom/top when oscillator bottom/top is earlier than price bottom/top y11 = valuewhen(oscMins, delayedlow, 0) y12 = valuewhen(oscMax, delayedhigh, 0) // only take tops/bottoms in price when tops/bottoms are less than 5 bars away, since 2nd most recent top/bottom in osc y2=valuewhen(oscMax, filter2, 1) // identifies the highest high in the tops of price with 5 bar lookback period SINCE the SECOND most recent top in PPO y6=valuewhen(oscMins, filter, 1) // identifies the lowest low in the bottoms of price with 5 bar lookback period SINCE the SECOND most recent bottom in PPO long_term_bull_filt = valuewhen(priceMins, lowest(div_lookback_period), 1) long_term_bear_filt = valuewhen(priceMax, highest(div_lookback_period), 1) y3=valuewhen(oscMax, currenttrough5, 0) // identifies the value of PPO in the most recent top of PPO y4=valuewhen(oscMax, currenttrough5, 1) // identifies the value of PPO in the second most recent top of PPO y7=valuewhen(oscMins, currenttrough4, 0) // identifies the value of PPO in the most recent bottom of PPO y8=valuewhen(oscMins, currenttrough4, 1) // identifies the value of PPO in the SECOND most recent bottom of PPO y9=valuewhen(oscMins, currenttrough6, 0) y10=valuewhen(oscMax, currenttrough7, 0) bulldiv= BottomPointsInPPO ? d[1] : na // plots dots at bottoms in the PPO beardiv= TopPointsInPPO ? d[1]: na // plots dots at tops in the PPO i = currenttrough5 < highest(d, div_lookback_period) // long term bearish oscilator divergence i2 = y10 > long_term_bear_filt // long term bearish top divergence i3 = delayedhigh > long_term_bear_filt // long term bearish delayedhigh divergence i4 = currenttrough4 > lowest(d, div_lookback_period) // long term bullish osc divergence i5 = y9 < long_term_bull_filt // long term bullish bottom div i6 = delayedlow < long_term_bull_filt // long term bullish delayedbottom div //plot(0, color=gray) //plot(d, color=black) //plot(bulldiv, title = "Bottoms", color=maroon, style=circles, linewidth=3, offset= -1) //plot(beardiv, title = "Tops", color=green, style=circles, linewidth=3, offset= -1) bearishdiv1 = (y10 > y2 and oscMax and y3 < y4) ? true : false bearishdiv2 = (delayedhigh > y2 and y3 < y4) ? true : false bearishdiv3 = (long_term_div and oscMax and i and i2) ? true : false bearishdiv4 = (long_term_div and i and i3) ? true : false bullishdiv1 = (y9 < y6 and oscMins and y7 > y8) ? true : false bullishdiv2 = (delayedlow < y6 and y7 > y8) ? true : false bullishdiv3 = (long_term_div and oscMins and i4 and i5) ? true : false bullishdiv4 = (long_term_div and i4 and i6) ? true : false bearish = bearishdiv1 or bearishdiv2 or bearishdiv3 or bearishdiv4 bullish = bullishdiv1 or bullishdiv2 or bullishdiv3 or bullishdiv4 greendot = beardiv != 0 ? true : false reddot = bulldiv != 0 ? true : false if (reddot and window()) strategy.entry("Buy Id", strategy.long, comment="BUY") if (greendot and window()) strategy.entry("Sell Id", strategy.short, comment="SELL") alertcondition( bearish, title="Bearish Signal (Orange)", message="Orange & Bearish: Short " ) alertcondition( bullish, title="Bullish Signal (Purple)", message="Purple & Bullish: Long " ) alertcondition( greendot, title="PPO High (Green)", message="Green High Point: Short " ) alertcondition( reddot, title="PPO Low (Red)", message="Red Low Point: Long " ) // plotshape(bearish ? d : na, text='▼\nP', style=shape.labeldown, location=location.abovebar, color=color(orange,0), textcolor=color(white,0), offset=0) // plotshape(bullish ? d : na, text='P\n▲', style=shape.labelup, location=location.belowbar, color=color(#C752FF,0), textcolor=color(white,0), offset=0) plotshape(topbots and greendot ? d : na, text='', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0, size=size.tiny) plotshape(topbots and reddot ? d : na, text='', style=shape.triangleup, location=location.belowbar, color=color.lime, offset=0, size=size.tiny) //barcolor(bearishdiv1 or bearishdiv2 or bearishdiv3 or bearishdiv4 ? orange : na) //barcolor(bullishdiv1 or bullishdiv2 or bullishdiv3 or bullishdiv4 ? fuchsia : na) //barcolor(#dedcdc)