Resposta

Ordem de parada/limite muito próxima do preço real

6 respostas

sansay

Assinante, bbp_participante, comunidade, 11 respostas.

Perfil da visita

7 anos atrás #116332

Veja a captura de tela em anexo.

Quando vi pela primeira vez esse registro do EA, "ordem de parada/limite muito próxima do preço real", pensei imediatamente "OK, o nível de parada está incorreto". Então, editei o código e alterei o valor de MinDistanceOfStopFromPrice para 70, pois essa era a especificação do par USDMXN. No entanto, como você pode ver na captura de tela, isso não resolveu o problema. Na verdade, eu até tentei 100, 200, 700, mas não mudou nada.

Qualquer ajuda seria muito apreciada.

0

sansay

Assinante, bbp_participante, comunidade, 11 respostas.

Perfil da visita

7 anos atrás #141561

Qual captura de tela?

 

Tenho o problema oposto, preciso que algumas ordens Stop_limit estejam mais próximas do preço.

 

Isso é estranho, tenho certeza de que anexei o arquivo png. Vamos tentar novamente...

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

7 anos atrás #141585

Isso acontece quando você faz um pedido ou tenta modificar o PT, o SL ou o preço do pedido?

0

sansay

Assinante, bbp_participante, comunidade, 11 respostas.

Perfil da visita

7 anos atrás #141594

Eu não faço nada, é um EA criado com o SQ. Ele faz isso e acho que o código é adicionado a cada um dos EAs que ele cria. A diferença nesse caso é que esse corretor forex específico tem um nível de 70 stops, enquanto outros têm 0.

É claro que aqueles com 0 não acionam nada.

O código está em funcionamento: 

void openPosition(int tradeDirection) {

      // verificar se o preço de parada/limite não está muito próximo
      if(NormalizeDouble(MathAbs(openPrice - AskOrBid), Digits) <= NormalizeDouble(eaStopDifferenceNumber, Digits)) {
         //Log("stop/limit order is too close to actual price");
         retorno;
      }
portanto, é claro que quando isso acontece, nenhuma negociação é aberta.
Ontem, tentei ver o que aconteceria se eu removesse a declaração de devolução. Eu queria ver se o revendedor também rejeitaria o pedido. 
A declaração apareceu no registro do Expert, mas não ocorreu nenhuma negociação e nenhum outro registro apareceu. Vou tentar novamente e, desta vez, adicionarei mais registros para saber o caminho que o processo tomou.

0

sansay

Assinante, bbp_participante, comunidade, 11 respostas.

Perfil da visita

7 anos atrás #141656

Esta manhã, descobri que ele tentou e não conseguiu colocar uma ordem de parada de venda. Veja o registro em anexo.

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

7 anos atrás #141681

Pergunto isso porque você colocou a pergunta no tópico "EA Wizard"

 

Você pode publicar a estratégia aqui ou me enviar para [email protected] para que eu possa tentar testá-lo também no USDMXN

0

sansay

Assinante, bbp_participante, comunidade, 11 respostas.

Perfil da visita

7 anos atrás #141685

Na verdade, meus testes me permitiram encontrar o problema e eu corrigi o código.

O problema é que o servidor do corretor verifica se há:
curto: orderPrice < currentPrice - stopLevel 

longo: orderPrice > currentPrice + stopLevel

 

Se a condição não for atendida, a solicitação de modificação falhará. Atualmente, o código ajusta o stopLoss e o targetProfit para que estejam pelo menos dentro do nível de stop do revendedor + ou - do orderPrice. E isso faz com que o teste falhe sempre que o orderPrice for exatamente CurrentPrice -+ stopLevel. Portanto, a solução foi simplesmente adicionar ou subtrair 1 pip. Aqui está a alteração do código:

 

Nos parâmetros ocultos, declare:

double stopOffset = 0,0001;

 

Adicionar e passar o parâmetro tradeDirection à assinatura e à chamada do método openOrderWithErrorHandling:
int openOrderWithErrorHandling(int tradeDirection, int orderType, double orderLots, double openPrice, double stopLoss, double profitTarget, string comment, int magicNumber) {

 

No mesmo método, adicione o código em verde:

 

   if(stopLoss != 0 || profitTarget != 0) {
      se( tradeDirection == 1 )
      {
         stopLoss -= stopOffset;
         profitTarget += stopOffset;
      }
      Caso contrário, se (tradeDirection == -1)
      {
         stopLoss += stopOffset;
         profitTarget -= stopOffset;
      }
      Log("Setting SL/PT, SL: ", stopLoss, ", PT: ", profitTarget);
      if(OrderModify(ticket, OrderOpenPrice(), stopLoss, profitTarget, 0, 0)) {
         Log("Ordem modificada, StopLoss: ", OrderStopLoss(),", Profit Target: ", OrderTakeProfit());
      {} else {
         Log("Erro ao modificar o pedido: ",error, " : ", ErrorDescription(error));
      }
   }
 
Isso funciona. As modificações nas negociações são aceitas pelo servidor.

0

Visualizando 6 respostas - 1 até 6 (de um total de 6)