Bibliotecas: MT4Orders - página 78

 

Fiz esse tratamento de erros em minha classe

#property strict

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/pt/code/16006
#endif // __MQL5__

#define GetLastError GetOrderError
// Deve estar presente não apenas no MT5, mas também no MT4.
// https://www.mql5.com/ru/forum/93352/page19#comment_6730221
#include <MT4Orders.mqh>

#define  BUY     0
#define  SELL    1
#define  ALL    -1
#define  LAST    0
#define  NOMODY  -1
bool LogInfo=true;//Imprimir no registro de erros
/*
Aqui estão as funções da classe para trabalhar com pedidos
*/

No final da minha classe, adicionei uma função

//+-------------------------------------------------------------------------------------------------------------------+
//|| Transformação de erros do MT5 para o MT4
//+-------------------------------------------------------------------------------------------------------------------+
int GetOrderError()
{
//int error=MT4ORDERS::LastTradeResult.retcode_external; // Retorna códigos personalizados
   int error=(int)MT4ORDERS::LastTradeResult.retcode; // Retorna os códigos de erro após o envio do pedido ao servidor
   if(LogInfo==true)Print("error MT5=",error);
   switch(error)
   {
   case 10016:
      error=130;//Pés errados
      break;
   case 10018:
      error=132;//Mercado fechado
      break;
   case 10020:
      error=135;/O preço foi alterado
      break;
   case 136:
      error=136;//Nenhum preço - nenhum código no MT5
      break;
   case 10004:
      error=138;/Novos preços
      break;
   case 145:
      error=145;/A modificação é proibida porque a ordem está muito próxima do mercado - nenhum código no MT5
      break;
   case 146:
      error=146;/Subsistema de negociação ocupado - nenhum código no MT5
      break;
   default:
      error=error;//Erro não descrito
   }
   return (error);
}
#undef GetLastError
 
Aleksey Vyazmikin #:

Fiz o tratamento de erros em minha classe funcionar da seguinte forma

No final da minha classe, adicionei uma função

Não é uma variante ruim. Lembre-se apenas de que outros códigos de erro não estarão disponíveis.

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений / Ошибки времени выполнения
  • www.mql5.com
Ошибки времени выполнения - Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

Não é uma opção ruim. Lembre-se apenas de que outros códigos de erro não estarão disponíveis.

Acho que essa alteração é válida somente para o código em torno da minha classe e, depois disso, eu desativo a substituição #undef GetLastError e, se entendi corretamente, o compilador não substituirá mais GetLastError, ou estou errado?

 
Aleksey Vyazmikin #:

Parece que essa alteração é válida somente para o código em torno da minha classe, e depois que eu desativar a substituição #undef GetLastError e, se entendi corretamente, o compilador não substituirá mais GetLastError, ou estou errado?

Você está certo. Eu não entendi o que você quis dizer de imediato.

 
fxsaber #:

Você tem razão. Não percebi imediatamente o que estava querendo dizer.

Obrigado! Agora só preciso testá-lo :)

 

Você pode me ajudar a decifrar a função, pois não entendo todos esses dois-pontos e pontos de interrogação.

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double AccountFreeMarginCheck(const string Symb,const int Cmd,const double dVolume)
  {
   double Margin;

   return(::OrderCalcMargin((ENUM_ORDER_TYPE)Cmd, Symb, dVolume,
          ::SymbolInfoDouble(Symb,(Cmd==::ORDER_TYPE_BUY) ? ::SYMBOL_ASK : ::SYMBOL_BID),Margin) ?
          ::AccountInfoDouble(::ACCOUNT_MARGIN_FREE) - Margin : -1);
  }

Ela retorna um valor menor que zero, com uma alavancagem de 9k 1k100 lote 0,01 - o que está errado?

 

Imprimiu as informações no registro

/+------------------------------------------------------------------+
//|Verificar se há dinheiro suficiente para abrir um pedido
//+------------------------------------------------------------------+ 
bool CheckMoneyForTrade(double lots,int type)
  {
   string symb=Symbol();
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   double MarginAsk=0.0;
   bool MarginAskB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_ASK),MarginAsk);
   double MarginBid=0.0;
   bool MarginBidB=OrderCalcMargin(ENUM_ORDER_TYPE(type),Symbol(),lots,SymbolInfoDouble(Symbol(),SYMBOL_BID),MarginBid);
   
   Print("ACCOUNT_MARGIN_FREE=",AccountInfoDouble(ACCOUNT_MARGIN_FREE),
   " SYMBOL_ASK=",SymbolInfoDouble(Symbol(),SYMBOL_ASK),
   " SYMBOL_BID=",SymbolInfoDouble(Symbol(),SYMBOL_BID),
   " OrderCalcMarginAsk=",MarginAsk,
   " OrderCalcMarginBid=",MarginBid, 
   " free_margin=",free_margin 
   );


   //-- se não houver dinheiro suficiente
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
     if(NewOrderAllowedVolume(Symbol())<(lots+0.1))return(false);/Verificar a capacidade disponível
  
   //-- o teste foi bem-sucedido
   return(true);
  }

No testador:

2022.07.22 21:50:39.521 2009.12.04 14:30:00   ACCOUNT_MARGIN_FREE=999560.05 SYMBOL_ASK=89.63 SYMBOL_BID=89.6 OrderCalcMarginAsk=100.0 OrderCalcMarginBid=100.0 free_margin=999460.05

Na vida real:

2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  ACCOUNT_MARGIN_FREE=9000.0 SYMBOL_ASK=136.267 SYMBOL_BID=136.241 OrderCalcMarginAsk=0.0 OrderCalcMarginBid=0.0 free_margin=-1.0
2022.07.22 21:45:08.956 Bingo_MT5 (USDJPY,M15)  Not enough money for Buy 0.0 USDJPY Error code=4002

Parece que o cálculo não está acontecendo OrderCalcMargin() por razões desconhecidas - alguma ideia?

O erro 4002 significa:

Parâmetro incorreto na chamada interna da função do terminal do cliente

Mas o que isso significa não está claro....

 
Aleksey Vyazmikin #:

Você pode me ajudar a decifrar a função, pois não entendo todos esses dois pontos e pontos de interrogação.

Você está usando alguma solução antiga, montada às pressas.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: MT4Orders

Aleksey Vyazmikin, 2022.07.21 11:58 AM

Fiz um trabalho com erros em minha classe

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/pt/code/16006
#endif // __MQL5__
Muitas vezes me arrependi de ter postado isso, pois não tem nada a ver com o MT4Orders. Foi apenas um complemento para os exemplos. Não me lembro do significado dele. Não quero entrar no assunto.


Lembrei-me de que fiz uma solução mais elaborada de "conversão" aqui.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: MT4Orders

fxsaber, 2019.01.13 17:23 PM.

As funções de Kim no MT4 são bastante populares, então baixei todas as fontes do site dele e escrevi um "conversor" simples para elas no MT5.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

Eu mesmo uso o MT4Style apenas nas funções de Ordem. Não converto absolutamente outras funções padrão do MT4 para meu trabalho e vejo essa opção como uma muleta. Recomendo escrever funções de margem em funções nativas sem tentar convertê-las. Dei uma olhada na minha aula sobre como trabalhar com margem - um arquivo mqh de tamanho decente. E isso é apenas para o Forex regular.

 
fxsaber #:

Você está usando uma solução antiga, montada às pressas.

Muitas vezes me arrependi de tê-la postado, pois ela não tem nada a ver com o MT4Orders. Era apenas um complemento para os exemplos. Não me lembro do significado disso. Não quero dar uma olhada nisso.


Lembrei-me de que fiz uma solução mais elaborada de "conversão" aqui.

Eu mesmo uso o MT4Style somente nas funções de Ordem. Não converto absolutamente outras funções padrão do MT4 para meu trabalho e vejo essa opção como uma muleta. Recomendo escrever funções de margem em funções nativas sem tentar convertê-las. Dei uma olhada na minha aula sobre como trabalhar com margem - um arquivo mqh de tamanho decente. E isso é apenas para o Forex regular.

Eu tinha apenas a tarefa de criar um código compilável para MT4 e MT5 sobre as funções da lógica do EA, e converti as coisas relacionadas ao ambiente e ao trabalho com ordens com a ajuda dos inkludniks mencionados acima, ou retirei funções separadas e as reformulei para cada plataforma. O projeto acabou sendo grande, e sua solução me ajudou muito.

Tive outro erro - o tamanho mínimo do lote foi determinado incorretamente, então adicionei sinalizadores aqui. Anteriormente, fiz a travessia sem levar em conta o seu código (MQL4_To_MQL5.mqh não é o seu código?) - ele foi compilado, mas não funcionou corretamente.

#define  MODE_BID 9
#define  MODE_ASK 10
#define  MODE_DIGITS 12
#define MODE_SPREAD 13
#define  MODE_STOPLEVEL 14
#define  MODE_LOTSIZE 15

#define  MODE_POINT 11
#define  MODE_TICKVALUE 16
#define  MODE_TICKSIZE 17

#define  MODE_MAXLOT 18
#define  MODE_MINLOT 19
#define  MODE_LOTSTEP 20

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
double MarketInfo(const string Symb,const int Type)
  {
   switch(Type)
     {
      case MODE_BID:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_BID));
      case MODE_ASK:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_ASK));
      case MODE_DIGITS:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_DIGITS));
      case MODE_SPREAD:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_SPREAD));
      case MODE_STOPLEVEL:
         return((double)::SymbolInfoInteger(Symb, ::SYMBOL_TRADE_STOPS_LEVEL));
      case MODE_LOTSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_CONTRACT_SIZE));

      case MODE_POINT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_POINT));
       case MODE_TICKVALUE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_SIZE));
      case MODE_TICKSIZE:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_TRADE_TICK_VALUE));                 
      case MODE_MAXLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MAX));  
      case MODE_MINLOT:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_MIN));  
      case MODE_LOTSTEP:
         return(::SymbolInfoDouble(Symb, ::SYMBOL_VOLUME_STEP));                    
     }

   return(-1);
  }
 
Aleksey Vyazmikin #:

ou MQL4_To_MQL5.mqh não é o seu código?

Ele é meu, mas é bastante antigo. É melhor dar uma olhada no mqh do Kim, pois há uma solução mais elaborada para o MarketInfo.