Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
Boa tarde, obrigado pelo espaço, com certeza esta ajudando muita gente.
Sou novo, nao sou programador, estou buscando aprender, se puderem me ajudar, por favor.
Os stops nao estao sendo acionados, coloquei a regra da seguinte forma:
if (IsBought) and (close-BuyPrice >= stopgain) then ClosePosition else
if (IsBought) and (BuyPrice-close >= stoploss) then ClosePosition else
if (IsSold) and (SellPrice-close >= stopgain) then ClosePosition else
if (IsSold) and (close-SellPrice >= stoploss) then ClosePosition;
Podem me ajudar, por favor?
Obrigado.
Olá @rodrigo-lameiro!
Cara, vou tentar te ajudar com o que forneceu, mas o problema pode estar em outras partes do seu código também.
A principio seu código pode funcionar, embora ele atue sempre no fechamento do Candle.
Compartilhe o restante que fica mais fácil de identicar o problema.
Abs!
Johnathas ainda me confundo com as várias formas de abertura e fechamento de posições.
Lembrando que não executaria em backtesting e sim no modulo de automação,
Digamos que eu queira abrir uma posição de compra somente em um valor acima da máxima do candle anterior, neste caso eu abriria com BuyStop(valor maximo do candle anterior,valor maximo do candle anterior); Correto?
Mas digamos que nesta mesma situação, eu queira por segurança abrir uma ordem OCO, e posicionar uma ordem de fechamento, um stop de cobertura, neste caso eu usaria : SellToCoverStop(PrecoStop,PrecoStopOffset), correto?
E quando atingir um alvo fixo a ordem seria SellToCoverLimit(PrecoAlvo); , certo?
E como serial essas ordens no caso do backtesting?
Boa noite, Johnathas!
Claro, segue codigo completo. Seria para atua no WIN.
No caso do Stop Loss, Gain e Proteçao, nao precisaria ser no fechamento do Candle, teria que ser assim que atingisse os pontos pre-determinados.
Obrigado.
Input
MediaCurta(5);
MediaLonga(21);
StopLoss(300);
StopGain(1000);
Proteger(500);
Var
vMediaCurta, vMediaLonga: Float;
Begin
vMediaCurta := Media(MediaCurta, close);
vMediaLonga := Media(MediaLonga, close);
Plot(vmediaCurta);
Plot2(vmediaLonga);
begin
if (IsBought or IsSold) then
begin
if (IsBought) and (vMediaCurta < vMediaLonga) then ReversePosition
else
if (IsSold) and (vMediaCurta > vMediaLonga) then ReversePosition;
if (IsBought) and (close-BuyPrice >= stopgain) then ClosePosition else
if (IsBought) and (BuyPrice-close >= stoploss) then ClosePosition else
if (IsSold) and (SellPrice-close >= stopgain) then ClosePosition else
if (IsSold) and (close-SellPrice >= stoploss) then ClosePosition;
if (IsSold) and (SellPrice-close >= proteger) and (close > close[5]) then ClosePosition else
if (IsBought) and (close-BuyPrice >= proteger) and (close < close[5]) then ClosePosition;
end
else
begin
if (vMediaCurta > vMediaLonga) and (vMediaCurta[1] < vMediaLonga[1]) then BuyAtMarket
else
if (vMediaCurta < vMediaLonga) and (vMediaCurta[1] > vMediaLonga[1]) then SellShortAtMarket;
end;
end;
End;
@rodrigo-lameiro pra mim está funcionando normal, tanto o SL, como o TP, como a proteção.
Olá @alexandrecnunes!
Seu raciocínio está todo correto! A Nelógica vem atualizando o backtesting para ficar mais próximo do Módulo de Automação, de tal forma que você pode usar as ordens ToCover nos dois contextos sem problemas agora.
Minha única observação é quanto à abertura da posição. Acho que convém você verificar se o preço atual está maior ou menor que o desejado. Exemplo, se quer comprar e o preço está maior que o desejado, talvez você queira colocar uma ordem limitada no book, se estiver menor, então seria uma ordem stop. Exemplo de código:
if bSinalCompra then begin if Close >= precoDesejado then buyLimit(precoDesejado, quantidade) else buyStop(precoDesejado, precoDesejado+offset, quantidade); end;
Ou de maneira mais simples, poderia fazer a entrada a mercado se assim desejar, estando sujeito a slippage (ordem limitada não teria essa questão).
if bSinalCompra then BuyAtMarket(quantidade);
Para liquidação de posição é exatamente o que disse. Uma vez posicionado, seu código tem que ter um bloco de verificação e, dentro dele, as ordens de stop e de alvo.
Uma vez posicionado, as ordens que reduzem posição serão tratadas como ordens OCO. É o caso das ordens de alvo e stop. Há pouco tempo a documentação da Nelogica foi atualizada nas páginas 42 e 43, explicando melhor sobre esse tratamento dado no Módulo de Automação.
if isBought then begin SellToCoverStop(precoStop, precoStopOffset, quantidade); SellToCoverLimit(precoAlvo, quantidade); end;
Grande abs!
Olá @rodrigo-lameiro!
Como o @masker já confirmou que o código está funcionando, vou apenas pontuar sobre ReversePosition.
Tal comando funciona no Backtesting (Editor de Estratégias)...PORÉM, o Profit não faz reversão de posição no Módulo de Automação.
A Nelogica diz que é para dar mais segurança...mas isso acaba restringindo muito alguns setups que exigem reversão.
Grande abs!