
Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
Tinha um indicador (coloração) e decidi transformar em automação, com auxilio dos seus posts.
Mas depois de atualizar, colocar a programação para ordens, e até funcionar, começou a dar erro de compilação de sintaxe.
Parser[3,1]: O código deve começar com begin
Erro de Sintaxe
Segue o código:
input
TakeProfitPontos(400); // Valor padrão de 400 pontos para o Take Profit
StopLossPontos(200); // Valor padrão de 200 pontos para o Stop Loss
cStopOffsetEmpontos(10);
bGestaoDeRiscoPelaEstrategia(true);
iHorarioInicioAberturaPosicao(0905);
iHorarioFimAberturaPosicao(1630);
iHorarioEncerramentoDaytrade(1645);
VAR
xEma52,
xVWAP,
xOBV,
xEma52OBV,
xEma200OBV : float;
xSelect : integer;
nStopPoints : float;
nTargetPoints : float;
nContracts : integer;
bPosicionado: boolean;
fPrecoStop, fPrecoAlvo, fPrecoStopOffset: float;
bConfigurouRisco: boolean;
BEGIN
nStopPoints := StopLossPontos;
nTargetPoints := TakeProfitPontos;
begin
// Cálculo do OBV
if Close > Close[1] then
xOBV := xOBV[1] + QuantityVol(false)
else if Close < Close[1] then
xOBV := xOBV[1] - QuantityVol(false)
else
xOBV := xOBV[1];
end;
// Cálculo dos indicadores
xEma52 := MediaExp(52, Close);
xVWAP := VWAP(1);
xEma52OBV := MediaExp(52, xOBV);
xEma200OBV := MediaExp(200, xOBV);
// Reset da variável de seleção
xSelect := 0;
// Condição de Compra (Long)
if ((Close[1] < xEma52[1]) or (Close[1] < xVWAP[1]) or (xOBV[1] < xEma200OBV[1]))
and (Close > xEma52)
and (Close > xVWAP)
and (Close - xEma52 < 450)
and (xOBV > xEma52OBV)
and (xOBV > xEma200OBV) then
begin
xSelect := 1;
end;
// Condição de Venda (Short)
if ((Close[1] > xEma52[1]) or (Close[1] > xVWAP[1]) or (xOBV[1] > xEma200OBV[1]))
and (Close < xEma52)
and (xEma52 - Close < 450)
and (Close < xVWAP)
and (xOBV < xEma52OBV)
and (xOBV < xEma200OBV) then
begin
xSelect := -1;
end;
// Lógica de Execução de Ordens
begin
if xSelect = 1 then
begin
BuyAtMarket;
if bGestaoDeRiscoPelaEstrategia then
begin
//POSIÇÃO COMPRADA
//Código responsável pela configuração das ordens de stoploss e take profit NA ENTRADA
fPrecoStop := BuyPrice - StopLossPontos * MinPriceIncrement;
fPrecoAlvo := BuyPrice + TakeProfitPontos * MinPriceIncrement;
fPrecoStopOffset := fPrecoStop - cStopOffsetEmpontos * MinPriceIncrement;
SetStopLoss(fPrecoStop, fPrecoStopOffset);
SetProfitTarget(fPrecoAlvo);
end;
end
else if xSelect = -1 then
begin
SellShortAtMarket;
if bGestaoDeRiscoPelaEstrategia then
begin
//POSIÇÃO VENDIDA
//Código responsável pela configuração das ordens de stoploss e take profit NA ENTRADA
fPrecoStop := SellPrice + StopLossPontos * MinPriceIncrement;
fPrecoAlvo := SellPrice - TakeProfitPontos * MinPriceIncrement;
fPrecoStopOffset := fPrecoStop + cStopOffsetEmpontos * MinPriceIncrement;
SetStopLoss(fPrecoStop, fPrecoStopOffset);
SetProfitTarget(fPrecoAlvo);
end;
end;
// Encerramento Daytrade
if Time >= iHorarioEncerramentoDaytrade and isPositionOpen then
begin
ClosePosition;
end;
END;
END;
Como corrigir? Já procurei tudo. Em outro código semelhante, inclusive onde esse identifica erro de sintaxe, os erros são outros:
Parser[12,1]: Tem que ser identificador na declaração de variável
Parser[12,1]: O código deve começar com begin
Erro de Sintaxe
Segue o codigo (é uma variação para DOL).
INPUT
StopLossPontos(7); // Valor padrão de 7 pontos para o Stop Loss
TakeProfitPontos(21); // Valor padrão de 21 pontos para o Take Profit
cStopOffsetEmpontos(2);
bGestaoDeRiscoPelaEstrategia(true);
iHorarioInicioAberturaPosicao(0905);
iHorarioFimAberturaPosicao(1630);
iHorarioEncerramentoDaytrade(1645);
VAR
xEma52,
xVWAP,
xOBV,
xEma52OBV,
xEma200OBV : float;
xSelect : integer;
nStopPoints : float;
nTargetPoints : float;
nContracts : integer;
bPosicionado: boolean;
fPrecoStop, fPrecoAlvo, fPrecoStopOffset: float;
bConfigurouRisco: boolean;
BEGIN
nStopPoints := StopLossPontos;
nTargetPoints := TakeProfitPontos;
nContracts := NumContratos;
begin
// Cálculo do OBV
if Close > Close[1] then
xOBV := xOBV[1] + QuantityVol(false)
else if Close < Close[1] then
xOBV := xOBV[1] - QuantityVol(false)
else
xOBV := xOBV[1];
end;
// Cálculo dos indicadores
xEma52 := MediaExp(52, Close);
xVWAP := VWAP(1);
xEma52OBV := MediaExp(52, xOBV);
xEma200OBV := MediaExp(200, xOBV);
// Reset da variável de seleção
xSelect := 0;
// Condição de Compra (Long)
if ((Close[1] < xEma52[1]) or (Close[1] < xVWAP[1]) or (xOBV[1] < xEma200OBV[1]))
and (Close > xEma52)
and (Close > xVWAP)
and (Close - xEma52 < 450)
and (xOBV > xEma52OBV)
and (xOBV > xEma200OBV) then
begin
xSelect := 1;
end;
// Condição de Venda (Short)
if ((Close[1] > xEma52[1]) or (Close[1] > xVWAP[1]) or (xOBV[1] > xEma200OBV[1]))
and (Close < xEma52)
and (xEma52 - Close < 450)
and (Close < xVWAP)
and (xOBV < xEma52OBV)
and (xOBV < xEma200OBV) then
begin
xSelect := -1;
end;
// Lógica de Execução de Ordens
begin
if xSelect = 1 then
begin
BuyAtMarket(nContracts);
PrecoCompra := LastTrade; // Armazena o preço de execução da compra
end
else if xSelect = -1 then
begin
SellShortAtMarket(nContracts);
PrecoVenda := LastTrade; // Armazena o preço de execução da venda
end;
end;
// Lógica para envio de Stop Loss e Take Profit APÓS a ordem principal ser executada
if PrecoCompra > 0 then
begin
SetStopLoss(nStopPoints);
SetProfitTarget(nTargetPoints);
PrecoCompra := 0; // Reseta a variável para não enviar ordens novamente no mesmo candle
end;
if PrecoVenda > 0 then
begin
SetStopLoss(nStopPoints);
SetProfitTarget(nTargetPoints);
PrecoVenda := 0; // Reseta a variável para não enviar ordens novamente no mesmo candle
end;
end
Agradeço se der uma luz. Já procurei em todo lugar aqui, IA, etc.
Não consigo nem testar a teoria.
Obrigado.