Erro em PositionClose() WIN$

 

Estou tentando encerrar as posições após certo horário no ativo WIN$ pela corretora Genial com modelação de Cada Tick(com OHLC e Tick real ocorre o mesmo erro). Porém, PositionClose() retorna 0 e trade.ResultRetCode() retorna status de done(10009) e GetLastError() retorna 4753.

              if(PositionsTotal() > 0)
              {
               ResetLastError();
               for(int i=PositionsTotal()-1; i>=0; i--)
                 {
                 
                  if(m_position.Symbol()==Symbol())
                    {
                     ulong currentPrice = long(m_symbol.NormalizePrice(m_position.PriceCurrent()));
                     if(!trade.PositionClose(currentPrice)) // close a position by the specified m_symbol
                        Print(__FILE__," ",
                              __FUNCTION__,
                              ", ERROR: ",
                              "CTrade.PositionClose ",
                              GetLastError(),
                              " ",
                              trade.ResultRetcode(),
                              " ",
                              currentPrice);
                    }
                 }

              }

Alguma sugestão do que acontece ?

 
sheywesk:

Estou tentando encerrar as posições após certo horário no ativo WIN$ pela corretora Genial com modelação de Cada Tick(com OHLC e Tick real ocorre o mesmo erro). Porém, PositionClose() retorna 0 e trade.ResultRetCode() retorna status de done(10009) e GetLastError() retorna 4753.

Alguma sugestão do que acontece ?

Boa noite!


Eu não utilizo bibliotecas (falha minha), mas esse currentPrice definido como ulong está correto? Não seria double não?

 
Na verdade n
Vinicius de Oliveira:

Boa noite!


Eu não utilizo bibliotecas (falha minha), mas esse currentPrice definido como ulong está correto? Não seria double não?


Boa noite ! 

Na verdade não, essa função recebe ulong mesmo !

 
sheywesk:
Na verdade n


Boa noite ! 

Na verdade não, essa função recebe ulong mesmo !

Na verdade você está errado.



 
Jonathan Pereira:

Na verdade você está errado.



Desculpe...mas em que estou errado ? 

 
sheywesk:

Desculpe...mas em que estou errado ? 

Pela imagem acima, a função PositionClose possui 2 versões: numa, você informa symbol e deviation (ou apenas symbol); noutra, informa ticket e deviation (ou apenas ticket). O erro está em informar o preço como parâmetro. 👍

 
Vinicius de Oliveira:

Pela imagem acima, a função PositionClose possui 2 versões: numa, você informa symbol e deviation; noutra, informa ticket e deviation. O erro está em informar o preço como parâmetro. 👍

Eu entendo que existem duas funções mas o segundo parâmetro é opcional. Entendi que tem que passar o ticket, mas quando passo ele recebe invalid price por que tenta efetuar operações em preços que o WIN não permite, por isso eu estava passando o preço pois vi em algum lugar do forum dessa forma. Você sabe como resolver isso com ticket ?  ahh,e em ambas funções acontece o mesmo...invalid price.

 
sheywesk:

Eu entendo que existem duas funções mas o segundo parâmetro é opcional. Entendi que tem que passar o ticket, mas quando passo ele recebe invalid price por que tenta efetuar operações em preços que o WIN não permite, por isso eu estava passando o preço pois vi em algum lugar do forum dessa forma. Você sabe como resolver isso com ticket ?  ahh,e em ambas funções acontece o mesmo...invalid price.

no meu metatrader não esta escrito que é opcional...esta escrito para preencher ulong_max, é o desvio

 
Eduardo Oliveira:

no meu metatrader não esta escrito que é opcional...esta escrito para preencher ulong_max, é o desvio

Sim esse parâmetro é opcional ser fornecido, porem se não preenchido será usado o valor default que é ulong_max, ou seja qualquer deviation.


Eu entendo que existem duas funções mas o segundo parâmetro é opcional. Entendi que tem que passar o ticket, mas quando passo ele recebe invalid price por que tenta efetuar operações em preços que o WIN não permite, por isso eu estava passando o preço pois vi em algum lugar do forum dessa forma. Você sabe como resolver isso com ticket ?  ahh,e em ambas funções acontece o mesmo...invalid price.


Esse erro provavelmente é por conta de outra coisa, use o depurador para entender o que ocorre nas chamadas, isso pode se meio obvio, mas depure todo o caminho ate mesmo quando entrar nas classes standart.

Outro erro é que você não valida o numero magico, então pode ocorrer de fechar posição que não seja do EA.

A função abaixo funciona perfeitamente.

bool CloseAtMarket(void)
  {
   bool res=false;

   CTrade *trade=new CTrade();

   for(int i = PositionsTotal()-1; i>=0; i--)
     {
      if(PositionGetSymbol(i) == ::Symbol() && PositionGetInteger(POSITION_MAGIC) == InpMagicEA)
        {
         if(!trade.PositionClose(PositionGetInteger(POSITION_TICKET)))
           {
            Print("Falha. ResultRetcode: ", trade.ResultRetcode(), ", RetcodeDescription: ", trade.ResultRetcodeDescription());
           }
         else
            res=true;
        }
     }

   if(trade!=NULL)
     {
      delete trade;
      trade=NULL;
     }
   return res;
  }
 
Eduardo Oliveira:

no meu metatrader não esta escrito que é opcional...esta escrito para preencher ulong_max, é o desvio

"ulong deviation=ULONG_MAX" , caso vc não passe nenhum dado ele recebe o default ULONG_MAX. Tente retirar e compilar que tudo ocorrerá normal.
 
Jonathan Pereira:

Sim esse parâmetro é opcional ser fornecido, porem se não preenchido será usado o valor default que é ulong_max, ou seja qualquer deviation.



Esse erro provavelmente é por conta de outra coisa, use o depurador para entender o que ocorre nas chamadas, isso pode se meio obvio, mas depure todo o caminho ate mesmo quando entrar nas classes standart.

Outro erro é que você não valida o numero magico, então pode ocorrer de fechar posição que não seja do EA.

A função abaixo funciona perfeitamente, note, não há quase nenhuma diferença com o seu código. 

Entendi...mas no caso eu estou usando apenas esse EA mesmo. Inseri o número mágico e adotarei para os próximos códigos (Meu primeiro contato com a linguagem foi ontem rsrs). Testei seu código mas continua na mesma em que ele tenta lançar uma ordem ao preço de 111556 quando deveria ser a 111555. Obrigado pela ajuda !! Vou analisar o depurador e tentar encontrar algo.
Razão: