이 전략은 구매 및 판매 신호로 이중 이동 평균 크로스오버를 사용하는 간단한 양적 전략이다. 서로 다른 기간을 가진 두 개의 MA 라인을 사용합니다. 짧은 기간 MA가 밑에서 긴 기간 MA를 넘을 때 구매 신호가 생성됩니다. 짧은 기간 MA가 긴 기간 MA를 넘을 때 판매 신호가 생성됩니다.
이 전략은 폐쇄 가격의 8주기 EMA와 72주기 EMA를 계산하고 차트에 표시합니다. 8EMA가 72EMA를 넘으면 구매 신호가 생성됩니다. 8EMA가 72EMA를 넘으면 판매 신호가 생성됩니다.
전략의 기본 가정은: 짧은 기간 MA는 최근의 가격 추세와 동력을 나타내고, 긴 기간 MA는 장기적인 추세를 나타냅니다. 짧은 기간 MA가 긴 MA를 넘을 때, 그것은 단기 MA가 강화되고 있음을 나타냅니다.
이 전략은 또한 과반 구매 및 과반 판매 영역을 결정하기 위해 윌리엄 %R 지표를 사용하고, 기준으로 가격 동력 방향을 결정하기 위해 MACD 지표를 사용합니다. 또한, 트렌드를 분석하는 데 도움이되는 Dema 및 Pivots와 같은 일부 보조 지표가 전략에 설정되어 있습니다.
듀얼 MA 크로스오버 전략의 가장 큰 장점은 간단하고 이해하기 쉽고 구현하기 쉽다는 것입니다. 복잡한 모델과 매개 변수 최적화 없이 두 MA의 크로스오버에 기초하여 거래 신호를 생성 할 수 있습니다.
또 다른 장점은 MA 크로스오버 전략이 트렌딩 시장에서 잘 수행한다는 것입니다. 주식 가격이 명백한 상승 또는 하락 추세를 보이는 경우, MA 크로스오버 전략은 큰 추세를 파악하고 좋은 수익을 창출 할 수 있습니다.
이중 MA 크로스오버 전략은 또한 주목해야 할 몇 가지 위험 요소가 있습니다. 첫째, 범주와 연결된 불안정한 시장에서 MA 라인 크로스오버가 자주 발생하여 잘못된 신호와 연쇄 손실을 쉽게 발생시킬 수 있습니다. 둘째, MA 크로스오버 신호는 종종 지연되어 갑작스러운 사건의 영향에 제때 대응할 수 없습니다. 마지막으로, MA 기간 길이가 같은 매개 변수 설정은 조정 및 결정에 대한 경험이 필요합니다.
위험은 신호를 확인하기 위해 다른 지표를 결합하거나 MA 매개 변수를 최적화하거나 명백한 트렌딩 시장에서 운영함으로써 감소 할 수 있습니다. 또한 스톱 로스, 수익 취득, 포지션 사이징 등을 설정하는 것도 매우 중요합니다.
이 간단한 이중 MA 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
최적의 매개 변수를 찾기 위해 MA 기간 매개 변수의 다양한 조합을 테스트합니다.
전략의 안정성을 높이기 위해 MACD, KDJ 등 신호 필터링을 위한 다른 지표를 추가합니다.
동적 출구 메커니즘을 구축하여 고정값을 사용하는 대신 최고의 스톱 로스를 추적하고 수익 수준을 취합니다.
시장 조건에 따라 적응 가능한 MA 기간을 채택하여 매개 변수를 최적화합니다.
선진 기계 학습과 심층 학습 모델을 통합하여 신호 정확성을 향상시킵니다.
간단한 듀얼 MA 크로스오버 전략으로서, 일부 지연 및 잘못된 신호 문제가 있지만 이해하기 쉽고 구현하기 쉽습니다. 일부 최적화 및 수정으로 여전히 기본적이고 실용적인 양적 거래 전략이 될 수 있습니다.
/*backtest start: 2022-12-18 00:00:00 end: 2023-12-24 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/ // © DalmarSantos //@version=4 //Entry and Exit points to TRADE ==> Pontos de Entrada e Saida de TRADE //Functions in use ==> Funções em uso //(1) DEMA - Double Exponential Moving Average 08/17/34/72 ==> Média Móvel Exponencial Dupla //(2) ema() - Exponential Moving Averge 72/ochl4 ==> Média Móvel Exponencial //(3) plot() //(4) barcolor() //(5) cross() //(6) pivots() //(7) William R% Md //(8) Maximum and Minimum Value //(9) fill() //(10) macd() - Moving Average Convergence Divergence //(11) tsi() - Trading Strenght Indicator==> Índice de Força Real (IFR) //(12) Buy and Sell TRADE Points //(13) Strategy Buy and Sell TRADE Points strategy("[DS]Entry_Exit_TRADE.V01-Strategy", overlay=true) //variable ==> variáveis return = input(title="Return Candels ?", type=input.integer, defval=190) //quantity of candles to analise ==> quantidade de candles para analise // //**************************** //Function==> Função | (1)DEMA //**************************** //Dema 08 e1 = ema(close,8) e2 = ema(e1,8) dema08 = 2 * e1 - e2 // //Dema 17 e1 := ema(close,17) e2 := ema(e1,17) dema17 = 2 * e1 - e2 // //Dema 34 e1 := ema(close,34) e2 := ema(e1,34) dema34 = 2 * e1 - e2 // //Dema 72 e1 := ema(close,72) e2 := ema(e1,72) dema72 = 2 * e1 - e2 // //****************************** //Function==> Função | (2) ema() //****************************** ema72 = ema(close,72) emaOhlc4=ema(ohlc4,8) // //****************************** //Function==> Função | (3)plot() //****************************** // ////Show the avareges ==> Apresenta as médias //plot(dema17, title="DEMA 17", color=color.new(color.lime,0), linewidth=1, style=plot.style_line, transp=0, show_last=return) // Doble Exponential Moving Avarage 17 //plot(dema34, title="DEMA 34", color=color.new(color.black,0), linewidth=1, style=plot.style_line, transp=0, show_last=return) // Doble Exponential Moving Avarage 34 plot(dema72, title="DEMA 72", color=color.orange, linewidth=2, style=plot.style_line, transp=0, show_last=return) // Doble Exponential Moving Avarage 72 plot(emaOhlc4, title="EMA ohlc4", color=emaOhlc4>dema72 ? color.new(color.green,0) : color.new(color.red,0), linewidth=2, style=plot.style_line, transp=0, show_last=return) // Doble Exponential Moving Avarage 72 // //*********************************** //Function==> Função | (4) barcolor() //*********************************** //Show color TRADE bar if emaOhlc4>dema72 green (Buy) if not red (Red) ==> Mostra a cor da barra de TRADE se emaOhlc4>dema72 verde (Compra) se não vermelha (Venda) barcolor(close>dema34 and close>dema72 or close>close[1] ? color.new(color.green,0) : color.new(color.red,0), show_last=return) // //******************************** //Function==> Função | (5) cross() //******************************** // Show the intersections crossing average on the graph ==> Apresenta no gráfico o local dos cruzamentos das médias //UP ==> para CIMA plot(crossover(emaOhlc4,dema72) ? dema72 : na, title="Cross UP", color=color.green, transp=0, style=plot.style_circles, linewidth=5, show_last=return) //DOWM ==> para BAIXO plot(crossunder(emaOhlc4,dema72) ? dema72 : na, title="Cross DOWN", color=color.red, transp=50, style=plot.style_circles, linewidth=5, show_last=return) // //******************************** //Function==> Função | (6) pivot() //Reference: Pine Script Manual //******************************** _Pivots = input(title = "══════ Pivots ══════", type = input.bool, defval = false) leftBars = input(4) rightBars=input(4) pivotHigh = pivothigh(leftBars, rightBars) //pivot de alta plot(pivotHigh>ema72[rightBars] ? pivotHigh : na, title="Pivot High", style=plot.style_cross, linewidth=3, color= color.purple, transp=50, offset=-rightBars, show_last=return) pivotLow = pivotlow(leftBars, rightBars) //pivot de baixa plot(pivotLow<ema72[rightBars] ? pivotLow : na, title="Pivot Low", style=plot.style_cross, linewidth=3, color= color.blue, transp=50, offset=-rightBars, show_last=return) // //*************************************** //Function==> Função | (7) WILLIAM R% MOD //Reference: Pine Script Manual //*************************************** // Getting inputs _WilliamR = input(title = "══════ William R% Mod ══════", type = input.bool, defval = false) SOB_William = input(title="OverBought Area", type=input.integer, defval=-7) //OverBought area ==> Area de SobreCompra SOS_William = input(title="OverSold Area", type=input.integer, defval=-93) //OverSold area ==> Area de SobreVenda length_William = input(17, minval=1) //interval ==> intervalo highestHigh_William = highest(length_William) //maximum value ==> valor máximo highestLow_William = lowest(length_William) //minumum value ==> valor mínimo R_William = (highestHigh_William - close) / (highestHigh_William - highestLow_William) * -100 //Show the position ==> mostra a posição //plotshape(R_William > SOS_William ? na : high, text="+R%", title="+r(+)%R Up", location=location.belowbar, color=color.green, transp=30, style=shape.triangleup, size=size.tiny, show_last=return) //plotshape(R_William < SOB_William ? na : low, text="-R%", title="(-)%R DN", location=location.abovebar, color=color.red, transp=30, style=shape.triangledown, size=size.tiny, show_last=return) // // Show label with William %R value ==> Mostra a etiqueta com o valor do William %R // The color label red is when the value arrive on OverBought Area and green on OverSold Area, be careful with these areas ==> O rótulo de cor vermelha é quando o valor chega na área de SobreCompra e verde na área de SobreVenda, cuidado com estas áreas // corTest=color.white colorText = color.white estilo = label.style_label_upper_left textW="" if R_William>SOB_William corTest := color.new(color.red,0) //vermelho escuro estilo := label.style_label_lower_left textW:="OB" if R_William>-30 and R_William<=SOB_William corTest := #f5948e //vermelho intermediário estilo := label.style_label_lower_left if R_William>-50 and R_William<=-30 corTest := #f5d5d3 //vermelho claro colorText := color.black if R_William>-70 and R_William<=-50 corTest := #e7f5d3 //verde claro colorText := color.black if R_William>=SOS_William and R_William<=-70 corTest := color.lime //verde intermediario estilo := label.style_label_upper_left colorText := color.black if R_William<SOS_William corTest := color.new(color.green,0) // verde escuro estilo := label.style_label_upper_left textW:="OS" // Make a label at the high of the current bar myLabel = label.new(x=bar_index, y=close, style= estilo, color=corTest, text=tostring(R_William,"#.#")+"% "+textW, textcolor=colorText, size=size.normal) // Get the label text labelText = label.get_text(id=myLabel) // Then set the label's text to a new string that // includes its current text label.set_text(id=myLabel, text=labelText) label.delete(myLabel[1]) // //************************************************** //Function==> Função | (8) MAXIMUM AND MINIMUM VALUE //Reference: Pine Script Manual //************************************************** //Maximum High and Minimum Low close position ==> Posição Máxima e Minima de fechamento ExtremoHigh=high+(highestHigh_William-high) ExtremoLow=low-(low-highestLow_William) plot(ExtremoHigh, color=color.new(color.red,70), style=plot.style_line, linewidth=1, show_last=return) plot(ExtremoLow, color=color.new(color.green,70), style=plot.style_line, linewidth=1, show_last=return) //Show the Extreme High and Low close position ==> Mostra a extrema posicao alta e baixa do fechamento lH1 = 0.0 lHInt = close lL1 = close lLInt = close Vr_LinhaH=0.0 Vr_LinhaL=0.0 Vr_LinhaC=0.0 if emaOhlc4<dema72 Vr_LinhaH := high+(highestHigh_William-high) lH1 := Vr_LinhaH>dema72 ? Vr_LinhaH : dema72 lHInt:=emaOhlc4<dema72 ? dema72 : emaOhlc4 lLInt := lHInt==emaOhlc4 ? dema72 : emaOhlc4 Vr_LinhaL:= low-(low-highestLow_William) lL1 := Vr_LinhaL>lLInt ? lLInt : Vr_LinhaL if emaOhlc4>dema72 Vr_LinhaH := high+(highestHigh_William-high) lH1 := Vr_LinhaH>dema72 ? Vr_LinhaH : dema72 lHInt:=dema72>emaOhlc4 ? dema72 : emaOhlc4 lLInt := lHInt==dema72 ? emaOhlc4 : dema72 Vr_LinhaL:= low-(low-highestLow_William) lL1 := Vr_LinhaL>lLInt ? lLInt : Vr_LinhaL // //******************************* //Function==> Função | (9) fill() //Reference: Pine Script Manual //******************************* //Show TRADE area in red (Sell) and green (Buy) ==> Mostra a área de trade em vermelho (Venda) e verde (Compra) Line1 = plot(emaOhlc4, title="Dema ohlc4", color=color.new(color.white,100), linewidth=1, transp=0, show_last=return) Line2 = plot(dema72, title="Dema 72", color=color.new(color.white,100), linewidth=1,transp=0, show_last=return) fill(Line1, Line2, color=emaOhlc4>dema72 ? color.new(color.green,90) : color.new(color.red,90), transp=70, show_last=return) //High area ==> Area de alta HighlH1 = plot(lH1, title="HighlH1", color=color.green, linewidth=1, transp=90, show_last=return, style=plot.style_linebr) HighlHInt = plot(lHInt, title="HighlHInt", color=color.green, linewidth=1, transp=100, show_last=return, style=plot.style_linebr) fill(HighlH1, HighlHInt, color=color.new(color.purple,90), transp=0, show_last=return) //Low area ==> Area de baixa LowlL1 = plot(lL1, title="LowlL1", color=color.red, linewidth=1, transp=90, show_last=return, style=plot.style_linebr) LowlLInt = plot(lLInt, title="LowlLInt", color=color.red, linewidth=1, transp=100, show_last=return, style=plot.style_linebr) fill(LowlL1, LowlLInt, color=color.new(color.blue,90), transp=0, show_last=return) // //*************************************************************************** //Function==> Função | (10) macd() - Moving Average Convergence Divergence //Reference: Pine Script Manual - adapted TradingView version - Dalmar Santos //*************************************************************************** // Getting inputs _Macd = input(title = "═════ Macd ══════════", type = input.bool, defval = false) fast_length_Macd = input(title="Fast Length", type=input.integer, defval=12) slow_length_Macd = input(title="Slow Length", type=input.integer, defval=26) src_Macd = input(title="Source", type=input.source, defval=close) signal_length_Macd = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) // Calculating fast_ma_Macd = ema(src_Macd, fast_length_Macd) slow_ma_Macd = ema(src_Macd, slow_length_Macd) macd_Macd = fast_ma_Macd - slow_ma_Macd signal_Macd = ema(macd_Macd, signal_length_Macd) hist_Macd = macd_Macd - signal_Macd //cross Macd MacdUp = crossover(macd_Macd,signal_Macd) ? 1 : 0 MacdDown = crossunder (macd_Macd,signal_Macd) ? 1 : 0 plotshape(MacdUp, text="+Md", title="(+)MACD UP", location=location.belowbar, color=color.green, transp=30, style=shape.triangleup, size=size.tiny, show_last=return) plotshape(MacdDown, text="-Md", title="(-)MACD DN", location=location.abovebar, color=color.red, transp=30, style=shape.triangledown, size=size.tiny, show_last=return) // //***************************************************************************************** //Function==> Função | (11) tsi() - Trading Strenght Indicator ==> Indice de Força do Trading //Reference: Pine Script Manual - adapted TradingView version - Dalmar Santos //***************************************************************************************** _Tsi = input(title = "═════ Tsi ══════════", type = input.bool, defval = false) long_tsi = input(title="Long Length", type=input.integer, defval=72) short_tsi = input(title="Short Length", type=input.integer, defval=17) signal_tsi = input(title="Signal Length", type=input.integer, defval=17) price_tsi = close double_smooth(src_tsi, long_tsi, short_tsi) => fist_smooth_tsi = ema(src_tsi, long_tsi) ema(fist_smooth_tsi, short_tsi) pc_tsi = change(price_tsi) double_smoothed_pc_tsi = double_smooth(pc_tsi, long_tsi, short_tsi) double_smoothed_abs_pc_tsi = double_smooth(abs(pc_tsi), long_tsi, short_tsi) tsi_value_tsi = 100 * (double_smoothed_pc_tsi / double_smoothed_abs_pc_tsi) //TSI signal ==> Signal do TSI TsiUp = crossover(tsi_value_tsi,ema(tsi_value_tsi, signal_tsi)) ? 1 : 0 TsiDown = crossunder(tsi_value_tsi,ema(tsi_value_tsi, signal_tsi)) ? 1 : 0 //Show the Position ==> Mostra a posicao plotshape(TsiUp==1 ? low : na, text="+Tsi", title="(+)TSI Up", location=location.belowbar, color=color.green, transp=30, style=shape.triangleup, size=size.tiny, show_last=return) plotshape(TsiDown==1 ? high : na, text="-Tsi", title="(-)TSI DN", location=location.abovebar, color=color.red, transp=30, style=shape.triangledown, size=size.tiny, show_last=return) // //*************************************************************************** //Function==> Função | (12) Buy and Sell TRADE Points //Reference: Pine Script Manual - adapted TradingView version - Dalmar Santos //*************************************************************************** //Cross Point ==> pontos de cruzamento crossUP=crossover(emaOhlc4,dema34) crossDN=crossunder(emaOhlc4,dema34) //Show de Buy and Sell points ==> mostra pontos de compra e venda tradeColor=crossUP ? color.red : crossDN ? color.green : na //line buy or sell ==> linha de compra ou venda plot(crossUP ? dema34 : crossDN ? dema34: na, color=tradeColor, style=plot.style_line, linewidth=4, editable=false, show_last=return) //Buy point ==> pontos de compra plotshape(crossUP ? dema34 : na, style=shape.labelup, location=location.absolute, text="Buy", transp=0, textcolor = color.white, color=color.green, editable=false, show_last=return) //Sell points ==> pontos de venda plotshape(crossDN ? dema34: na, style=shape.labeldown, location=location.absolute, text="Sell", transp=0, textcolor = color.white, color=color.red, editable=false, show_last=return) // //************************************************************ //Function==> Função | (13) Strategy Buy and Sell TRADE Points //Reference: Pine Script Manual - Dalmar Santos //************************************************************ //Start backtest year, month, day, hour, minute, second ==> Inicio do backtest ano, mês, dia, hora, minuto, segundo start = timestamp(2021,01,01,1,00,00) //***************** //BUY ==> COMPRA //***************** if time>= start if crossUP strategy.close("Short", comment="Close Sell") strategy.entry("Long", strategy.long, 1, comment="Open Buy") //***************** //SELL ==> Venda //***************** if crossDN strategy.close("Long", comment="Close Buy") strategy.entry("Short", strategy.short, 1, comment="Open Sell")