ERRO 4756 - INVALID PRICE

Para adicionar comentários, por favor Faça o login ou registrar
Rodrigo Matheus da Silva
232
Rodrigo Matheus da Silva  

Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz???

input double num_lots                 = 600;    // Número de Lotes
input double TK                    = 10;     // Take Profit
input double SL                    = 0.1;     // Stop Loss
input string hora_limite_fecha_op  = "17:00";// Horário limite para fechar posição 
input int dema_high_slow           = 7;     // DEMA ALTA periodo de calcula longo
input int dema_low_slow            = 7;     // DEMA BAIXA periodo de calculo longo


void CompraAMercado() // bser na documentação ordem das variaveis!!!
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Compra
   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado
   requisicao.magic        = magic_number;                                 // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo
   requisicao.volume       = num_lots;                                     // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.ask,_Digits);            // Preço para a compra
   requisicao.sl           = NormalizeDouble(requisicao.price - SL*_Point,_Digits);// Preço Stop Loss
   requisicao.tp           = NormalizeDouble(requisicao.price + TK*_Point,_Digits);// Alvo de Ganho - Take Profit
   requisicao.deviation    = 0;                                            // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_BUY;                               // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_RETURN;                            // Tipo deo Preenchimento da ordem
   
   //---
   OrderSend(requisicao,resposta);
   //---
   if(resposta.retcode == 10008 || resposta.retcode == 10009)
     {
      Print("Ordem de Compra executada com sucesso!");
     }
   else
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
       ResetLastError();
     }
  }

void VendaAMercado()
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Venda
   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado
   requisicao.magic        = magic_number;                                 // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo
   requisicao.volume       = num_lots;                                     // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.ask,_Digits);            // Preço para Venda
   requisicao.sl           = NormalizeDouble(requisicao.price + SL*_Point,_Digits);// Preço Stop Loss
   requisicao.tp           = NormalizeDouble(requisicao.price - TK*_Point,_Digits);// Alvo de Ganho - Take Profit
   requisicao.deviation    = 0;                                            // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_SELL;                              // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_RETURN;                            // Tipo deo Preenchimento da ordem
   //---
   OrderSend(requisicao,resposta);
   //---
     if(resposta.retcode == 10008 || resposta.retcode == 10009)
       {
        Print("Ordem de Venda executada com sucesso!");
       }
     else
       {
        Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());
        ResetLastError();
       } 
 }

E retorna o :

2019.08.05 13:42:51.236 Core 1 2019.08.02 12:48:27   failed instant sell 500.00 GBPJPY at 0.000 [Invalid price]

2019.08.05 13:42:51.236 Core 1 2019.08.02 12:48:27   Erro ao enviar Ordem Venda. Erro = 4756

Quando opero PETR4, vale, acoes Brasileiras, vai tranquilo, mas em dollar, forex, comodities, ai paro aqui....
Trader_Patinhas
1127
Trader_Patinhas  
rodrigorizando:

Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz???

E retorna o :

2019.08.05 13:42:51.236 Core 1 2019.08.02 12:48:27   failed instant sell 500.00 GBPJPY at 0.000 [Invalid price]

2019.08.05 13:42:51.236 Core 1 2019.08.02 12:48:27   Erro ao enviar Ordem Venda. Erro = 4756

Quando opero PETR4, vale, acoes Brasileiras, vai tranquilo, mas em dollar, forex, comodities, ai paro aqui....

Pela mensagem de erro, tudo indica que a variável "tick.ask" deve estar valendo zero.

Você não está mostrando a parte do código onde a estrutura "tick" está sendo declarada e preenchida.

Suponho que "tick" tenha sido declarada como variável global, senão o código não compilaria.

Variáveis globais são inicializadas automaticamente com zero.

Será que vc está realmente preenchendo os campos da estrutura "tick" ?

Rogerio Giannetti Torres
3150
Rogerio Giannetti Torres  
rodrigorizando:


Bom dia Rodrigo,

Forex também exige que o SL/TP obedeça ao stop (gain/loss) mínimo do instrumento, veja a especificação do instrumento.


 stopLevel =SymbolInfoInteger(_Symbol,SYMBOL_TRADES_STOPS_LEVEL);
 double SSL=(SL > stopLevel) ?  SL*_Point : stopLevel*_Point;
 double TTP=(TK > stopLevel) ?  TK*_Point : stopLevel*_Point;
 requisicao.sl           = NormalizeDouble(requisicao.price + SSL,_Digits);// Preço Stop Loss
 requisicao.tp          = NormalizeDouble(requisicao.price - TTP,_Digits);// Alvo de Ganho - Take Profitps


PS: A saber, eu frisei  FOREX porque não é comum ter stop level em BOLSA, mas o correto é codificar SL/TP como mostrado, assim o programa fica apto para BOLSAS e FOREX.

Rodrigo Matheus da Silva
232
Rodrigo Matheus da Silva  
Trader_Patinhas:

Pela mensagem de erro, tudo indica que a variável "tick.ask" deve estar valendo zero.

Você não está mostrando a parte do código onde a estrutura "tick" está sendo declarada e preenchida.

Suponho que "tick" tenha sido declarada como variável global, senão o código não compilaria.

Variáveis globais são inicializadas automaticamente com zero.

Será que vc está realmente preenchendo os campos da estrutura "tick" ?


Vlwww Patinhas, mas o tick esta certinho quando dou print nele, parece não ser isto não..

Rodrigo Matheus da Silva
232
Rodrigo Matheus da Silva  
Rogerio Giannetti Torres:

Bom dia Rodrigo,

Forex também exige que o SL/TP obedeça ao stop (gain/loss) mínimo do instrumento, veja a especificação do instrumento.



PS: A saber, eu frisei  FOREX porque não é comum ter stop level em BOLSA, mas o correto é codificar SL/TP como mostrado, assim o programa fica apto para BOLSAS e FOREX.

Oi Rogério, eu verifiquei aqui nas especificações do forex e ele n mostra limite minimo de SL e TP, mas mesmo assim defini valores bem altos para verificar se era isto, e também não funcionou...


Vou testar usando o CTRADE para ver se resolve..

Trader_Patinhas
1127
Trader_Patinhas  
rodrigorizando:

Vlwww Patinhas, mas o tick esta certinho quando dou print nele, parece não ser isto não..

A sua mensagem de erro diz "failed instant sell 500.00 GBPJPY at 0.000 [Invalid price]".

Ou seja, vc está tentando vender a preço 0.000 (não é erro de SL nem de TP, a mensagem costuma ser diferente quando o preço está ok e SL ou TP é que estão errados).

O preço de venda está sendo preenchido no campo "price" da estrutura "requisicao".

Recomendo fortemente vc, antes do comando OrderSend(), imprimir "requisição.price" para ver o que está sendo enviado.

Se o valor enviado em "requisição.price" for realmente zero, mande imprimir "NormalizeDouble(tick.ask,_Digits)" e " tick.ask".

Recomendo imprimir imediatamente antes do OrderSend(), para garantir que vc está vendo os valores que realmente estão sendo enviados.

Se não for isso, não tenho a menor ideia do que possa ser.

Em tempo: como não vi seu código completo, verifique também se há possibilidade de essa mensagem de erro estar vindo de outro trecho do seu código, que não seja esse trecho que vc mostrou (nesse caso estaremos procurando o erro no lugar errado). Vc envia OrderSend() em algum outro lugar do código?
Rodrigo Matheus da Silva
232
Rodrigo Matheus da Silva  
Trader_Patinhas:

A sua mensagem de erro diz "failed instant sell 500.00 GBPJPY at 0.000 [Invalid price]".

Ou seja, vc está tentando vender a preço 0.000 (não é erro de SL nem de TP, a mensagem costuma ser diferente quando o preço está ok e SL ou TP é que estão errados).

O preço de venda está sendo preenchido no campo "price" da estrutura "requisicao".

Recomendo fortemente vc, antes do comando OrderSend(), imprimir "requisição.price" para ver o que está sendo enviado.

Se o valor enviado em "requisição.price" for realmente zero, mande imprimir "NormalizeDouble(tick.ask,_Digits)" e " tick.ask".

Recomendo imprimir imediatamente antes do OrderSend(), para garantir que vc está vendo os valores que realmente estão sendo enviados.

Se não for isso, não tenho a menor ideia do que possa ser.

Em tempo: como não vi seu código completo, verifique também se há possibilidade de essa mensagem de erro estar vindo de outro trecho do seu código, que não seja esse trecho que vc mostrou (nesse caso estaremos procurando o erro no lugar errado). Vc envia OrderSend() em algum outro lugar do código?
Poxa boa ideia patinhas, eu vou fazer e retorno aq, vlww
Rogerio Giannetti Torres
3150
Rogerio Giannetti Torres  
rodrigorizando:



Depois que li a postagem do Patinhas, vi que ele observou bem que no modo de execução INSTANTE  o preço é obrigatório!  No modo execução a MERCADO o preço pode ser zero, confirmei fazendo um teste na FBS.

Outra questão veio a mente é o valor 0.00 em tick.ask, você colocou a chamada a essa rotina dentro do OnTick() e fez o teste:  if(!SymbolInfoTick(_Symbol,tick)) return;

Só para confirmar, qual é a corretora que você opera?  

Aproveitei e corrigi minha postagem sobre o stops mínimos.

Abaixo a especificação do EURUSD na FBS com a indicação dos campos StopLevel e ExecutionMode



vibesa
5
vibesa  
Estava com o mesmo problema, mudei o type_filling de ORDER_FILLING_FOK para ORDER_FILLING_IOC  e deu certo.
Para adicionar comentários, por favor Faça o login ou registrar