Особенности языка mql5, тонкости и приёмы работы - страница 292

 
fxsaber #:

  1. Указание на ошибку.
  2. Пример использования.

Просьба к читателям оставлять комментарии.

Рассмотрев ваши предложения о сценариях использования, я изменил функцию следующим образом

void PrintDeal(ulong deal_ticket, bool already_selected = false)
  {
   if(already_selected || HistoryDealSelect(deal_ticket))
     {
      PROPERTIES2(HistoryDealGetInteger, deal_ticket, ENUM_DEAL_PROPERTY_INTEGER);
      PROPERTIES2(HistoryDealGetDouble, deal_ticket, ENUM_DEAL_PROPERTY_DOUBLE);
      PROPERTIES2(HistoryDealGetString, deal_ticket, ENUM_DEAL_PROPERTY_STRING);
     }
  }

Тогда в вышеупомянутом цикле вы можете использовать PrintDeal(Ticket, true)


Редактировать:

Я предлагаю добавить новую функцию в вышеупомянутую коллекцию: PrintObject(string obj_name)
 
fxsaber #:

Пример порочности.

Взболтать, но не смешивать.

Вы смешали.

Пример получился не корректным..

Но хорошо подходит для того, чтоб усвоить, что так делать нельзя)))

 
Мы пытаемся усовершенствовать коктейль 🍸.
 
amrali #:

Тогда в вышеупомянутом цикле вы можете использовать PrintDeal(Ticket, true)

Почему не так?
 
Aleksandr Slavskii #:

так делать нельзя)))

Даже не думал, что это предложение является спорным.

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2025.02.13 10:23

Помещение сделки в доступную таблицу истории и распечатывание свойств сделки - функционалы, которые не пересекаются.

В строку - это просто в строку, без каких-либо проверок и подготовок.


Кстати, не понимаю, зачем создавать функцию для распечатывания, когда гораздо полезнее функция в строку...

Например, в MT4 не понимаю OrderPrint, когда логичен OrderToString. Т.е. вместо одного шага навязывают два.
 

Обновленные функции (полезны для отладки кода):

Макросы-помощники:

//+------------------------------------------------------------------+
//| Helper macros to print a lot of information from the terminal.   |
//+------------------------------------------------------------------+
#define  Param(p1)     p1,
#define  Params(p1,p2) p1,p2,

#define  PROPERTIES(function, params, enumtype) \
   for(int i=-2; i<USHORT_MAX+1000; ++i) \
     { \
      enumtype prop_id = (enumtype)i; \
      if(StringFind(EnumToString(prop_id),"::")<0) \
         Print(EnumToString(prop_id),"=",function(params##prop_id)); \
     }

Информация об учетной записи и терминале:

//+------------------------------------------------------------------+
//| Prints the account specification to the Experts tab.             |
//+------------------------------------------------------------------+
void PrintAccount()
  {
   if(AccountInfoInteger(ACCOUNT_LOGIN))
     {
      PROPERTIES(AccountInfoInteger,"",ENUM_ACCOUNT_INFO_INTEGER);
      PROPERTIES(AccountInfoDouble,"",ENUM_ACCOUNT_INFO_DOUBLE);
      PROPERTIES(AccountInfoString,"",ENUM_ACCOUNT_INFO_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the terminal properties to the Experts tab.               |
//+------------------------------------------------------------------+
void PrintTerminal()
  {
   if(TerminalInfoString(TERMINAL_COMPANY)!="")
     {
      PROPERTIES(TerminalInfoInteger,"",ENUM_TERMINAL_INFO_INTEGER);
      PROPERTIES(TerminalInfoDouble,"",ENUM_TERMINAL_INFO_DOUBLE);
      PROPERTIES(TerminalInfoString,"",ENUM_TERMINAL_INFO_STRING);
     }
  }

Диаграммы и графические объекты:

//+------------------------------------------------------------------+
//| Prints the chart properties to the Experts tab.                  |
//+------------------------------------------------------------------+
void PrintChart(const long chart_id)  // 0 means the current chart
  {
   if(ChartSymbol(chart_id)!="")
     {
      PROPERTIES(ChartGetInteger,Param(chart_id),ENUM_CHART_PROPERTY_INTEGER);
      PROPERTIES(ChartGetDouble,Param(chart_id),ENUM_CHART_PROPERTY_DOUBLE);
      PROPERTIES(ChartGetString,Param(chart_id),ENUM_CHART_PROPERTY_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the graphic object properties to the Experts tab.         |
//+------------------------------------------------------------------+
void PrintObject(const long chart_id, const string name)  // 0 means the current chart
  {
   if(ObjectFind(chart_id,name)>=0)
     {
      PROPERTIES(ObjectGetInteger,Params(chart_id,name),ENUM_OBJECT_PROPERTY_INTEGER);
      PROPERTIES(ObjectGetDouble,Params(chart_id,name),ENUM_OBJECT_PROPERTY_DOUBLE);
      PROPERTIES(ObjectGetString,Params(chart_id,name),ENUM_OBJECT_PROPERTY_STRING);
     }
  }

Информация о символах:

//+------------------------------------------------------------------+
//| Prints the symbol specification to the Experts tab.              |
//+------------------------------------------------------------------+
void PrintSymbol(const string symbol)
  {
   Print(Symbol(),", ",SymbolInfoString(Symbol(),SYMBOL_DESCRIPTION));
   if(SymbolSelect(symbol,true))
     {
      PROPERTIES(SymbolInfoInteger,Param(symbol),ENUM_SYMBOL_INFO_INTEGER);
      PROPERTIES(SymbolInfoDouble,Param(symbol),ENUM_SYMBOL_INFO_DOUBLE);
      PROPERTIES(SymbolInfoString,Param(symbol),ENUM_SYMBOL_INFO_STRING);
     }
  }

Открытые позиции и ордера:

//+------------------------------------------------------------------+
//| Prints the position properties to the Experts tab.               |
//+------------------------------------------------------------------+
void PrintPosition(const ulong pos_ticket)
  {
   if((PositionGetInteger(POSITION_TICKET) == pos_ticket && pos_ticket != 0)
    || PositionSelectByTicket(pos_ticket))
     {
      PROPERTIES(PositionGetInteger,"",ENUM_POSITION_PROPERTY_INTEGER);
      PROPERTIES(PositionGetDouble,"",ENUM_POSITION_PROPERTY_DOUBLE);
      PROPERTIES(PositionGetString,"",ENUM_POSITION_PROPERTY_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the order properties to the Experts tab.                  |
//+------------------------------------------------------------------+
void PrintOrder(const ulong order_ticket)
  {
   if((OrderGetInteger(ORDER_TICKET) == order_ticket && order_ticket != 0)
    || OrderSelect(order_ticket))
     {
      PROPERTIES(OrderGetInteger,"",ENUM_ORDER_PROPERTY_INTEGER);
      PROPERTIES(OrderGetDouble,"",ENUM_ORDER_PROPERTY_DOUBLE);
      PROPERTIES(OrderGetString,"",ENUM_ORDER_PROPERTY_STRING);
     }
  }

Исторические сделки и ордера:

//+------------------------------------------------------------------+
//| Prints the history deal properties to the Experts tab.           |
//+------------------------------------------------------------------+
void PrintDeal(const ulong deal_ticket)
  {
   if((HistoryDealGetInteger(deal_ticket,DEAL_TICKET) == deal_ticket && deal_ticket != 0)
    || HistoryDealSelect(deal_ticket))
     {
      PROPERTIES(HistoryDealGetInteger,Param(deal_ticket),ENUM_DEAL_PROPERTY_INTEGER);
      PROPERTIES(HistoryDealGetDouble,Param(deal_ticket),ENUM_DEAL_PROPERTY_DOUBLE);
      PROPERTIES(HistoryDealGetString,Param(deal_ticket),ENUM_DEAL_PROPERTY_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the history order properties to the Experts tab.          |
//+------------------------------------------------------------------+
void PrintHistoryOrder(const ulong order_ticket)
  {
   if((HistoryOrderGetInteger(order_ticket,ORDER_TICKET) == order_ticket && order_ticket != 0)
    || HistoryOrderSelect(order_ticket))
     {
      PROPERTIES(HistoryOrderGetInteger,Param(order_ticket),ENUM_ORDER_PROPERTY_INTEGER);
      PROPERTIES(HistoryOrderGetDouble,Param(order_ticket),ENUM_ORDER_PROPERTY_DOUBLE);
      PROPERTIES(HistoryOrderGetString,Param(order_ticket),ENUM_ORDER_PROPERTY_STRING);
     }
  }

Печать перечислений:

//+------------------------------------------------------------------+
//| Print enumeration.                                               |
//+------------------------------------------------------------------+
//| Examples:                                                        |
//|                                                                  |
//|   PrintEnum<ENUM_TIMEFRAMES>();                                  |
//|   PrintEnum<ENUM_ACCOUNT_INFO_DOUBLE>();                         |
//|   PrintEnum<ENUM_FP_CLASS>();      // lowest enum value          |
//|   PrintEnum<ENUM_CHART_EVENT>();   // highest enum value         |
//+------------------------------------------------------------------+
template <typename T>
void PrintEnum(T dummy = -1)
  {
   Print(typename(T));
   Print("  {");
   for(int i = -2; i < USHORT_MAX + 1000; i++)
      if(StringFind(EnumToString((T)i),"::")<0)
         printf("   %s = %d,",EnumToString((T)i),i);
   Print("  };");
  }

Печать переменной struct:

//+------------------------------------------------------------------+
//| Print sructure variable.                                         |
//+------------------------------------------------------------------+
template <typename T>
void PrintStruct(T& struct_var)
  {
   T arr[1]; // one-element array
   arr[0] = struct_var;
   ArrayPrint(arr);
  }


Тестовый скрипт:

void OnStart()
  {
   PrintAccount();
   PrintTerminal();
   PrintChart(0);
   PrintObject(0,"MyBitmap");
   PrintSymbol(_Symbol);
   PrintPosition(925571424);
   PrintDeal(609261076);
   PrintHistoryOrder(925571424);

   PrintEnum<ENUM_TIMEFRAMES>();

   MqlDateTime dt;
   TimeToStruct(TimeCurrent(), dt);
   PrintStruct(dt);
  }


Тестовый скрипт 2:

void OnStart()
  {
   if(HistorySelect(0, TimeCurrent()))
     {
      int max = fmin(HistoryDealsTotal(), 3);  // limit to 3 deals
      for(int i = 0; i < max; ++i)
        {
         // print the history deal properties to the Experts tab
         PrintDeal(HistoryDealGetTicket(i));

         Print("--------");
        }
     }
  }
Файлы:
 
Весь замут из-за этого.

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2025.02.12 22:40

Если, вдруг, MQ решат в торговой платформе (в этом году 18 лет с начала разработки) все же дать доступ к комиссиям, то скрипт это сразу покажет...

Решил посмотреть, есть комиссия или нет.

 

исправленная опечатка:

//+------------------------------------------------------------------+
//| Prints the symbol specification to the Experts tab.              |
//+------------------------------------------------------------------+
void PrintSymbol(const string symbol)
  {
   Print(symbol,", ",SymbolInfoString(symbol,SYMBOL_DESCRIPTION));
   if(SymbolSelect(symbol,true))
     {
      PROPERTIES(SymbolInfoInteger,Param(symbol),ENUM_SYMBOL_INFO_INTEGER);
      PROPERTIES(SymbolInfoDouble,Param(symbol),ENUM_SYMBOL_INFO_DOUBLE);
      PROPERTIES(SymbolInfoString,Param(symbol),ENUM_SYMBOL_INFO_STRING);
     }
  }
Файлы:
 
amrali #:

исправленная опечатка:

Печать массивной информации (PrintXYZ) из терминала - библиотека для MetaTrader 5

Вывод этого скрипта может быть отправлен удаленному сотруднику службы поддержки или внештатному разработчику для помощи в обнаружении и устранении проблем в вашем терминале.

https://www.mql5.com/en/code/56055

Print massive information (PrintXYZ) from the terminal
Print massive information (PrintXYZ) from the terminal
  • www.mql5.com
PrintXYZ() library to print massive information from the terminal.
 
amrali #:

Печать массивной информации (PrintXYZ) из терминала - библиотека для MetaTrader 5

Вывод этого скрипта может быть отправлен удаленному сотруднику службы поддержки или внештатному разработчику для помощи в обнаружении и устранении проблем в вашем терминале.

https://www.mql5.com/en/code/56055

Автозаполнение в MetaEditor:

При включении библиотеки 'PrintXYZ' в ваши проекты, эти функции станут доступны в окне автозаполнения MetaEditor везде, где вы наберете 'Print'. Вы можете быстро скомпилировать файл проекта для печати результатов MQL5-функций на вкладке "Эксперты", а затем решить, какая комбинация MQL-функции/значения перечисления будет лучше всего соответствовать вашим требованиям.