Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2708

 
ANDREY #:

Всем доброго времени суток. Вопрос по mql5

В четверке есть функция выбора закрытого ордера из списка закрытых ордеров

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

ВОПРОС

А как в пятерке выбрать ордер для дальнейшей работы с ним , и выбрать не по тикету, а по его порядковому номеру с списке закрытых ордеров( как в примере выше)? В пятерке все функции в названии которых есть Select выбирают закрытый ордер из списка закрытых ордеров только по тикету, а не по его порядковому номеру. Может быть в пятерке для этих целей служит какая то другая функция????
Буду очень рад, если напишете вышеприведенный код языком mql5

Всем спасибо за помощь.

В конце этой статьи смотрите. https://www.mql5.com/ru/forum/2900
В поиске тут статья Ордера, позиции и сделки - там в конце статьи есть данные по истории ордеров.

Пример подобного алгоритма:

#property script_show_inputs

input long my_magic=999;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// --- определение границ требуемой торговой истории
   datetime end=TimeCurrent();                 // текущее серверное время
   datetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
//--- запросим в кэш программы нужный интервал торговой истории
   HistorySelect(start,end);
//--- получим количество ордеров в истории
   int history_orders=HistoryOrdersTotal();
//--- теперь пробежим по всем ордерам
   for(int i=0;i<history_orders;i++)
     {
      //--- получим тикет ордера по его номеру в списке
      ulong order_ticket=HistoryOrderGetTicket(i);
      if(order_ticket>0) //  получили в кэш исторический ордер, работаем с ним
        {
         //--- время исполнения
         datetime time_done=HistoryOrderGetInteger(order_ticket,ORDER_TIME_DONE);
         long order_magic  =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
         long pos_ID       =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
         if(order_magic==my_magic)
           {
           //  обработаем позицию с заданным ORDER_MAGIC
           }
         PrintFormat("Ордер #%d: ORDER_MAGIC=#%d, time_done %s, ORDER_POSITION_ID=%d",
                     order_ticket,order_magic,TimeToString(time_done),pos_ID);
        }
      else               // неудачная попытка получения ордера из истории
        {
         PrintFormat("Не удалось выбрать ордер с индексом %d. Ошибка %d",
                     i,GetLastError());
        }
     }
  }

 
Roman Shiredchenko #:
В конце этой статьи смотрите. https://www.mql5.com/ru/forum/2900
В поиске тут статья Ордера, позиции и сделки - там в конце статьи есть данные по истории ордеров.

Пример подобного алгоритма:


Спасибо большое за помощь. Мне нужно что бы при переборе ордеров в списке выбирались только ордера закрытые по тейкпрофиту, для дальнейшей работы с этими ордерами(закрытыми по ТП) . Как сфорпмулировать данное условие? Условие - если ордер закрылся по ТП. Какая функция в моем случае должна вернуть результат закрытия сделки + n пунктов , или - n пунктов?
Еще раз спасибо за помощь.
 
ANDREY #:
Спасибо большое за помощь. Мне нужно что бы при переборе ордеров в списке выбирались только ордера закрытые по тейкпрофиту, для дальнейшей работы с этими ордерами(закрытыми по ТП) . Как сфорпмулировать данное условие? Условие - если ордер закрылся по ТП. Какая функция в моем случае должна вернуть результат закрытия сделки + n пунктов , или - n пунктов?
Еще раз спасибо за помощь.

  for (int i = totalDeals - 1; i >= 0; i--) {
    ulong dealTicket = HistoryDealGetTicket(i);
    if (dealTicket > 0) {
      if (HistoryDealGetInteger(dealTicket, DEAL_MAGIC) == MagicNumber &&
          HistoryDealGetInteger(dealTicket, DEAL_ENTRY) == DEAL_ENTRY_OUT &&
          HistoryDealGetInteger(dealTicket, DEAL_REASON) == DEAL_REASON_TP) {
        .....
        break;
      }
    }
  }
 
Vitaly Muzichenko #:

да. Виталий - спасибо за помощь.... сам еще раз перечитал - освежил данные...

 
ANDREY #:
Спасибо большое за помощь. Мне нужно что бы при переборе ордеров в списке выбирались только ордера закрытые по тейкпрофиту, для дальнейшей работы с этими ордерами(закрытыми по ТП) . Как сфорпмулировать данное условие? Условие - если ордер закрылся по ТП. Какая функция в моем случае должна вернуть результат закрытия сделки + n пунктов , или - n пунктов?
Еще раз спасибо за помощь.

тут постановка вопроса страдает - тут уже будут не закрытые ордера как в МТ4 трактовались, но закрытые позиции. Ордера могут быть выставлены, сработаны и удалены. Позиции - открыты и закрыты.

 
Roman Shiredchenko #:

тут постановка вопроса страдает - тут уже будут не закрытые ордера как в МТ4 трактовались, но закрытые позиции. Ордера могут быть выставлены, сработаны и удалены. Позиции - открыты и закрыты.

Спасибо за ценную информацию

 
Vitaly Muzichenko #:

Спасибо за помощь. Но я сам придумал конструкцию и она у меня получилась проще и короче. И делает то что мне нужно.
int hour = (int)(TimeCurrent() / 3600) % 24;// час 

if (hour!=Z)
{
Z=hour;
datetime end=TimeCurrent();                 // текущее серверное время
datetime start=end-3600;// установим начало на 0 часов
HistorySelect(start,end);//--- загрузим в кэш программы нужный интервал торговой истории
int history_orders=HistoryOrdersTotal();//--- получим количество ордеров в истории
for(int i=0;i<history_orders;i++)//--- теперь пробежим по всем ордерам
{
if (HistoryDealGetDouble(HistoryDealGetTicket(i),DEAL_PROFIT)>0)// если сделка закрылась по ТП.
Print("-----------------------------------------------HistorySelect-----Ticket   "   ,HistoryDealGetTicket(i),"   === ПРОФИТ ==  ",DoubleToString(HistoryDealGetDouble(HistoryDealGetTicket(i),DEAL_PROFIT),5)," === КОЛ.ОРД В ИСТОРИИ ====.  ",history_orders);
}
}                               
И еще я не совсем понимаю , в моем случае , вот что.... при переборе сделок по порядковым номерам, то есть по порядку, для чего нужно вычислять тикет  каждой сделки? Ведь если сделка в историческом списке есть, значит она не может быть без тикета.
 
Подскажите, пожалуйста, как подключить открытый проект из shared projects. Кнопка подключения неактивна
 

Всем доброго времени суток. Вопрос по mql5

int hour = (int)(TimeCurrent() / 3600) % 24;// час
if (hour!=Z)
{
Z=hour;
datetime end=TimeCurrent();                 // текущее серверное время
datetime start=end-3600;// установим начало на 0 часов
HistorySelect(start,end);//--- загрузим в кэш программы нужный интервал торговой истории
//}
int history_orders=HistoryOrdersTotal();//--- получим количество ордеров в истории
for(int i=0;i<history_orders;i++)//--- теперь пробежим по всем ордерам
{
if (HistoryDealGetDouble(HistoryDealGetTicket(i),DEAL_PROFIT)>0)
X = HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_TIME);// ВРЕМЯ ЗАКРЫТИЯ СДЕЛКИ ПО ТП
Y =                           ?????????                      // ВРЕМЯ ОТКРЫТИЯ СДЕЛКИ КОТОРАЯ ЗАКРЫЛАСЬ  ПО ТП
Print("------== ВР.ЗАКР. СДЕЛКИ ПО ТП ====.  ", TimeToString(X,DEAL_TIME),TIME_DATE|TIME_SECONDS));
}
}

В коде 1 раз в час в списке сделок (сделки только сделки  БАЙ)  в истории выбираются только те которые закрылись по ТП( то есть сделкой СЕЛ)

После выбора сделки при помощи функции  HistoryDealGetInteger(HistoryDealGetTicket(i),DEAL_TIME) вычисляется и сохраняется в переменную  время закрытия этой сделки БАЙ  (или ,что то же самое. время открытия сделки СЕЛ)
ВОПРОС

А при помощи какой функции можно вычислить время открытия сделки БАЙ , которую закрыла сделка СЕЛ? Как мне кажется при помощи той же функции  HistoryDealGetInteger(). Но какой идентификатор свойства сделки нужно указывать в этом случае? Я почему то такого идентификатора не нашел ни в одном перечислении идентификаторов свойств сделки. Как мне кажется что это будет сложносоставная функция, или вообще конструкция из нескольких строк. Буду очень признателен если напишете полностью  этот код вычисляющий время открытия позиции .

Всем спасибо за помощь.

 
ANDREY #:
HistoryDealGetTicket

В общем, у вас коде такой-же бардак, какой происходил всегда и до сих пор происходит - дурилка!

Вы путаете ордера и позиции. Нужно понимать, что Buy/Sell это не ордера, а позиции. Ордер не может быть закрыт - он может быть только удалён или перемещён, ордер не бывает ни прибыльным, ни убыточным.

Позицию нельзя удалить или переместить - только закрыть с прибылью или убытком.

--

P.S. Когда ГУРУ путаются и пишут что у них один ордер прибыльный, а другой убыточный = всегда хочется ответить, чтобы убыточный перенесли в прибыльную зону и закрыли оба.

Но так как у них это совершенно не ордер а позиция, а эти ГУРУ и об этом не знают, то перенести нельзя.

--

НЕ путайте ордера и позиции.

HistoryDealGetInteger(dealTicket, DEAL_ENTRY) == DEAL_ENTRY_OUT // DEAL_ENTRY_IN