이 전략은 가격 변화율과 평행선의 기술 지표를 결합하여 구매점과 판매점의 정밀한 위치를 구현한다. 가격이 눈에 띄는 하락이 발생했을 때 구매 경계를 구축하고 추가 하락이 발생했을 때 여러 상점 포지션을 열고; 가격이 상승했을 때 판매 경계를 구축하고 계속 상승했을 때 매각한다. 동시에, 전략은 포지션을 추가하는 방법을 채택하여 여러 번 구매하여 비용을 절감한다.
전략 내장한 손해 중지 및 정지 기능, 사용자 정의 가능한 매개 변수, 실시간으로 존재하는 위치의 위험을 제어한다.
거래 포지션을 개설할 때마다, 입력 파라미터에 따라 일정 비율로 후속 구매 가격을 설정하여, 분기 구매 가장 포지션의 효과를 달성한다.
이 전략은 ROC 지표를 사용하여 매매점을 정확하게 결정하고, 라인 방식으로 신호를 필터링하고, 내장된 중지 중지 손실을 방지하고, 상장하여 이익을 확장합니다. 파라미터를 합리적으로 설정하면, 위험을 통제 가능한 범위에서 보장하면서 초과 수익을 얻을 수 있습니다. 향후 신호 필터링 및 바람 제어 메커니즘을 더 최적화하여 전략을 더 많은 시장 환경에 적응시킬 수 있습니다.
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
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/
// @version=4
// © A3Sh
// Rate of price change / Price averaging strategy //
// When the price drops to a specified percentage, a Long Entry Threshold is setup.
// The Long Entry Threshold is only active for a specified number of bars and will de-activate when not crossed.
// When the price drops further and crosses the Entry Threshold with a minimum of a specified percentage, a Long Position is entered.
// The same reverse logic used to close the Long Position.
// Stop loss and take profit are active by default. With proper tweaking of the settings it is possible to de-activate SL and TP.
// The strategy is inspired by the following strategies:
// Price Change Scalping Strategy developed by Prosum Solutions, https://www.tradingview.com/script/ue7Uc3sN-Price-Change-Scalping-Strategy-v1-0-0/
// Scalping Dips On Trend Strategy developed by Coinrule, https://www.tradingview.com/script/iHHO0PJA-Scalping-Dips-On-Trend-by-Coinrule/
strategy(title = "ROC_PA_Strategy_@A3Sh", overlay = true )
// Portfolio & Leverage Example
// credit: @RafaelZioni, https://www.tradingview.com/script/xGk5K4DE-BTC-15-min/
ge(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
port = input(25, group = "Risk", title = "Portfolio Percentage", type = input.float, step = 0.1, minval = 0.1, maxval = 200)
leverage = input(1, group = "Risk", title = "Leverage", minval = 1, maxval = 100)
mm = input(5, group = "Risk", title = "Broker Maintenance Margin Percentage", type = input.float, step = 0.1, minval = 0.1, maxval = 200)
c = ge((strategy.equity * leverage / open) * (port / 100), 4)
// Take Profit
tpa = input(true, type = input.bool, title = "Take Profit", group = "Risk", inline = "Take Profit")
tpp = input(5.6, type = input.float, title = "Percentage" , group = "Risk", step = 0.1, minval = 0.1, inline = "Take Profit")
tp = strategy.position_avg_price + (strategy.position_avg_price / 100 * tpp)
plot (tpa and strategy.position_size > 0 ? tp : na, color = color.gray, title = "take profit", style= plot.style_linebr, linewidth = 1)
// Stop Loss
sla = input(true, type = input.bool, title = "Stop Lossss ", group = "Risk", inline = "Stop Loss")
slp = input(2.5, type = input.float, title = "Percentage", group = "Risk", step = 0.1, minval = 0.1, inline = "Stop Loss")
sl = strategy.position_avg_price - (strategy.position_avg_price / 100 *slp)
plot (sla and strategy.position_size > 0 ? sl : na, color = color.red, title = "stopp loss", style= plot.style_linebr, linewidth = 1)
stopLoss = sla ? sl : na
// Long position entry layers. Percentage from the entry price of the the first long
ps2 = input(2, group = "Price Averaging Layers", title = "2nd Layer Long Entry %", step = 0.1)
ps3 = input(5, group = "Price Averaging Layers", title = "3rd Layer Long Entry %", step = 0.1)
ps4 = input(9, group = "Price Averaging Layers", title = "4th Layer Long Entry %", step = 0.1)
// ROC_Trigger Logic to open Long Position
rocLookBack = input(3, group = "ROC Logic to OPEN Long Entry", title="Rate of Change bar lookback")
rocThreshold = input(0.5, group = "ROC Logic to OPEN Long Entry", title="ROC Threshold % to Setup Long Entry", step = 0.1)
entryLimit = input(0.5, group = "ROC Logic to OPEN Long Entry", title="Price Drop Threshold % to OPEN Long Entry", step = 0.1)
entryTime = input(3, group = "ROC Logic to OPEN Long Entry", title="Duration of Long Entry Threshold Line in bars")
minLimit = input(0.8, group = "ROC Logic to OPEN Long Entry", title="Min % of Price Drop to OPEN Long Entry", step = 0.1)
//ROC calculation based to the price level of previous X bars
roc = close[rocLookBack] - (close / 100 * rocThreshold)
plot (roc, color = color.gray, title = "roc threshold", linewidth = 1 , transp = 20)
rocT1 = open > roc and close < roc ? 1 : 0 // When the price CROSSES the Entry Limit
rocT2 = (open < roc) and (close < roc) ? 1 : 0 // When the price is BELOW the Entry Limit
rocTrigger = rocT1 or rocT2
// Condition for Setting Up a Long Entry Thershold Line
rocCrossed = false
var SetUpLong = false
if rocTrigger and not SetUpLong
rocCrossed := true
SetUpLong := true
// Defining the Value of the Long Entry Thershold
condforValue = rocCrossed and (open - low) / (open / 100) > 0 or (open < roc and close < roc) ? low - (close / 100 * entryLimit) : roc - (close / 100 * entryLimit)
openValue = valuewhen (rocCrossed, condforValue, 0)
// Defining the length of the Long Entry Thershold in bars, specified with an input parameter
sincerocCrossed = barssince (rocCrossed)
plotLineOpen = (sincerocCrossed <= entryTime) ? openValue : na
endLineOpen = sincerocCrossed == entryTime ? 1 : 0
// Set the conditions back to false when the Entry Limit Threshold Line ends after specied number of bars
if endLineOpen and SetUpLong
rocCrossed := false
SetUpLong := false
// Set minimum percentage of price drop to open a Long Position.
minThres = (open - close) / (open / 100) > minLimit ? 1 : 0
// Open Long Trigger
openLong = crossunder (close, plotLineOpen) and strategy.position_size == 0 and minThres
plot (strategy.position_size == 0 ? plotLineOpen : na, title = "Long Entry Threshold", color= color.yellow, style= plot.style_linebr, linewidth = 2)
// Show vertical dashed line when long condition is triggered
// credit: @midtownsk8rguy, https://www.tradingview.com/script/EmTkvfCM-vline-Function-for-Pine-Script-v4-0/
vline(BarIndex, Color, LineStyle, LineWidth) =>
return = line.new(BarIndex, low - tr, BarIndex, high + tr, xloc.bar_index, extend.both, Color, LineStyle, LineWidth)
// if (openLong)
// vline(bar_index, color.blue, line.style_dashed, 1)
// ROC_Trigger Logic to close Long Position
rocLookBackL = input(3, group = "ROC Logic to CLOSE Long Entry", title = "Rate of Change bar lookback")
entryThresholdL = input(0.8, group = "ROC Logic to CLOSE Long Entry", title = "ROC Threshold % to Setup Close Threshold", step = 0.1) // Percentage from close price
entryLimit_CL = input(1.7, group = "ROC Logic to CLOSE Long Entry", title = "Price Rise Threshold % to CLOSE Long Entry", step = 0.1) // Percentage from roc threshold
entryTime_CL = input(3, group = "ROC Logic to CLOSE Long Entry", title = "Duration of Entry Limit in bars")
roc_CL = close[rocLookBackL] + (close/100 *entryThresholdL)
//plot(rocL, color=color.gray, linewidth=1, transp=20)
rocT1_CL = open < roc_CL and close > roc_CL ? 1 : 0
rocT2_CL = (open > roc_CL) and (close > roc_CL) ? 1 : 0
rocTrigger_CL = rocT1_CL or rocT2_CL
// Condition for Setting Up a Long CLOSE Thershold Line
rocCrossed_CL = false
var SetUpClose = false
if rocTrigger_CL and not SetUpClose
// The trigger for condA occurs and the last condition set was condB.
rocCrossed_CL := true
SetUpClose := true
// Defining the Value of the Long CLOSE Thershold
condforValue_CL= rocCrossed_CL and (high - open) / (open / 100) > 0 or (open > roc_CL and close > roc_CL) ? high + (close / 100 * entryLimit_CL) : roc_CL + (close / 100 * entryLimit_CL)
closeValue = valuewhen (rocCrossed_CL, condforValue_CL, 0)
// Defining the length of the Long CLOSE Thershold in bars, specified with an input parameter
sincerocCrossed_CL = barssince(rocCrossed_CL)
plotLineClose = (sincerocCrossed_CL <= entryTime_CL) ? closeValue : na
endLineClose = (sincerocCrossed_CL == entryTime_CL) ? 1 : 0
// Set the conditions back to false when the CLOSE Limit Threshold Line ends after specied number of bars
if endLineClose and SetUpClose
rocCrossed_CL := false
SetUpClose := false
plot(strategy.position_size > 0 ? plotLineClose : na, color = color.white, title = "Close Long Threshold", style = plot.style_linebr, linewidth = 2)
// ROC Close + Take Profit combined
closeCondition = close < tp ? plotLineClose : tpa ? tp : plotLineClose
// Store values to create and plot the different PA layers
long1 = valuewhen(openLong, close, 0)
long2 = valuewhen(openLong, close - (close / 100 * ps2), 0)
long3 = valuewhen(openLong, close - (close / 100 * ps3), 0)
long4 = valuewhen(openLong, close - (close / 100 * ps4), 0)
eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]
eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]
eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]
eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]
plot (strategy.position_size > 0 ? eps1 : na, title = "Long 1 Layer", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long 2 Layer", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long 3 Layer", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long 4 Layer", style = plot.style_linebr)
// Ener Long Positions
if (openLong and strategy.opentrades == 0)
eps1 := long1
eps2 := long2
eps3 := long3
eps4 := long4
strategy.entry("Long1", strategy.long, c, comment = "a=binance2 e=binance s=bnbusdt b=buy q=20% t=market")
if (strategy.opentrades == 1)
strategy.entry("Long2", strategy.long, c, limit = eps2, comment = "a=binance2 e=binance s=bnbusdt b=buy q=25% t=market")
if (strategy.opentrades == 2)
strategy.entry("Long3", strategy.long, c, limit = eps3, comment = "a=binance2 e=binance s=bnbusdt b=buy q=33.3% t=market")
if (strategy.opentrades == 3)
strategy.entry("Long4", strategy.long, c, limit = eps4, comment = "a=binance2 e=binance s=bnbusdt b=buy q=50% t=market")
// Setup Limit Close / Take Profit / Stop Loss order
strategy.exit("Exit", stop = stopLoss, limit = closeCondition, when =(rocTrigger_CL and strategy.position_size > 0), comment= "a=binance2 e=binance s=bnbusdt b=sell q=100% t=market")
// Make sure that all open limit orders are canceled after exiting all the positions
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0
if longClose
strategy.cancel_all()