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

 
BmC:

СПАСИБО. 

Вы поняли, что я очень мучился при переносе кода.)))

Да :)

 
Похоже, что при корректировке цены стоп ордера (BUY STOP) в связи со StopLevel он между делом так же пересчитывает SL/TP и ставит их на минимальную что ли дистанцию... У меня для Buy Stop при текущей цене, не удовлетворяющей StopLevel, пересчитав цену ордера, пересчитал и SL на ту же дистанцию, что и от первоначального запроса.... То есть уровень цены buy stop поставил выше и уровень SL поставил выше. Можно ли как-то включить режим, чтоб корректировал цену открытия, но не трогал изначальные стопы. Только стопы трогать если изначальное их значение не удовлетворяет StopLimit/Freezelevel.
 
ставит их на минимальную что ли дистанцию
не на минимальную, а на дистанцию изначального ордера.
 
leonerd:
Похоже, что при корректировке цены стоп ордера (BUY STOP) в связи со StopLevel он между делом так же пересчитывает SL/TP и ставит их на минимальную что ли дистанцию... У меня для Buy Stop при текущей цене, не удовлетворяющей StopLevel, пересчитав цену ордера, пересчитал и SL на ту же дистанцию, что и от первоначального запроса.... То есть уровень цены buy stop поставил выше и уровень SL поставил выше. Можно ли как-то включить режим, чтоб корректировал цену открытия, но не трогал изначальные стопы. Только стопы трогать если изначальное их значение не удовлетворяет StopLimit/Freezelevel.
Библиотека старается выставить ордер и его стоп-уровни. Лучше после успешной его установки контролируйте уровни стопов и корректируйте. Потому, что потребностей разных много, и все их не учесть. Равно, как и уровень установки можно подкорректировать позже.
 
Artyom Trishkin:
Библиотека старается выставить ордер и его стоп-уровни. Лучше после успешной его установки контролируйте уровни стопов и корректируйте. Потому, что потребностей разных много, и все их не учесть. Равно, как и уровень установки можно подкорректировать позже.

да, понятно. Хорошо бы добавить флаг корректировки. Чтоб флаг можно было поставить корректировать в связи со StopLevel или нет. Не хочется менять код, потом всё потеряется при обновлении. Спасибо.

 
leonerd:

да, понятно. Хорошо бы добавить флаг корректировки. Чтоб флаг можно было поставить корректировать в связи со StopLevel или нет. Не хочется менять код, потом всё потеряется при обновлении. Спасибо.

Логику нужно уже в своей программе прописывать, а не менять код библиотеки. Впрочем, я подумаю над предложением. Но вряд ли быстро могу к этому вернуться чтобы сделать.
 

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

Вот надо получить время закрытия последнего трейда. Вроде как, в библиотеке реализован механизм работы с абстрактными ордерами а-ля МТ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 #:

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

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

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

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

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