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

 
fxsaber #:
// Все свойства сделки в строку. string DealToString( const long Ticket )

С и без HistoryDealSelect( Ticket ) разные результаты, проверил.

 
trader6_1 #:

С и без HistoryDealSelect( Ticket ) разные результаты, проверил.

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

 
fxsaber #:

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

Запускаю скрипт без  HistoryDealSelect()

DEAL_SYMBOL = 
DEAL_COMMENT = 
DEAL_EXTERNAL_ID = 
DEAL_ORDER = 0
DEAL_TIME = 0
DEAL_TYPE = 0
DEAL_ENTRY = 0
DEAL_MAGIC = 0
DEAL_POSITION_ID = 0
DEAL_TIME_MSC = 0
DEAL_TICKET = 0
DEAL_REASON = 0
DEAL_VOLUME = 0.0
DEAL_PRICE = 0.0
DEAL_COMMISSION = 0.0
DEAL_SWAP = 0.0
DEAL_PROFIT = 0.0
DEAL_FEE = 0.0
DEAL_SL = 0.0
DEAL_TP = 0.0

Добавляю  HistoryDealSelect() и запускаю скрипт

DEAL_SYMBOL = PLZL
DEAL_COMMENT = atr=779.40;TP=20848.5;SL=18822.
DEAL_EXTERNAL_ID = 12315906553
DEAL_ORDER = 701216706
DEAL_TIME = 1739456102
DEAL_TYPE = 0
DEAL_ENTRY = 0
DEAL_MAGIC = 44
DEAL_POSITION_ID = 701216706
DEAL_TIME_MSC = 1739456102378
DEAL_TICKET = 24406356
DEAL_REASON = 3
DEAL_VOLUME = 1.0
DEAL_PRICE = 19679.5
DEAL_COMMISSION = 0.0
DEAL_SWAP = 0.0
DEAL_PROFIT = 0.0
DEAL_FEE = 0.0
DEAL_SL = 0.0
DEAL_TP = 0.0
 
Aleksandr Slavskii #:

Запускаю скрипт без  HistoryDealSelect()

Добавляю  HistoryDealSelect() и запускаю скрипт

Худшее, что можно сделать в функции распечатки сделки, это поместить в нее HistoryDealSelect.

 
fxsaber #:

Худшее, что можно сделать в функции распечатки сделки, это поместить в нее HistoryDealSelect.

А что вы предлагаете?

Довольствоваться в распечатке нулями?

В таком виде скрипт распечатывает нули

//+------------------------------------------------------------------+
template <typename T>
bool IsCorrect(const int Index)
  {
   ResetLastError();

   return((EnumToString((T)Index) != NULL) && !_LastError);
  }

#define PROPERTIES(A)                                                      \
  for (int i = 0; i < 1000; i++)                                           \
    if (IsCorrect<A>(i))                                                   \
      Str += EnumToString((A)i) + " = " + (string)(PROPERTY((A)i)) + "\n";
//+------------------------------------------------------------------+
void OnStart()
  {
   //HistoryDealSelect(24406356);
   Print(DealToString(24406356));
  }
//+------------------------------------------------------------------+
// Все свойства сделки в строку.
string DealToString(const long Ticket)
  {
   string Str = NULL;

#define PROPERTY(A) HistoryDealGetString(Ticket, A)
   PROPERTIES(ENUM_DEAL_PROPERTY_STRING)
#undef PROPERTY

#define PROPERTY(A) HistoryDealGetInteger(Ticket, A)
   PROPERTIES(ENUM_DEAL_PROPERTY_INTEGER)
#undef PROPERTY

#define PROPERTY(A) HistoryDealGetDouble(Ticket, A)
   PROPERTIES(ENUM_DEAL_PROPERTY_DOUBLE)
#undef PROPERTY

   return(Str);
  }
//+------------------------------------------------------------------+

Если раскомментировать  HistoryDealSelect, то распечатывает все поля правильно.

 

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

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

Aleksandr Slavskii, 2025.02.13 13:18

В таком виде скрипт распечатывает нули

void OnStart()
  {
   //HistoryDealSelect(24406356);
   Print(DealToString(24406356));
  }

Если раскомментировать  HistoryDealSelect, то распечатывает все поля правильно.

Разве публиковался такой скрипт? Попробуйте подправить DealToString, обсудим. А то мне непонятно совсем, о чем идет речь.

 
fxsaber #:

Разве публиковался такой скрипт? Попробуйте подправить DealToString, обсудим. А то мне непонятно совсем, о чем идет речь.

Ладно. Не публиковался.

Публиковался другой.

void OnStart()
{
  Print(SymbolToString());
}

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


А если серьёзно, то я не понимаю как правильно использовать ваш код для того, чтоб распечатать все поля сделки.

На примере конкретной задачи. Допустим мы в советнике сохранили тикет сделки и через какое то время, нам нужно распечатать, всё , что связано с этой сделкой.

HistoryDealSelect сама напрашивается для этого, а вы говорите, что так делать моветон. А как тогда будет не моветон?
 
Aleksandr Slavskii #:

как тогда будет не моветон?

Как в скрипте выше.


Максимум, что можно вставить в функцию, но не рекомендовал бы так делать.

if (HistoryDealGetInteger(Ticket, DEAL_TICKET) != Ticket)
  HistoryDealSelect(Ticket);
 
fxsaber #:

Иногда необходимо просмотреть все свойства символа, графика, позиции, ордера, исторической сделки/ордера и т.д.

Существует множество значений свойств, которые можно добавлять, удалять и т. д.

Вот моя попытка использовать эти 2 маленьких макроса:

#define  PROPERTIES1(function, 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(prop_id)); \
     }


#define  PROPERTIES2(function, param, 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(param,prop_id)); \
     }

Получение тонны информации из платформы:

//+------------------------------------------------------------------+
//| Prints the account specification to the Experts tab.             |
//+------------------------------------------------------------------+
void PrintAccount()
  {
   if(AccountInfoInteger(ACCOUNT_LOGIN))
     {
      PROPERTIES1(AccountInfoInteger,ENUM_ACCOUNT_INFO_INTEGER);
      PROPERTIES1(AccountInfoDouble,ENUM_ACCOUNT_INFO_DOUBLE);
      PROPERTIES1(AccountInfoString,ENUM_ACCOUNT_INFO_STRING);
     }
  }

Информация о терминале:

//+------------------------------------------------------------------+
//| Prints the terminal properties to the Experts tab.               |
//+------------------------------------------------------------------+
void PrintTerminal()
  {
   if(TerminalInfoString(TERMINAL_COMPANY)!="")
     {
      PROPERTIES1(TerminalInfoInteger,ENUM_TERMINAL_INFO_INTEGER);
      PROPERTIES1(TerminalInfoDouble,ENUM_TERMINAL_INFO_DOUBLE);
      PROPERTIES1(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)!="")
     {
      PROPERTIES2(ChartGetInteger,chart_id,ENUM_CHART_PROPERTY_INTEGER);
      PROPERTIES2(ChartGetDouble,chart_id,ENUM_CHART_PROPERTY_DOUBLE);
      PROPERTIES2(ChartGetString,chart_id,ENUM_CHART_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))
     {
      PROPERTIES2(SymbolInfoInteger,symbol,ENUM_SYMBOL_INFO_INTEGER);
      PROPERTIES2(SymbolInfoDouble,symbol,ENUM_SYMBOL_INFO_DOUBLE);
      PROPERTIES2(SymbolInfoString,symbol,ENUM_SYMBOL_INFO_STRING);
     }
  }

Позиции и сделки:

//+------------------------------------------------------------------+
//| Prints the position properties to the Experts tab.               |
//+------------------------------------------------------------------+
void PrintPosition(const ulong pos_ticket)
  {
   if(PositionSelectByTicket(pos_ticket))
     {
      PROPERTIES1(PositionGetInteger,ENUM_POSITION_PROPERTY_INTEGER);
      PROPERTIES1(PositionGetDouble,ENUM_POSITION_PROPERTY_DOUBLE);
      PROPERTIES1(PositionGetString,ENUM_POSITION_PROPERTY_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the history deal properties to the Experts tab.           |
//+------------------------------------------------------------------+
void PrintDeal(const ulong deal_ticket)
  {
   if(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);
     }
  }

Ордера:

//+------------------------------------------------------------------+
//| Prints the order properties to the Experts tab.                  |
//+------------------------------------------------------------------+
void PrintOrder(const ulong order_ticket)
  {
   if(OrderSelect(order_ticket))
     {
      PROPERTIES1(OrderGetInteger,ENUM_ORDER_PROPERTY_INTEGER);
      PROPERTIES1(OrderGetDouble,ENUM_ORDER_PROPERTY_DOUBLE);
      PROPERTIES1(OrderGetString,ENUM_ORDER_PROPERTY_STRING);
     }
  }
//+------------------------------------------------------------------+
//| Prints the history order properties to the Experts tab.          |
//+------------------------------------------------------------------+
void PrintHistoryOrder(const ulong order_ticket)
  {
   if(HistoryOrderSelect(order_ticket))
     {
      PROPERTIES2(HistoryOrderGetInteger,order_ticket,ENUM_ORDER_PROPERTY_INTEGER);
      PROPERTIES2(HistoryOrderGetDouble,order_ticket,ENUM_ORDER_PROPERTY_DOUBLE);
      PROPERTIES2(HistoryOrderGetString,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("  };");
  }


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

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

   PrintEnum<ENUM_TIMEFRAMES>();
  }
 

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

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

amrali, 2025.02.14 05:37

//+------------------------------------------------------------------+
//| Prints the history deal properties to the Experts tab.           |
//+------------------------------------------------------------------+
void PrintDeal(const ulong deal_ticket)
  {
   if(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);
     }
  }
//+------------------------------------------------------------------+
//| Prints the history order properties to the Experts tab.          |
//+------------------------------------------------------------------+
void PrintHistoryOrder(const ulong order_ticket)
  {
   if(HistoryOrderSelect(order_ticket))
     {
      PROPERTIES2(HistoryOrderGetInteger,order_ticket,ENUM_ORDER_PROPERTY_INTEGER);
      PROPERTIES2(HistoryOrderGetDouble,order_ticket,ENUM_ORDER_PROPERTY_DOUBLE);
      PROPERTIES2(HistoryOrderGetString,order_ticket,ENUM_ORDER_PROPERTY_STRING);
     }
  }

Сделали ровно то, о чем предупреждал.

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

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

fxsaber, 2025.02.13 13:08

Худшее, что можно сделать в функции распечатки сделки, это поместить в нее HistoryDealSelect.


Даже так делать не стали.

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

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

fxsaber, 2025.02.13 14:35

Максимум, что можно вставить в функцию, но не рекомендовал бы так делать.

if (HistoryDealGetInteger(Ticket, DEAL_TICKET) != Ticket)
  HistoryDealSelect(Ticket);

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

void OnStart()
{
  if (HistorySelect(0, INT_MAX))
  {
    const int Total = HistoryDealsTotal();
    
    for (int i = MathMax(Total - 5, 0); i < Total; i++)
      PrintDeal(HistoryDealGetTicket(i));
  }
}


Архитектура.

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

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

fxsaber, 2025.02.13 10:23

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