Терминал игнорирует условия в Start() при перекомпеляции. - страница 4

 
Думаю, Rosh имел ввиду сделать так
int init()
  {
//----
   New_Bar  = false;
//   Print("Init done:New_Bar=",New_Bar);
   New_Time = iTime(Symbol(),Periods,0);
//   Print("Init done:New_Time=",New_Time);
//----
   return(0);
  }
 

А что изменится от того что я принтование закоментирую, ничего.
Это не выход.

 

Скачал и установил новый терминал.
Ошибка пока не выскакивает.
Проверю в разных вариантах отпишусь.

 
HIDDEN писал (а):

А что изменится от того что я принтование закоментирую, ничего.
Это не выход.


От принта ничего не изменится.
но ты закомментировал всё
вот так (в последнем файле)
int init()
  {
//----
   /*
   New_Bar  = false;
   Print("Init done:New_Bar=",New_Bar);
   New_Time = TimeCurrent();
   Print("Init done:New_Time=",New_Time);
   */
//----
   return(0);
  }
 
Вобщем после того как скачал последнюю версию терминала, ошибка исчезла.

Код собственно такой.

//+------------------------------------------------------------------+
//|                                                 CheckOpenBar.mq4 |
//|                      Copyright © 2007, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net/ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net/"
#define MAGICMA 888555
 
extern int     Periods   = 15;       // Рабочий таймфрейм для всех индикаторов
extern bool    OpenBar   = true;     // Вкл./Откл. открытие на новом баре
 
static datetime New_Time = 0;        // Время текущего бара
bool New_Bar;
int dir                 = 0;
int Errors; 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   New_Bar  = false;
   //Print("Init done:New_Bar=",New_Bar);
   New_Time = iTime(Symbol(),Periods,0);
   //Print("Init done:New_Time=",New_Time);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
int ticket;
//----
   //Print("Start done:New_Bar=",New_Bar);
   if (OpenBar == true)
        {
      //Print("Вызываем функцию Fun_New_Bar");
      Fun_New_Bar();
      if (New_Bar == false){
        Comment("ЖДЁМ ОТКРЫТИЯ НОВОГО БАРА");
        return(0);
      }
       else
      {
        Comment("ПОЛУЧАЕМ СИГНАЛ");
      }
   }
 
   int openorders = GetCurrentOrders();
//----
   if (openorders==0)
      {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #",MAGICMA,0,Green);
            Errors=GetLastError(); 
            if(Errors!=0) Print("Ошибка (",Errors,") при открытии ордера"); 
            if(Errors==4) RefreshRates();  // Торговый сервер занят
            if(Errors==8) RefreshRates();  // Слишком частые запросы
            if(Errors==128) RefreshRates(); // Истек срок ожидания совершения сделки
            if(Errors==135) RefreshRates();  // Цена изменилась
            if(Errors==137) RefreshRates();  // Брокер занят
            if(Errors==138) RefreshRates();  // Новые цены
            if(Errors==146) RefreshRates();  // Подсистема торговли занята
            if(ticket>0)  OrderPrint();
         }
      return(0);
   }
 
//+----------------------------------------------------------------------------+
//|  Открытие только на новом баре                                             |
//+----------------------------------------------------------------------------+
void Fun_New_Bar(){                                // Ф-ия обнаружения нового бара
     New_Bar = false;                                // Нового бара нет
      //Print("Fun_New_Bar: New_Time=",TimeToStr(New_Time));
         if(New_Time != iTime(Symbol(),Periods,0)){      // Сравниваем время
            New_Time = iTime(Symbol(),Periods,0);        // Теперь время такое
            if (New_Time == iTime(Symbol(),Periods,0)){  
            New_Bar = true;
               } else {
            New_Bar = false;                             // Поймался новый бар
           }
         }
      return(New_Bar);
      }
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int GetCurrentOrders(){
  //---- calc open OrderSelect
   int NumOrders=0;
   dir=0;
   for(int i=0;i<OrdersTotal();i++){
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if( OrderSymbol()!=Symbol()) continue;
      if (OrderMagicNumber()!=MAGICMA) continue;
       NumOrders++;
      if(OrderType()==OP_BUY) dir=1;
      if(OrderType()==OP_SELL) dir=-1;
   }
   return (NumOrders);
}

Что-бы не плодить несколько веток. Задам вопрос в этой ветке.
Хотелось бы гарантированное выставление ордера. Используя тот же самый код.
12 валютных пар, все открываются практически в один и тот же момент времени, понятное дело што вылазиют ошибки от торгового сервера. Восновном 146, проверка ошибок есть в коде. Но нет 100% гарантии что выставится ордер.
Делать через цикл не хочу, т.к. сильная загрузка проца идет.

Что посоветуете через флаги или как?
 
Помойму эту ситуацию лучше разруливать например с помощью этого 'Ошибка 146 ("Торговый поток занят") и как с ней бороться'
а другие связанные с торговым сервером с помощью этого https://docs.mql4.com/ru/trading/errors
 

Это наверное оптимальное решение.
Просто мне как-то подумалось что RefreshRates(); будет вполне достаточно.

 
Угу, и проверку на занятость потока IsTradeAllowed()==true не помешает перед отправкой ордера

То Хайден

             П.С. что-то твои  Игры разума притихли, что-то  случилось?
Причина обращения: