Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 13

 
Krokus:

Может быть так:

Другие мысли не приходят...




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

добрый день! у меня невыходит вот это условие:

OrderCloseTime()!=hour()

хочу чтобы  неболее одного ордера было открыто за час!

а ордера все равно открываюся! в чем может быть дело? 

 
lowech:

добрый день! у меня невыходит вот это условие:

OrderCloseTime()!=hour()

хочу чтобы  неболее одного ордера было открыто за час!

а ордера все равно открываюся! в чем может быть дело? 

Во-первых: OrderCloseTime() - время закрытия ордера. Если ордер не закрыт, оно равно нулю. Вам нужно смотреть время открытия.

Во-вторых: Hour() - это час запуска эксперта и этот час не меняется в процессе выполнения программы. Вам нужно сравнивать со временем прихода последней котировки - TimeCurrent()

Ф-ция возвращает количество секунд после открытия последней позиции текущего символа:

//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(int op, int mn) {
   datetime t=0;
   int      i, k=OrdersTotal();

   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=Symbol())  continue;
         if (OrderType()!=op)          continue;
         if (OrderMagicNumber()!=mn)   continue;
         if (t<OrderOpenTime()) t=OrderOpenTime();
         }
      }
   return(TimeCurrent()-t);
}
//+----------------------------------------------------------------------------+

Т.е., чтобы проверить количество секунд после открытия последней позиции Buy с магиком Magic, нужно:

if (SecondsAfterOpenLastPos(OP_BUY, Magic)>3600) {
   // Можно открывать следующий
   }
 
Здравствуйте, при очередном открытии терминала, после выходных, на центовом счете, пропали все графики, включая рабочие графики  с советниками. Вместо графика - серое поле, хотя внизу сохранились окрытые позиции, баланс и средства. Пришлось заново скачать терминал и устанавливать рабочие графики с советниками повторно, после чего все исправно функционирует. Скажите пжалуйста, с чем это связано и как устранять подобный дефект в будущем наиболее безболезненным способом?
 

Во-первых: OrderCloseTime() - время закрытия ордера. Если ордер не закрыт, оно равно нулю. Вам нужно смотреть время открытия.

Во-вторых: Hour() - это час запуска эксперта и этот час не меняется в процессе выполнения программы. Вам нужно сравнивать со временем прихода последней котировки - TimeCurrent()

Ф-ция возвращает количество секунд после открытия последней позиции текущего символа:

//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(int op, int mn) {
   datetime t=0;
   int      i, k=OrdersTotal();

   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=Symbol())  continue;
         if (OrderType()!=op)          continue;
         if (OrderMagicNumber()!=mn)   continue;
         if (t<OrderOpenTime()) t=OrderOpenTime();
         }
      }
   return(TimeCurrent()-t);
}
//+----------------------------------------------------------------------------+

Т.е., чтобы проверить количество секунд после открытия последней позиции Buy с магиком Magic, нужно:

if (SecondsAfterOpenLastPos(OP_BUY, Magic)>3600) {
   // Можно открывать следующий
   }
спаибо за функцию! у вас нет еще одной?! чтобы за один бар открывался только один ордер?!
 
lowech:
спаибо за функцию! у вас нет еще одной?! чтобы за один бар открывался только один ордер?!
//+----------------------------------------------------------------------------+
datetime BarsAfterOpenLastPos(int op, int mn) {
   datetime t=0;
   int      i, k=OrdersTotal();

   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=Symbol())  continue;
         if (OrderType()!=op)          continue;
         if (OrderMagicNumber()!=mn)   continue;
         if (t<OrderOpenTime()) t=OrderOpenTime();
         }
      }
   return((TimeCurrent()-t)/60/Period());
}
//+----------------------------------------------------------------------------+

та же фигня, только проверять на количество баров, а не секунд

 
//+----------------------------------------------------------------------------+
datetime BarsAfterOpenLastPos(int op, int mn) {
   datetime t=0;
   int      i, k=OrdersTotal();

   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderSymbol()!=Symbol())  continue;
         if (OrderType()!=op)          continue;
         if (OrderMagicNumber()!=mn)   continue;
         if (t<OrderOpenTime()) t=OrderOpenTime();
         }
      }
   return((TimeCurrent()-t)/60/Period());
}
//+----------------------------------------------------------------------------+

та же фигня, только проверять на количество баров, а не секунд


работает! только вот когда по TP закрываеться ордер, сразу же открываеться новый! это можно как поправить?
 
Почему торг слои не отображаются на плотформе и не идет работа советника?
 
lowech:

та же фигня, только проверять на количество баров, а не секунд


работает! только вот когда по TP закрываеться ордер, сразу же открываеться новый! это можно как поправить?

Значит, нужно проводить ещё одну проверку: на количество баров после закрытия последнего ордера:

//+----------------------------------------------------------------------------+
int BarsAfterCloseLastPos (int fi_MG, int fi_Type = -1)
{
    datetime ldt_Time = 0;
    int      li_Total = OrdersTotal();
//----
    for (int li_pos = 0; li_pos < li_Total; li_pos++)
    {
        if (!OrderSelect (li_pos, SELECT_BY_POS, MODE_HISTORY)) continue;
        if (OrderSymbol() != Symbol()) continue;
        if (fi_Type >= 0) if (OrderType() != fi_Type) continue;
        if (OrderMagicNumber() != fi_MG) continue;
        if (ldt_Time >= OrderCloseTime()) continue;
        ldt_Time = OrderCloseTime();
    }
    //---- Обрабатываем событие - отсутствие своих ордеров
    if (ldt_Time == 0) return (-1);
//----
    return (iBarShift (NULL, 0, ldt_Time));
}
//+----------------------------------------------------------------------------+
Причина обращения: