Erro recorrente 4756 com SL no algoritmo.....

Para adicionar comentários, por favor Faça o login ou registrar
Paulo Campozana
198
Paulo Campozana  

Olá, minhas felicitações aos membros deste forum.


Pessoal, estou com um problema que não encontrei solução de modo a atender minhas necessidades. Ou seja, recebo sempre a informação de erro 4756, e informando que o preço é inválido (sempre o SL). 

- Utilizei várias configurações, mas sem sucesso, portanto segue abaixo uma parte do algoritmo para ver se alguém pode me ajudar.


1 - Conta na Corretora Modal e versão 5.00 Build 1745;


2 - Operações no Míni índice e Míni Dólar;


3 - Parametrização do Dígitos:

if(_Digits==5 || _Digits==3)

     {

      STP = STP*10;

      TKP = TKP*10;

     }


4 - Parâmetros da ordem "Buy": 


ZeroMemory(mrequest);

         mrequest.action = TRADE_ACTION_DEAL;                                 

         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          

         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);

         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); 

         mrequest.symbol = _Symbol;                                            

         mrequest.volume = Lot;                                             

         mrequest.magic = EA_Magic;                                            

         mrequest.type = ORDER_TYPE_BUY;                                     

         mrequest.type_filling = ORDER_FILLING_FOK;                            

         mrequest.deviation=5;                                                 

         //--- Enviar Pedido...

         OrderSend(mrequest,mresult);

         // Retorna o resultado com o código

         if(mresult.retcode==10009 || mresult.retcode==10008) 

           {

            Alert("A ordem de compra foi realizada com o Ticket#:",mresult.order,"!!");

           }

         else

           {

            Alert("Deu merda na solicitação do Pedido - ERRO! :",GetLastError());

            ResetLastError();           

            return;


5 - Na verdade não sei se é apenas erro de parâmetro do ponto decimal, ou o tratamento se falta algum parâmetro para ajustar os preços;


6 - Gosto de algoritmos "limpos" sem qualquer discrepância" e na compilação aparece ainda a seguinte critica:


return value of 'OrderSend' should be checked my_first_ea2.mq5 na 

Linha 219 referente:  OrderSend(mrequest,mresult);


Ficaria imensamente agradecido a qualquer informação e ajuda na solução do erro acima informado.


Abs. a todos



Jonathan Pereira
69
Jonathan Pereira  

Bom dia,


Acredito que a sua normalização está incorreta. Abaixo um trecho de código que pode te ajudar a resolver esse problema.

   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

Use a variável grifada e multiplica pelo seu TKP e STP.

Também seria legal você imprimir o valor que esta sendo enviado a fim de entender se o valor que esta passando como parâmetro em STP ou TKP esta correto. Mesmo com esse ajuste ocorre de colocarmos o stop muito próximo do valor de abertura e consequentemente se manda a ordem já toda preenchida dará erro de envio(ERR_TRADE_SEND_FAILED).

Quanto ao outro erro acredito que apenas colocando um if resolve.

if(!OrderSend(param1,param2)) { Print("Erro"); return; }

Essa critica se dá pois a função chamada é do tipo booleana. 

Paulo Campozana
198
Paulo Campozana  
Jonathan Pereira:

Bom dia,


Acredito que a sua normalização está incorreta. Abaixo um trecho de código que pode te ajudar a resolver esse problema.

Use a variável grifada e multiplica pelo seu TKP e STP.

Também seria legal você imprimir o valor que esta sendo enviado a fim de entender se o valor que esta passando como parâmetro em STP ou TKP esta correto. Mesmo com esse ajuste ocorre de colocarmos o stop muito próximo do valor de abertura e consequentemente se manda a ordem já toda preenchida dará erro de envio(ERR_TRADE_SEND_FAILED).

Quanto ao outro erro acredito que apenas colocando um if resolve.

Essa critica se dá pois a função chamada é do tipo booleana. 


Olá Jonathan, td. bem?


1- Vou tentar de novo, utilizando a condição indicada por você (

 int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

embora esses parâmetros, também tenham dado o mesmo problema; porém vou mexer nos valores (aumentar a distância do preço) e ver o que posso extrair de fatos novos. 

- Aproveitando a o oportunidade; fui informado "extra-forum" que deveria utilizar os parâmetros abaixo para melhor adequar o algoritmo a nossas corretoras brasileiras e a bolsa propriamente dita. O que segue:

/*

double PNT=_Point;

if(_Digits==3 || _Digits==5) PNT*=10.0;


//--- Ajusta point para a porra da BMF

if(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE)==SYMBOL_CALC_MODE_EXCH_FUTURES)

{

if(SymbolInfoString(_Symbol,SYMBOL_CURRENCY_BASE)=="BRL" && 

(StringFind(m_symbol.Name(),"DOL",0)!=-1 || StringFind(m_symbol.Name(),"WDO",0)!=-1)) PNT=1.00;

}

*/

.....Você tem conhecimento sobre isso?

Para adicionar comentários, por favor Faça o login ou registrar