동적 양방향 추가 위치 전략

저자:차오장, 날짜: 2023-11-27 11:33:11
태그:

img

전반적인 설명

이 전략은 두 방향의 강력한 돌파구 신호를 사용하여 두 방향으로 포지션을 취하는 전략입니다. 두 개의 연속적인 강한 촛불이 같은 방향으로 나타났을 때 포지션을 열기 위해 방향을 선택하고 위험 관리를 위해 수익 중지 및 손실을 중지합니다.

전략 원칙

이 전략은 두 개의 연속적인 강한 촛불의 신호에 기초하여 시장 방향을 판단합니다. 구체적으로, 각 촛불의 증가/감소 비율을 계산합니다. 두 개의 연속적인 촛불의 증가/감소 비율이 사용자에 의해 설정된 문턱을 초과하면 (예를 들어 6%), 방향이 강하다는 것을 결정하고 세 번째 촛불에서 긴/단 포지션을 개척합니다.

긴 조건: 두 개의 연속 촛불의 폐쇄 가격은 이전 폐쇄 가격에 비해 6% 이상 상승합니다.

짧은 조건: 두 개의 연속 촛불의 폐쇄 가격은 이전 폐쇄 가격에 비해 6% 이상 떨어집니다.

포지션을 열면 위험을 제어하기 위해 스톱프로프트 및 스톱 러스 거리를 설정합니다. 스톱프로프트 거리는 사용자가 입력하고 스톱 러스 거리는 오픈 가격의 배수 (예를 들어 8배) 입니다.

이 전략은 또한 특정 기간 동안만 포지션을 열 수 있도록 허용하고, 최대 손실 금액을 설정하는 등 위험을 제어하는 몇 가지 보조 기능을 가지고 있습니다.

이점 분석

이것은 비교적 안정적이고 신뢰할 수 있는 양방향 거래 전략입니다. 주요 장점은 다음과 같습니다.

  1. 쌍방향 거래는 시장이 상승과 하락을 할 때 이익을 얻을 수 있으며 안정성을 향상시킵니다.

  2. 두 가지 강력한 신호를 기반으로 트렌드를 판단하면 소음을 효과적으로 필터링하고 개설 포지션의 품질을 향상시킬 수 있습니다.

  3. 스톱프로프트와 스톱프로프트의 설정은 합리적이므로 위험 통제와 손실 제한에 유리합니다.

  4. 보조 기능은 시간 제어, 최대 손실 제어 등이 포괄적입니다. 그들은 위험을 매우 잘 제어 할 수 있습니다.

  5. 이 전략은 간단하고 명확하기 때문에 백테스트하고 최적화하는 것이 쉽습니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 시장 연장 시에는 스톱 로즈가 발생할 수 있습니다. 신호 품질을 보장하기 위해 첫 번째 신호의 매개 변수를 적절히 조정할 수 있습니다.

  2. 세 개의 연속적인 초강한 촛불의 확률은 상대적으로 작고, 이는 포지션을 열기 위한 기회가 줄어들 수 있습니다. 우리는 파라미터를 적절하게 줄일 수 있지만 신호 품질을 균형 잡아야 합니다.

  3. 갑작스러운 사건으로 인한 비합리적인 행동으로 인해 중단 손실 거리를 초과하는 엄청난 손실이 발생할 수 있습니다. 우리는 이 문제를 해결하기 위해 최대 손실 금액을 설정해야합니다.

  4. 쌍방향 거래의 구현을 위해서는 자금 할당 문제에 주의를 기울여야합니다. 그렇지 않으면 손실을 멈추지 않고 이익을 얻을 수 있습니다.

최적화 방향

이 전략은 다음과 같은 측면에서 더 이상 최적화 될 수 있습니다.

  1. 신호 품질을 향상시키기 위해 첫 번째 신호 판단의 논리를 최적화하십시오. 거래량 변화, 변동률 등과 같은 더 많은 요소가 고려 될 수 있습니다.

  2. 스톱프로프트와 스톱손실의 표준을 최적화한다. 리스크-어워드 비율을 더 합리적으로 만들기 위해 다른 시장에 기반한 매개 변수를 조정한다. 스톱손실 거리를 동적 스톱손실로 설정할 수도 있다.

  3. 더 많은 리스크 제어 모듈을 추가합니다. 예를 들어 최대 일일 손실, 최대 연속 손실 등. 효율적이고 안전한 자금 사용을 보장하기 위해.

  4. 자금의 할당 비율을 최적화하여 쌍방향 거래의 자본 할당을 더 합리화하여 손실을 멈추지 않고 수익을 창출하는 것을 방지합니다.

  5. 다양한 거래 품종에 대한 백테스팅 최적화를 위해 다른 매개 변수 조합을 설정하여 적응력을 향상시킵니다.

요약

이 전략은 비교적 견고한 이중 방향 부가 포지션 전략이다. 높은 신호 품질과 특정 리스크 제어 기능을 가지고 있다. 또한 수익 안정성을 더욱 향상시키기 위해 최적화 할 수있는 넓은 공간이 있다. 이 전략은 중장기 트렌딩 시장에 적합하며 시장 통합 중에도 기회를 잡을 수 있다.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="GAVAD", shorttitle="GAVAD", overlay=false, initial_capital=36000)

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                     GAVAD %                        //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////
Sinal = input(6, title="Sinal", type=input.integer, minval=1, maxval=150)
//Objetivo = input(6, title="Objetivo", type=input.integer, minval=1, maxval=100)
Multip = input(10000, title="Sinal", type=input.integer, minval=1, maxval=100000)



//GavadEntrada1 = (close - low [1])/close[1]
//plot(GavadEntrada1, style=plot.style_line, linewidth=3, color=color.yellow)

//sombra
//DownOL = (low - open ) / open * -10000
//plot(DownOL, style=plot.style_area, linewidth=3, color=color.silver)


// imprime o GAVAD
GavadEntrada = (close - close [1])/close[1] * Multip
plot(GavadEntrada, style=plot.style_histogram, linewidth=3, color=color.purple)

//linha do Sinal
plot(Sinal, style=plot.style_line, linewidth=1, color=color.yellow)
//linha do Objetivo
//plot(Objetivo, style=plot.style_line, linewidth=1, color=color.white)

Fura1 = GavadEntrada [0] >= Sinal
Fura2 = GavadEntrada [1] >= Sinal

Alert = Fura1
plotshape(Alert, style=shape.circle,  location = location.top, color= color.yellow)

SinalON = Fura1 and Fura2
plotshape(SinalON, style=shape.circle,  location = location.bottom, color= color.green)



////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//              CONDIÇÕES DE OPERACAO                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////



Sell_Forte2 = SinalON
//plotshape(Sell_Forte2, style=shape.xcross, color=color.yellow, location=location.bottom)

//Call_Forte2 = SinalON
//plotshape(Call_Forte2, style=shape.xcross, color=color.yellow, location=location.top)


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                    CALENDARIO                      //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

//052)
// trading view solicita que se ja informado data para gerar backtest a partir de tal data
//começa backtest do trading sistem em qual data ?

ano = input(2021, minval=1, title="Ano")
mes = input(1, minval=1, maxval=12, title="Mes")
dia = input(1, minval=1, maxval=30, title="Dia")
hora = input(0, minval=1, maxval=23, title="hora")
minuto = input(0, minval=1, maxval=59, title="minuto")
horaabertura = input(10, minval=1, maxval=23, title="hora Inicio Operacao Robo")
minutoabertura = input(40, minval=1, maxval=59, title="Minuto Encerra Tudo")
horaencerra = input(17, minval=1, maxval=23, title="hora Fechamento")
minutoencerra = input(50, minval=1, maxval=59, title="Minuto Encerra Novas Operacoes")
minutofinaliza = input(50, minval=1, maxval=59, title="Minuto Encerra Tudo")


//valida se o dia de hoje é posterior ao dia informado acima
Validadia = year >= ano and month >= mes and dayofmonth >= dia


//cria horario de abertura de negociaçao, considerar default 10 hs, pois os indicadores ja estarão corrigidos
abreloja = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaabertura
//and minute >= minutoabertura)


//cria horario de fechamento de todas as negociaçoes, considerar default 17:00 hs
//nenhuma ordem pode ser aberta depois dessa data e as abertas devem ser fechadas
fechaloja = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaencerra
//and minute >= minutoencerra)

fechaloja2 = year >= ano and month >= mes and dayofmonth >= dia and hour >= horaencerra
//and minute >= minutofinaliza)


//valida horario de negociação, pra liberar as operacoes.
lojaaberta = abreloja == true and fechaloja == false and fechaloja2 == false


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//             GERENCIAMENTO DE RISCO                 //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

//seta meta mensal
meta = input(150000, "Meta de Lucro")
Contratos= input(5, "Contratos")

//seta tamanho do lote (ordem inicial-unica)
tamanhodolote = Contratos

//seta stop gain final em pontos (metade da barra anterior)
//gaintotal = input(30, "Gain")
gaintotal = input(3, "Gain")

//seta stop loss final em pontos
lossmaximo = input(8, "Loss")
//lossmaximo = (open- close)*100

////////////////////////////////////////////////////////
//                                                    //
//                     Checkbox                       //
//                                                    //
////////////////////////////////////////////////////////

//ativacomprasretorno = input(title="Ativar Compras Retorno", type=input.bool , defval=true)
//ativavendasretorno = input(title="Ativar Vendas Retorno", type=input.bool , defval=true)


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                  COMPRA E VENDA                    //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

Tradenumber = strategy.closedtrades + 1
Batemeta = strategy.netprofit < meta

//COMPRA RETORNO
//longcondition2 = Validadia and Call_Forte2 and Batemeta


//strategy.entry("Comprar", strategy.long, tamanhodolote, when=longcondition2, comment="[Oper=" + tostring(Tradenumber) + "]win=" + tostring(strategy.wintrades) + " | Loss=" + tostring(strategy.losstrades))
//strategy.exit("Saida Compra", "Comprar", profit=gaintotal, loss=lossmaximo)
//if (CruzamentoFechaCallGG)
    //strategy.close(id="Comprar")
//if (EscapeFechaCall)
  // strategy.close(id="Comprar")   
   
    
//plotchar(longcondition2, char="C", location=location.bottom, color=color.lime, transp=0)
//alertcondition(longcondition2, "Comprar", "Compra Rápida!")

//VENDA RETORNO
Shortcondition2 = Validadia and Sell_Forte2 and Batemeta

strategy.entry("Vender", strategy.short, tamanhodolote, when=Shortcondition2)
strategy.exit("Fecha Venda", "Vender", profit=gaintotal, loss=lossmaximo)
//if (CruzamentoFechaSellGG)
   // strategy.close(id="Vender")
//if (EscapeFechaSell)
   // strategy.close(id="Comprar")  
//plotchar(CruzamentoFechaSellGG, char="Y", location=location.top, color=color.lime, transp=0) 

//plotchar(longcondition2, char="S", location=location.bottom, color=color.lime, transp=0)
//alertcondition(longcondition2, "Vender", "Venda Rápida!")

//fim do codigo

더 많은