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

 
static datetime New_Time=0;

Само собой выносится. А вот по поводу iTime(Symbol(),Periods,0) вопроса не понял. Если работаем на H1, то как из 3-х вызовов может быть возвращен другой вариант.
 
HIDDEN писал (а):
static datetime New_Time=0;

Само собой выносится. А вот по поводу iTime(Symbol(),Periods,0) вопроса не понял. Если работаем на H1, то как из 3-х вызовов может быть возвращен другой вариант.
Если ты ожидаешь одинаковый результат, зачем функцию 3 раза вызываешь?
Если на границе часа функция может вернуть разные результаты, такую ошибку в большом коде практически невозможно отловить. Возможно, это и не ответит на тему ветки, но я бы так писать всуравно не стал.

А вообще, в чем основная идея? нужно, чтобы при перекомпиляции никогда не открывались ордера?
 
Если объявлять static datetime New_Time=0;, первый запуск всегда будет возвращать новый бар.
 
komposter писал (а):
Если объявлять static datetime New_Time=0;, первый запуск всегда будет возвращать новый бар.

Была фраза, что iTime(Symbol(),Periods,0)  вынесли в инит(). может, пора новый текст выложить? чтобы не путаться.
 
To Hidden.

Как эксперт сможет послать ордер в случае длительного реквота(около минуты), если эксперт посчитает что текущий бар уже не новый? Или я ошибаюсь в логике?


Вопрос всем:
как узнать время получения ошибки, перерыл документацию не нашел.

Пример:

double errcode=GetLastError();
if(errcode==135) { RefreshRates() ;}


Как/чем узнать время поступления ошибки 135
 
BabyBear:
komposter писал (а):
Если объявлять static datetime New_Time=0;, первый запуск всегда будет возвращать новый бар.

Была фраза, что iTime(Symbol(),Periods,0) вынесли в инит(). может, пора новый текст выложить? чтобы не путаться.
Добавил проверку на ошибки и функцию проверки есть ли ордер по валюте. А то уже пошли вопросы про реквоты и т.д.

Я кароче по логике никак не могу понять.
Бар мы узнаём при инициализации, с приходом нового тика проверяем не обновился ли бар, если бар не новый, то
New_Bar = false;
и значит
if (New_Bar == false){
Comment("ЖДЁМ ОТКРЫТИЯ НОВОГО БАРА");
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   = 60;       // Рабочий таймфрейм для всех индикаторов
extern bool    OpenBar   = true;     // Вкл./Откл. открытие на новом баре
 
static datetime New_Time;                     // Время текущего бара
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()
  {
//----
   
//----
   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==135) RefreshRates();  // Цена изменилась
              if(Errors==137) RefreshRates();  // Брокер занят
              if(Errors==138) RefreshRates();  // Новые цены
              if(Errors==146) RefreshRates();  // Подсистема торговли занята
         }
      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;                             // Поймался новый бар
        }
      }
    }
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//| 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);
}
 

Все больше ни у кого нет никаких мыслей.
Ткните ктонибудь в мою ошибку. Она у меня в эксперте проявляется очень редко, но тем неменее есть, а я ей не вижу.
Прям как слепой. ДАЙТЕ ПРОЗРЕТЬ.

 
Во-первых: не стоит эту проверку

   New_Bar  = false;
   Print("Init done:New_Bar=",New_Bar);
   New_Time = iTime(Symbol(),Periods,0);
   Print("Init done:New_Time=",New_Time);

вставлять в init(), кроме того, при вызове iTime(), нужно проверять такую ошибку, как подкачку данных
 

Проверку закоментировал в ините. Подкачка в данном случае не критична вообще. Бары есть все.
Выставление ордера так и происходит.

 
HIDDEN писал (а):

Проверку закоментировал в ините. Подкачка в данном случае не критична вообще. Бары есть все.
Выставление ордера так и происходит.

у меня последний вариант не выставляет ордеров.
раз 30 перекомпилировал. висит одновременно на трёх графиках евро, фунт и йена. таймфреймы ставил минута, 30 и час
только я comment на print заменил.
Причина обращения: