Confira os nossos eBooks, Snippets e Fóruns produzidos para cada plataforma!
Pessoal, boa tarde.
Estou com uma dúvida: peguei um snippet e gostaria de saber como colocar uma inversão de mão caso a condição ocorra, mas não estou conseguindo. Fiz abaixo como exemplo: fechamento maior que a media de 80 (compra) o inverso é a venda. Entretanto, como esse código possui um stop fixo, como ficaria a parte "ReversePosition" e em qual parte do código?
A ideia é inverter a mão caso a condição ocorra e ainda não chegou no alvo de gain ou stop...
obrigado...
const //Relação risco/ganho de 3:1 cStopEmTicks = 40; cAlvoEmTicks = 150; cStopOffsetEmTicks = 50; input bGestaoDeRiscoPelaEstrategia(true); bModuloAutomacao(false); iHorarioInicioAberturaPosicao(0905); iHorarioFimAberturaPosicao(1630); iHorarioEncerramentoDaytrade(1645); var vCompra, vVenda: boolean; bSinalCompra, bSinalVenda, bPosicionado: boolean; fPrecoStop, fPrecoAlvo, fPrecoStopOffset: float; bConfigurouRisco: boolean; begin bSinalCompra := false; bSinalVenda := false; bPosicionado := hasPosition; if Not bPosicionado and (Time >= iHorarioInicioAberturaPosicao) and (Time <= iHorarioFimAberturaPosicao) then begin ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// vCompra := Fechamento > media(80,close); vVenda := Fechamento < media(80,close); if vCompra and vVenda[1] then bSinalCompra := true; if vVenda and vCompra[1] then bSinalVenda := true; end; ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// //Gera ordem de compra a mercado quando há um Sinal de COMPRA //e define ordem stoploss e take profit if bSinalCompra then BuyAtMarket; //Gera ordem de venda a mercado quando há um Sinal de VENDA //e define ordem stoploss e take profit if bSinalVenda then SellShortAtMarket; if bGestaoDeRiscoPelaEstrategia then begin //POSIÇÃO COMPRADA //Código responsável pela manutenção das ordens de stoploss e take profit if isBought then begin if not bConfigurouRisco then begin fPrecoStop := BuyPrice - cStopEmTicks*MinPriceIncrement; fPrecoAlvo := BuyPrice + cAlvoEmTicks*MinPriceIncrement; fPrecoStopOffset := fPrecoStop - cStopOffsetEmTicks*MinPriceIncrement; bConfigurouRisco := true; end; if Not bModuloAutomacao then begin SellToCoverStop(fPrecoStop,fPrecoStopOffset); if isBought then SellToCoverLimit(fPrecoAlvo); end else begin SellShortStop(fPrecoStop,fPrecoStopOffset); if isBought then SellShortLimit(fPrecoAlvo); end; end; //POSIÇÃO VENDIDA //Código responsável pela manutenção das ordens de stoploss e take profit if isSold then begin if not bConfigurouRisco then begin fPrecoStop := SellPrice + cStopEmTicks*MinPriceIncrement; fPrecoAlvo := SellPrice - cAlvoEmTicks*MinPriceIncrement; fPrecoStopOffset := fPrecoStop + cStopOffsetEmTicks*MinPriceIncrement; bConfigurouRisco := true; end; if Not bModuloAutomacao then begin BuyToCoverStop(fPrecoStop,fPrecoStopOffset); if isSold then BuyToCoverLimit(fPrecoAlvo); end else begin BuyStop(fPrecoStop,fPrecoStopOffset); if isSold then BuyLimit(fPrecoAlvo); end; end; //Encerra posicao if (Time >= iHorarioEncerramentoDaytrade) and HasPosition then ClosePosition; if Not HasPosition then bConfigurouRisco := false; end; // Plot de Stop e Alvo para inspeção visual do código bPosicionado := hasPosition; if bPosicionado or bPosicionado[1] or bPosicionado[2] then begin //PlotN(1,fPrecoStop); //PlotN(2,fPrecoStopOffset); //PlotN(3,fPrecoAlvo); SetPlotColor(1,clRed); SetPlotColor(2,clRed); SetPlotColor(3,clGreen); SetPlotStyle(1,psDash); SetPlotStyle(2,psDash); SetPlotStyle(3,psDash); SetPlotWidth(1,2); SetPlotWidth(2,2); SetPlotWidth(3,2); end; end;
Você tentou usar a função RevesePosition:
Função ReversePosition
Descrição:
A função ReversePosition tem como funcionalidade realizar o envio de ordens, a fim de inversão da
posição. Esta função cancela todas ordens enviadas até o momento de sua chamada, no fluxo atual de
execução, e as ordens abertas. Após confirmação do cancelamento das ordens, será enviada uma
ordem para reverter a posição.
Sintaxe:
if (Low < Low[1]) and (IsBought = True) then ReversePosition;
No exemplo, caso a mínima do candle atual for menor a do candle anterior, e exista uma posição de
compra, será realizada a reversão
Montei esse código, mas infelizmente algumas reversões ele zera no lugar de reverter a mão. Tentei limpar o máximo possível para não dar errado, mas não consegui. É só um padrão de código para eu colocar as estratégias dentro.
Fiz com DIPDIM para ter uma ideia. Em anexo a foto do problema encontrado.
Const cAlvoEmPontos = 200; cStopEmPontos = 200; cStopOffsetEmPontos = 10; input iHorarioInicioAberturaPosicao(0900); iHorarioFimAberturaPosicao(1640); iHorarioEncerramentoDaytrade(1700); Var vSinalCompra,vSinalVenda,vPosicionado : boolean; fPrecoStop,fPrecoAlvo,fPrecoStopOffset : float; bConfigurouRiscoInicial : boolean; bReversao : boolean; iIndicadoresCompra,iIndicadoresVenda : integer; bCompra, bVenda, bPosicionado : boolean; begin vSinalCompra := false; vSinalVenda := false; vPosicionado := hasPosition; /////DEFINIÇÕES DOS SINAIS DE VENDA E COMPRA If (Time >= iHorarioInicioAberturaPosicao) And (Time <= iHorarioFimAberturaPosicao) Then Begin iIndicadoresCompra := 0; iIndicadoresVenda := 0; End; //INSERIR LÓGICA //INDICADORES If DIPDIM(9)|0| > DIPDIM(9)|1| then iIndicadoresCompra := iIndicadoresCompra + 1; If DIPDIM(9)|0| < DIPDIM(9)|1| then iIndicadoresVenda := iIndicadoresVenda + 1; vSinalCompra := iIndicadoresCompra > iIndicadoresVenda; vSinalVenda := iIndicadoresVenda > iIndicadoresCompra; bCompra:= vSinalCompra and vSinalVenda[1]; bVenda:= vSinalVenda and vSinalCompra[1]; If bCompra then begin If IsSold then ReversePosition else if not IsBought then BuyAtMarket; end; If bVenda then begin If IsBought then ReversePosition else if not IsSold then SellShortAtMarket; end; // If isBought Then Begin fPrecoStop := BuyPrice - cStopEmPontos; fPrecoAlvo := BuyPrice + cAlvoEmPontos; fPrecoStopOffset := fPrecoStop - cStopOffsetEmPontos; SellToCoverLimit(fPrecoAlvo); SellToCoverStop(fPrecoStop,fPrecoStopOffset); End; If isSold Then Begin fPrecoStop := SellPrice + cStopEmPontos; fPrecoAlvo := SellPrice - cAlvoEmPontos; fPrecoStopOffset := fPrecoStop + cStopOffsetEmPontos; BuyToCoverLimit(fPrecoAlvo); BuyToCoverStop(fPrecoStop,fPrecoStopOffset); End; If vSinalCompra then Paintbar(clLime); If vSinalVenda then Paintbar(clRed); /////ENCERRAMENTO POR HORÁRIO If (Time >= iHorarioEncerramentoDaytrade) And HasPosition Then Begin ClosePosition; End; end;
Pessoal, consegui chegar num código pra resolver a questão.
Infelizmente, se colocar alvo, o Bacteste da Nelogica da pau e cancela as operações. Vou abrir outro tópico para combinar o ReversePosition com a possibilidade de alvos.
abs
///////////////////////////////////////////////////////////////////////////////////////////////////// // PARÂMETROS // ///////////////////////////////////////////////////////////////////////////////////////////////////// input {Perdas e Ganhos} iObjetivoGanhoDiario (500); iLimitePerdaDiaria (500); {Horário de Operação} iHorarioInicioAberturaPosicao (0905); iHorarioFimAberturaPosicao (1640); iHorarioEncerramentoDaytrade (1700); {Booleano que determina se a estratégias terá os alvos de ganho e/ou perda} iAlvos (false); {Alvos das operações se iAlvos = true} iAlvoEmPontos (200); iStopEmPontos (500); iStopOffsetEmPontos (10); {inputs operacionais da estratégia} iPeriodo (9); {Entrada de Parâmetros de Dia de operação} OperaSegunda (true); OperaTerca (true); OperaQuarta (true); OperaQuinta (true); OperaSexta (true); ///////////////////////////////////////////////////////////////////////////////////////////////////// // VARIÁVEIS // ///////////////////////////////////////////////////////////////////////////////////////////////////// var fResultado : float; fResultadoDiario : float; nIndicadoresCompra,nIndicadoresVenda : integer; nIndicadoresCompra2,nIndicadoresVenda2 : integer; nIndicadoresCompra3,nIndicadoresVenda3 : integer; nIndicadoresCompra4,nIndicadoresVenda4 : integer; nIndicadoresCompra5,nIndicadoresVenda5 : integer; nIndicadoresCompraTotal,nIndicadoresVendaTotal : integer; fPrecoStop,fPrecoAlvo,fPrecoStopOffset : float; bCompra, bVenda, bPosicionado : boolean; vSinalCompra,vSinalVenda,vPosicionado : boolean; DiaDaSemana : Integer; OperaHoje : Boolean; PullBackFinder : Float; BottomFinder : Float; SomaFinder : Float; Habilita : Boolean; somafindermax,somafindermin : real; ///////////////////////////////////////////////////////////////////////////////////////////////////// // INICIO // ///////////////////////////////////////////////////////////////////////////////////////////////////// begin fResultadoDiario := DailyResult(true); if (fResultadoDiario >= -1*iLimitePerdaDiaria) and (fResultadoDiario <= iObjetivoGanhoDiario) then begin If (Time >= iHorarioInicioAberturaPosicao) And (Time <= iHorarioFimAberturaPosicao) Then Begin nIndicadoresCompra := 0; nIndicadoresVenda := 0; nIndicadoresCompra2 := 0; nIndicadoresVenda2 := 0; nIndicadoresCompra3 := 0; nIndicadoresVenda3 := 0; nIndicadoresCompra4 := 0; nIndicadoresVenda4 := 0; nIndicadoresCompra5 := 0; nIndicadoresVenda5 := 0; nIndicadoresCompraTotal := 0; nIndicadoresVendaTotal := 0; End; ///////////////////////////////////////////////////////////////////////////////////////////////////// // CÁLCULOS INICIAIS // ///////////////////////////////////////////////////////////////////////////////////////////////////// {Calcula do dia da Semana} DiaDaSemana := DayOfWeek(Date); {Verifica se vai operar hoje} if (DiaDaSemana = 1) and (OperaSegunda) then OperaHoje := true else if (DiaDaSemana = 2) and (OperaTerca) then OperaHoje := true else if (DiaDaSemana = 3) and (OperaQuarta) then OperaHoje := true else if (DiaDaSemana = 4) and (OperaQuinta) then OperaHoje := true else if (DiaDaSemana = 5) and (OperaSexta) then OperaHoje := true else {Verifica o horário limite para a primeira operação} Habilita := (time >= iHorarioInicioAberturaPosicao) and (time <= iHorarioFimAberturaPosicao) and (OperaHoje); //Contagem de indicadores e determinação de suas posições //INDICADOR If Fechamento > hiloactivator(20) then nIndicadoresCompra := nIndicadoresCompra + 1; If Fechamento < hiloactivator(20) then nIndicadoresVenda := nIndicadoresVenda + 1; nIndicadoresCompraTotal:= nIndicadoresCompra; nIndicadoresVendaTotal:= nIndicadoresVenda; //Determina os Sinais de Compra e Venda vSinalCompra := nIndicadoresCompraTotal > nIndicadoresVendaTotal; vSinalVenda := nIndicadoresCompraTotal < nIndicadoresVendaTotal; bCompra:= vSinalCompra and vSinalVenda[1]; bVenda:= vSinalVenda and vSinalCompra[1]; {COLORAÇÃO DOS CANDLES} If bCompra then Paintbar(clLime); If bvenda then Paintbar(clRed); ///////////////////////////////////////////////////////////////////////////////////////////////////// // EXECUÇÃO DE OPERAÇÕES // ///////////////////////////////////////////////////////////////////////////////////////////////////// {Execução de Compra - Reversão e Compra} If bCompra then begin If IsSold then ReversePosition else if not IsBought then BuyAtMarket; end; {Execução de Venda - Reversão e Venda} If bVenda then begin If IsBought then ReversePosition else if not IsSold then SellShortAtMarket; end; {Determina os Alvos da Operação, caso iAlvos seja verdadeiro} If iAlvos = true then begin If isBought Then Begin fPrecoStop := BuyPrice - iStopEmPontos; fPrecoAlvo := BuyPrice + iAlvoEmPontos; fPrecoStopOffset := fPrecoStop - iStopOffsetEmPontos; SellToCoverLimit(fPrecoAlvo); SellToCoverStop(fPrecoStop,fPrecoStopOffset); End; If isSold Then Begin fPrecoStop := SellPrice + iStopEmPontos; fPrecoAlvo := SellPrice - iAlvoEmPontos; fPrecoStopOffset := fPrecoStop + iStopOffsetEmPontos; BuyToCoverLimit(fPrecoAlvo); BuyToCoverStop(fPrecoStop,fPrecoStopOffset); End; end; ///////////////////////////////////////////////////////////////////////////////////////////////////// // FIM // ///////////////////////////////////////////////////////////////////////////////////////////////////// end {Se resultado excedeu objetivo de ganho ou limite de perda e houver posição aberta, então encerra a posição.} else if hasPosition then ClosePosition; end;