Библиотеки: MT4Orders - страница 74

 
Aleksey Vyazmikin #:

Я всё же уточню, это ошибки какие ниже вызываемым кодом?

А то похожие вещи - что нужно не пойму - этот же код ниже возвращает ошибки из структуры  MqlTradeResult ?

retcode - ошибка MT5. retcode_external - поле, которое по желанию может заполнять разработчик стороннего бриджа.

 
fxsaber #:

retcode - ошибка MT5. retcode_external - поле, которое по желанию может заполнять разработчик стороннего бриджа.

Понял, спасибо. Думаю стандартных пока хватит.

 

Сделал так работу с ошибками в своем классе

#property strict

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

#define GetLastError GetOrderError
// Должна присутствовать не только в MT5, но и в 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;//Печатать в лог ошибки
/*
Тут функции класса по работе с ордерами
*/

В конце класса своего добавил функцию

//+-------------------------------------------------------------------------------------------------------------------+
//| Трансформация ошибок из MT5 в MT4
//+-------------------------------------------------------------------------------------------------------------------+
int GetOrderError()
{
//int error=MT4ORDERS::LastTradeResult.retcode_external; // Возвращает пользовательские коды
   int error=(int)MT4ORDERS::LastTradeResult.retcode; // Возвращает коды ошибок после отправки приказа серверу
   if(LogInfo==true)Print("error MT5=",error);
   switch(error)
   {
   case 10016:
      error=130;//Неправильные стопы
      break;
   case 10018:
      error=132;//Рынок закрыт
      break;
   case 10020:
      error=135;//Цена изменилась
      break;
   case 136:
      error=136;//Нет цен - нет кода в MT5
      break;
   case 10004:
      error=138;//Новые цены
      break;
   case 145:
      error=145;//Модификация запрещена, так как ордер слишком близок к рынку - нет кода в MT5
      break;
   case 146:
      error=146;//Подсистема торговли занята - нет кода в MT5
      break;
   default:
      error=error;//Не описанная ошибка
   }
   return (error);
}
#undef GetLastError
 
Aleksey Vyazmikin #:

Сделал так работу с ошибками в своем классе

В конце класса своего добавил функцию

Неплохой вариант. Только надо помнить, что другие коды ошибок будут недоступны.

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

Неплохой вариант. Только надо помнить, что другие коды ошибок будут недоступны.

Так вроде же это изменение действует только для кода вокруг моего класса, а после уже я выключаю подмену #undef GetLastError и, если я правильно понимаю, дальше компилятор уже не будет заменять GetLastError, или я не прав?

 
Aleksey Vyazmikin #:

Так вроде же это изменение действует только для кода вокруг моего класса, а после уже я выключаю подмену #undef GetLastError и, если я правильно понимаю, дальше компилятор уже не будет заменять GetLastError, или я не прав?

Правы. Не сразу понял, что имелось в виду.

 
fxsaber #:

Правы. Не сразу понял, что имелось в виду.

Спасибо! Теперь осталось потестировать :)

 

Можете помочь расшифровать функцию, а то все эти двоеточия и знаки вопросов - не понимаю.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }

Возвращает значение меньше нуля, при этом денег 9к плечо 1к100 лот 0,01 - что не так?

 

Принтанул в лог информацию

/+------------------------------------------------------------------+
//|Проверка на достаточность денег для открытия ордера
//+------------------------------------------------------------------+  
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 
   );


   //-- если денег не хватает
   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);//Проверка на доступный объем
  
   //-- проверка прошла успешно
   return(true);
  }

В тестере:

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

В реале:

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

Получается, что расчет не происходит OrderCalcMargin()  по непонятным причинам - есть идеи?

Ошибка 4002 значит:

Ошибочный параметр при внутреннем вызове функции клиентского терминала

Но что это значит - не ясно...

 
Aleksey Vyazmikin #:

Можете помочь расшифровать функцию, а то все эти двоеточия и знаки вопросов - не понимаю.

Вы используете какое-то древнее, наспех собранное решение.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

Aleksey Vyazmikin, 2022.07.21 11:58

Сделал так работу с ошибками в своем классе

#ifdef __MQL5__
#include <MQL4_To_MQL5.mqh> // https://www.mql5.com/ru/code/16006
#endif // __MQL5__
Много раз пожалел, что выложил его, т.к. оно никакого отношения к MT4Orders не имеет. Просто шло в довесок к примерам. Какой там был заложен смысл - уже не помню. Вникать не хочется.


Вспомнил, что более продуманное решение "конвертации" делал тут.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: MT4Orders

fxsaber, 2019.01.13 17:23

Кимовские функции под MT4 довольно популярны, поэтому скачал все исходники с его сайта и написал для них простой  "конвертер" под MT5.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

Сам использую MT4Style только в Order-функциях. Абсолютно не конвертирую остальные штатные MT4-функции для своих работ и вижу такой вариант костыльным. Рекомендую маржинальные функции писать на родных функциях, без попыток конвертации. Посмотрел свой класс по работе с маржой - приличный по размеру mqh-файл. И это только обычный Forex.