Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть IV). Торговые события" - страница 3

 

Это очень интересная по содержанию лекция. Я обязательно буду следить за всей серией.

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

В примере "

CMarketCollection::Refresh

" поле total_market не найдено - такое уже случалось ранее с ORDER_STATUS_MARKET. Переход от простого к сложному очень впечатляет.

В точке обновления я не смог пойти дальше, так как следующий объект тоже не хотел запускаться сразу. Поэтому я с удовольствием воспользовался загрузкой.

mfG

Марк Толкмитт

 

Странно, простейшую логику не могу реализовать с вашими методами...

Вот надо получить время закрытия последнего трейда. Вроде как, в библиотеке реализован механизм работы с абстрактными ордерами а-ля МТ4, но методов работы с ними не вижу.

Запрашиваю Deals, но ORDER_PROP_TIME_CLOSE not supported:

bool last_trade_time_filter=true;
   CArrayObj *all_trades=engine.GetListDeals();
   if(all_trades!=NULL && all_trades.Total()>0)
     {
      CArrayObj *sym_all_trades=CSelect::ByOrderProperty(all_trades,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
      if(sym_all_trades!=NULL && sym_all_trades.Total()>0)
        {
         CArrayObj *sym_all_trades_recent=CSelect::ByOrderProperty(sym_all_trades,ORDER_PROP_TIME_CLOSE,iTime(NULL,PERIOD_CURRENT,1),EQUAL_OR_MORE);
         if(sym_all_trades_recent.Total()>0)
           {
            // сюда не приходит
            last_trade_time_filter=false;
           }
            
        }
     }
 
leonerd #:

Странно, простейшую логику не могу реализовать с вашими методами...

Вот надо получить время закрытия последнего трейда. Вроде как, в библиотеке реализован механизм работы с абстрактными ордерами а-ля МТ4, но методов работы с ними не вижу.

Запрашиваю Deals, но ORDER_PROP_TIME_CLOSE not supported:

ок, время закрытия для сделки как-то некорректно запрашивать. Но не работает и с GetListHistoryOrders()...

 
leonerd #:

Странно, простейшую логику не могу реализовать с вашими методами...

Вот надо получить время закрытия последнего трейда. Вроде как, в библиотеке реализован механизм работы с абстрактными ордерами а-ля МТ4, но методов работы с ними не вижу.

Запрашиваю Deals, но ORDER_PROP_TIME_CLOSE not supported:

В тестовом советнике, в обработчике нажатий кнопок

//+------------------------------------------------------------------+
//| Обработка нажатий кнопок                                         |
//+------------------------------------------------------------------+
void PressButtonEvents(const string button_name)

(а это как раз пример того, как обрабатывать события и получать данные).

Там есть блоки кода, отвечающие за закрытие позиций. Вы можете посмотреть как там всё реализовано. Например, блок кода для закрытия покупки по текущему символу с максимальным профитом:

      //--- Если нажата кнопка BUTT_CLOSE_BUY: Закрыть Buy с максимальной прибылью
      else if(button==EnumToString(BUTT_CLOSE_BUY))
        {
         //--- Получаем список всех открытых позиций
         CArrayObj* list=engine.GetListMarketPosition();
         //--- Выбираем из списка только позиции Buy и только по текущему символу
         list=CSelect::ByOrderProperty(list,ORDER_PROP_SYMBOL,Symbol(),EQUAL);
         list=CSelect::ByOrderProperty(list,ORDER_PROP_TYPE,POSITION_TYPE_BUY,EQUAL);
         //--- Сортируем список по прибыли с учётом комиссии и свопа
         list.Sort(SORT_BY_ORDER_PROFIT_FULL);
         //--- Получаем индекс позиции Buy с наибольшей прибылью
         int index=CSelect::FindOrderMax(list,ORDER_PROP_PROFIT_FULL);
         if(index>WRONG_VALUE)
           {
            //--- Получаем объект-позицию Buy и закрываем позицию по тикету
            COrder* position=list.At(index);
            if(position!=NULL)
              {
               //--- Если не нажаты кнопки создания отложенного запроса - закрываем позицию
               if(!pressed_pending_close_buy)
                  engine.ClosePosition((ulong)position.Ticket());
               //--- Иначе - создаём отложенный запрос на закрытие позиции по тикету
               //--- и задаём условия в зависимости от активных кнопок
               else
                 {
                  int id=engine.ClosePositionPending(position.Ticket());
                  if(id>0)
                    {
                     //--- устанавливаем цену и время активации отложенного запроса и устанавливаем параметры активации
                     double bid=SymbolInfoDouble(NULL,SYMBOL_BID);
                     double price_activation=NormalizeDouble(bid+distance_pending_request*g_point,g_digits);
                     ulong  time_activation=TimeCurrent()+bars_delay_pending_request*PeriodSeconds();
                     SetPReqCriterion((uchar)id,price_activation,time_activation,BUTT_CLOSE_BUY,EQUAL_OR_MORE,bid,TimeCurrent());
                    }
                 }
              }
           }
        }

Насчёт закрытых позиций - давно делал, сейчас "с наскоку" не могу сразу сказать как получать требуемое Вам. Чуть позже погляжу и напишу - сильно занят на данный момент.

 
Artyom Trishkin #:

В тестовом советнике, в обработчике нажатий кнопок

(а это как раз пример того, как обрабатывать события и получать данные).

Там есть блоки кода, отвечающие за закрытие позиций. Вы можете посмотреть как там всё реализовано. Например, блок кода для закрытия покупки по текущему символу с максимальным профитом:

Насчёт закрытых позиций - давно делал, сейчас "с наскоку" не могу сразу сказать как получать требуемое Вам. Чуть позже погляжу и напишу - сильно занят на данный момент.

Спасибо, но эвент отлавливать не нужно.

 
ORDER_STATUS_MARKET_ORDER выдает ошибку : undeclared identifier. Похоже, что в последних версиях для MQL 5 все изменилось, это проявляется и в COrder::OrderMagicNumber, и в конструкторе CMarketOrder!
 
theonementor # :
ORDER_STATUS_MARKET_ORDER выдает ошибку : undeclared identifier. Похоже, что в последних версиях MQL 5 все изменилось, она проявляется и в COrder::OrderMagicNumber, и в конструкторе CMarketOrder!

Я скачал приложенный к статье архивный файл MQL5.zip - каждый файл в отдельности и все вместе (при компиляции Engine.mqh или TestDoEasyPart04.mq5) компилируются без ошибок.

Что именно вы делаете, чтобы получить ошибку компиляции?

 
Artyom Trishkin #:

Я скачал приложенный к статье архивный файл MQL5.zip - каждый файл в отдельности и все вместе (при компиляции Engine.mqh или TestDoEasyPart04.mq5) компилируются без ошибок.

Что именно вы делаете, чтобы получить ошибку компиляции?

Разобрался, не хватает одной записи в define enum. Почему-то не хватает (хотя я копирую-вставляю код из учебника в редактор)
 
theonementor # :
Разобрался, в define enum не хватает одной записи. Почему-то не хватает (хотя я копирую-вставляю код из учебника в редактор).

Коды в статье не всегда совпадают с кодами в приложенных файлах. Иногда я могу что-то упустить во время описания, а иногда что-то добавляется уже после написания статьи. Статья - это не пошаговое руководство в стиле "читай-копируй-пользуйся", а лишь подробное объяснение в виде учебного материала. А мелкие ошибки и упущения заставляют задуматься, и это хорошо)