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

 
Tretyakov Rostyslav #:

Да, но только это самое крайнее время открытия ордера (лота), среди ордеров в истории, а человеку видимо нужно и реал.

Либо вопрос задан не корректно.

if (OrderSelect(i, SELECT_BY_POS,????????????)) {

и здесь не понятно. Я всегда указываю где ищем.

OrderSelect

[in]  Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:

MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

 
Vladimir Deryagin #:

Да, но только это самое крайнее время открытия ордера (лота), среди ордеров в истории, а человеку видимо нужно и реал.

Либо вопрос задан не корректно.

и здесь не понятно. Я всегда указываю где ищем.

OrderSelect

[in]  Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Mожет быть одной из следующих величин:

MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров,
MODE_HISTORY - ордер выбирается среди закрытых и удаленных ордеров.

Вопрос задан корректно.

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

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

pechenuga, 2022.10.20 15:26

Здравствуйте! Подскажите, как на MQL4 написать функцию, чтобы она находила лот последнего открытого ордера по времени? т.е. ордер может быть открытым (действующим), так и закрытым по StopLoss?

Ответ не полный, это да…

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

зы. А при более внимательном рассмотрении видно, что  MODE_HISTORY абсолютно необходимо.
 
Alexey Viktorov #:

Вопрос задан корректно.


Ответ не полный, это да…

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

зы. А при более внимательном рассмотрении видно, что  MODE_HISTORY абсолютно необходимо.

полностью с вами согласен,

"(Что касается источника, то обратите внимание на значение по умолчанию. Надо-ли его указывать, если выбираем действующие ордера, дело каждого? 

зы. А при более внимательном рассмотрении видно, что  MODE_HISTORY абсолютно необходимо.) "

я говорил про данный случай там к=OrdersHistoryTotal()


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

 
Vladimir Deryagin #:

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

На любителя. Никому не навязываю своё мнение.

 
Vladimir Deryagin #:

полностью с вами согласен,

"(Что касается источника, то обратите внимание на значение по умолчанию. Надо-ли его указывать, если выбираем действующие ордера, дело каждого? 

зы. А при более внимательном рассмотрении видно, что  MODE_HISTORY абсолютно необходимо.) "

я говорил про данный случай там к=OrdersHistoryTotal()


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

А стоит ли перебирать все ордера из истории, если интересует только последний? Я думаю, достаточно найти последний действующий и последний из истории и сравнить время?

 
pechenuga #:

А стоит ли перебирать все ордера из истории, если интересует только последний? Я думаю, достаточно найти последний действующий и последний из истории и сравнить время?

Чтобы найти последний, нужно его время сравнить со временем остальных, и выбрать тот, время которого наибольшее. Без перебора как это сделать?

 
Artyom Trishkin #:

Чтобы найти последний, нужно его время сравнить со временем остальных, и выбрать тот, время которого наибольшее. Без перебора как это сделать?

if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) 0- это и есть последний ордер? Сразу уточню, в советнике нет модификаций и частичного закрытия ордеров. Ордера закрываются по рынку, либо по стоп лосс

 
pechenuga #:

if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) 0- это и есть последний ордер? Сразу уточню, в советнике нет модификаций и частичного закрытия ордеров. Ордера закрываются по рынку, либо по стоп лосс

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

 
Artyom Trishkin #:

Чтобы найти последний, нужно его время сравнить со временем остальных, и выбрать тот, время которого наибольшее. Без перебора как это сделать?

Т.е вот так? Я просто думал, проще способ есть)))

double FindLastOrderLot()

{

   double LastLot,LastLoth,LL;

   int trade, oldticketnumber,oldticketnumberh=0;

   datetime t,th=0;

   for(trade=OrdersTotal()-1;trade>=0;trade--)

   {

      if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

      if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber) continue;

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

         {

         //----          

                  if(OrderTicket()>oldticketnumber)

                  {

                     LastLot = OrderLots();

                     oldticketnumber=OrderTicket();

                     t=OrderOpenTime();

                  }

         }

    }

   for(trade=OrdersHistoryTotal()-1;trade>=0;trade--)

    {    

          if (OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY))

          if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=MagicNumber) continue;

          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)

         {

               {

                  if(OrderTicket()>oldticketnumberh)

                  {

                     LastLoth = OrderLots();

                     oldticketnumberh=OrderTicket();

                     th=OrderOpenTime();

                  }

                }

             }  

    }

    if (t>th)LL=LastLot;

    if (t<th)LL=LastLoth;


return(LL);

}

 
pechenuga #:

Т.е вот так? Я просто думал, проще способ есть)))


//+------------------------------------------------------------------+
//|                                  Лот последнего открытого ордера |
//+------------------------------------------------------------------+
double LotLastOpen() 
  {
   double lt=0;
   datetime t=0;
   int pos;
   for(pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(t<OrderOpenTime())
              {
               t=OrderOpenTime(); lt=OrderLots();
              }
           }
        }
     }
   for(pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderOpenTime())
                 {
                  t=OrderOpenTime(); lt=OrderLots();
                 }
              }
           }
        }
     }
   return(lt);
  }
Причина обращения: