
A estratégia utiliza a comparação dentro e fora do canal de Paul para determinar a tendência, e em combinação com o indicador de momentum para acompanhar a tendência, pertence à estratégia de acompanhamento de tendências. A estratégia determina que a variação dentro do canal é menor do que fora do canal para gerar um novo sinal de direção de tendência e abrir uma posição.
A estratégia é composta por:
Configuração da faixa de pólo: inclui 40 ciclos de comprimento da faixa de pólo grande e 20 ciclos de comprimento da faixa de pólo pequeno, com a largura do canal duas vezes maior que a diferença padrão.
Julgamento de explosão de canal: se a banda do polo maior está abaixo da banda do polo menor e a banda do polo maior está acima da banda do polo menor, isso indica que a onda aumenta e gera um novo sinal de direção de tendência.
Indicador de dinâmica: EMA de 14 dias de 240 ciclos, para determinar a direção da tendência.
ATR Stop Loss Stop: 14 vezes a distância de perda do ATR e 1,5 vezes a distância de perda do stop.
A estratégia é primeiro determinar se o canal explode, e se o canal explode, então determinar a direção do motor, decidir se fazer mais ou fazer vazio. Após a entrada, o controle de parada de perda é administrado com o múltiplo ATR.
Usando uma estrutura de dupla faixa polar, pode-se comparar oscilações em diferentes períodos de tempo para determinar o ponto de ruptura da tendência.
O indicador de dinâmica é usado para determinar a direção da tendência e evitar o whipsaw de um mercado em choque.
O ATR é usado para gerenciar o stop loss, que pode ser ajustado de acordo com as flutuações do mercado.
A proporção de risco/retorno é razoável, evitando excessos e não sendo excessivamente conservadora.
Em situações de turbulência sem uma tendência clara, é fácil ser preso. Pode-se reduzir o erro de julgamento por meio da otimização dos parâmetros do indicador de dinâmica.
O ATR Stop pode ser conservador demais e pode testar outros métodos de stop, como stop móvel.
A multiplicação fixa de stop loss pode não ser adequada para todas as variedades, podendo ser considerada como ajustável.
A dupla faixa de pólos pode ser usada para determinar pontos de reversão de tendência, mas pode ser usada para testar outros indicadores de canal, como o canal KD.
Teste diferentes parâmetros do indicador de potência para encontrar a melhor combinação de parâmetros.
Tente diferentes formas de parar, como parar móvel, ATR automático, etc.
O multiplicador de stop loss pode ser ajustado e otimizado para diferentes variedades e condições de mercado.
Teste a eficácia de diferentes indicadores de canal e selecione um indicador de canal mais estável.
Considerar a inclusão de gestão de lucros para que os lucros sejam mais controlados.
A partir daí, você pode filtrar o horário de entrada e aumentar a sua taxa de vitórias.
A estratégia global é clara, e o uso de uma dupla faixa de pólos para determinar o ponto de ruptura da tendência é o seu maior ponto forte. No entanto, ainda é necessário realizar testes de otimização em relação ao método de parada, indicadores de canal e gerenciamento de risco, para que os parâmetros da estratégia sejam mais adaptáveis e possam operar de forma estável em diferentes ambientes de mercado.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
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/
// © kasaism
//@version=4
// strategy(title="[EURUSD60] BB Expansion Strategy", shorttitle="[EURUSD60] BBEXP",overlay=true, max_bars_back=5000, max_labels_count=500)
// === INPUTS === //
////BB
largeBbRes = input(title="Large BB Resolution", type=input.resolution, defval="", group="BB")
largeBbLength = input(title="Large BB Length", type=input.integer, defval=40, minval=1, group="BB")
smallBbRes = input(title="Small BB Resolution ", type=input.resolution, defval="", group="BB")
smallBbLength = input(title="Small BB Length", type=input.integer, defval=20, minval=1, group="BB")
multi = input(title="BB StdDev", type=input.float, defval=2.0, maxval=10, minval=0.01, group="BB")
validLen = input(title="BB expand valid length", defval=14, group="BB")
// 3 each EMA settings. EMA directions are as each time frame directions.
resFirstTime = input(title="EMA Trend t/f", type=input.resolution, defval="240", group="SMT")
// resSecondTime = input(title="Second t/f", type=input.resolution, defval="30", group="SMT")
// resThirdTime = input(title="Third t/f", type=input.resolution, defval="", group="SMT")
emaLen = input(14, minval=1, title="Length", group="SMT")
smooth = input(3, minval=1, title="Smooth factor", group="SMT")
//Lisk Management
var riskManagementRule1 = "ATR"
var riskManagementRule2 = "Bracket"
riskManagementRule = input(riskManagementRule1, "Detect Risk Management Based On", options=[riskManagementRule1, riskManagementRule2, "No detection"], group="Trade")
atrMulti = input(3.0, title="ATR Multiple", type=input.float, minval = 1.0, group="ATR")
riskRewardRatio = input(1.5, title="Risk Reward Ratio for ATR", type=input.float, minval = 0.01, group="ATR")
stopLossPoint = input(100, title="Stop Loss Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
takeProfitPoint = input(200, title="Take Profit Point for Braket(tick)", type=input.float, minval = 1.0, group="Bracket")
// === /INPUTS/ === //
// === CONSTANT === //
//For barmerge.lookahead_off
index = barstate.isrealtime ? 1 : 0
//For Entry
NOENTRY=0
LONG=1
SHORT=2
//SMT color
int up=1
int dn=2
int up_HL=3
int dn_HL=4
//label color
color_bearish = color.red
color_bullish = color.blue
C_label_color_bearish = color.red
C_label_color_bullish = color.blue
// === /CONSTANT/ === //
// === FUNCTIONS === //
//BB trade direction
bbTradeDetection(lrgUpper, lrgLower, smlUpper, smlLower) =>
if not(na(lrgUpper) or na(lrgLower) or na(smlUpper) or na(smlLower))
if lrgUpper < smlUpper and lrgLower > smlLower
true
else
false
else
na
// === /FUNCTIONS/ === //
// === CALCURATES === //
////BB
//large BB
lrgBbBasis = security(syminfo.tickerid, largeBbRes, sma(close[index], largeBbLength))
lrgBbDev = multi * security(syminfo.tickerid, largeBbRes, stdev(close[index], largeBbLength))
lrgBbUpper = lrgBbBasis + lrgBbDev
lrgBbLower = lrgBbBasis - lrgBbDev
//small BB
smlBbBasis = security(syminfo.tickerid, smallBbRes, sma(close[index], smallBbLength))
smlBbDev = multi * security(syminfo.tickerid, smallBbRes, stdev(close[index], smallBbLength))
smlBbUpper = smlBbBasis + smlBbDev
smlBbLower = smlBbBasis - smlBbDev
bbTrade = bbTradeDetection(lrgBbUpper, lrgBbLower, smlBbUpper, smlBbLower)
//EMA Trend
base=security(syminfo.tickerid, resFirstTime, ema(close[index],emaLen))
sig=security(syminfo.tickerid, resFirstTime, ema(base[index],smooth))
emaTrend = not(na(base) or na(sig)) ? base < sig ? dn : up : na
////LISK MANAGEMENT
float stopLossLineForLong = na
float stopLossLineForShort = na
float takeProfitLineForLong = na
float takeProfitLineForShort = na
atr_ = atr(14) * atrMulti
if riskManagementRule == riskManagementRule1
stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : round(close[index] - atr_,3) : na
stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : round(close[index] + atr_,3) : na
takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] + atr_*riskRewardRatio : na
takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - atr_*riskRewardRatio : na
if riskManagementRule == riskManagementRule2
stopLossLineForLong := strategy.position_size > 0 ? stopLossLineForLong[1] ? stopLossLineForLong[1] : close[index] - stopLossPoint * syminfo.mintick : na
stopLossLineForShort := strategy.position_size < 0 ? stopLossLineForShort[1] ? stopLossLineForShort[1] : close[index] + stopLossPoint * syminfo.mintick : na
takeProfitLineForLong := strategy.position_size > 0 ? takeProfitLineForLong[1] ? takeProfitLineForLong[1] : close[index] +takeProfitPoint * syminfo.mintick : na
takeProfitLineForShort := strategy.position_size < 0 ? takeProfitLineForShort[1] ? takeProfitLineForShort[1] :close[index] - takeProfitPoint * syminfo.mintick : na
// === /CALCURATES/ === //
// === CONDITIONS === //
//BB
bool isBbEntry = na
for i=0 to validLen
isBbEntry := bbTrade==true ? true : bbTrade[i]==true ? true : false
//plotshape(isBbEntry, style=shape.circle, location=location.bottom)
isBbLong = isBbEntry and open[index] < smlBbBasis[index] and close[index] > smlBbBasis[index]
isBbShort = isBbEntry and open[index] > smlBbBasis[index] and close[index] < smlBbBasis[index]
//SMT
isEmaLong = emaTrend == up
isEmaShort = emaTrend == dn
//ATR
isAtrLongStop = low[index] <= stopLossLineForLong
isAtrShortStop = high[index] >= stopLossLineForShort
isAtrLongLimit = high[index] >= takeProfitLineForLong
isAtrShortLimit = low[index] <= takeProfitLineForShort
// === /CONDITIONS/ === //
// === TRADE === //
//ENTRY
if (isBbLong and isEmaLong)
strategy.entry("LongEntry", strategy.long, comment="LongEntry")
if riskManagementRule == riskManagementRule2
strategy.exit("LongEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
if (isBbShort and isEmaShort)
strategy.entry("ShortEntry", strategy.short, comment="ShortEntry")
if riskManagementRule == riskManagementRule2
strategy.exit("ShortEntry", loss=stopLossPoint, profit=takeProfitPoint, comment="bracket")
//EXIT
if riskManagementRule == riskManagementRule1
if(isAtrLongStop)
strategy.close("LongEntry", when=isAtrLongStop, comment="ATR Stop")
if(isAtrShortStop)
strategy.close("ShortEntry", when=isAtrShortStop, comment="ATR Stop")
if(isAtrLongLimit)
strategy.close("LongEntry", when=isAtrLongLimit, comment="ATR Limit")
if(isAtrShortLimit)
strategy.close("ShortEntry", when=isAtrShortLimit, comment="ATR Limit")
// === /TRADE/ === //
// === PLOTS === //
plot(lrgBbBasis, title="Large BB Basis", linewidth=2, color=color.gray)
plot(lrgBbUpper, title="Large BB Upper", linewidth=2, color=color.gray)
plot(lrgBbLower, title="Large BB Lower", linewidth=2, color=color.gray)
plot(smlBbBasis, title="Small BB Basis", color=color.white)
plot(smlBbUpper, title="Small BB Upper", color=color.white)
plot(smlBbLower, title="Small BB Lower", color=color.white)
plot(base, title="EMA Line", color= emaTrend==dn ? color_bearish : emaTrend==up ? color_bullish : color.gray)
plot(stopLossLineForLong ? stopLossLineForLong : na, title="S/L Line For Long", color=color.yellow, style=plot.style_circles)
plot(stopLossLineForShort ? stopLossLineForShort : na, title="S/L Line For Short", color=color.yellow, style=plot.style_circles)
plot(takeProfitLineForLong ? takeProfitLineForLong : na, title="T/P Line For Long", color=color.purple, style=plot.style_circles)
plot(takeProfitLineForShort ? takeProfitLineForShort : na, title="T/P Line For Short", color=color.purple, style=plot.style_circles)
// /=== PLOTS ===/ //