AccountInfoInteger(ACCOUNT_LOGIN), где проблема?

 

Всем привет!

Столкнулся с такой проблемой: простецкий код индикатора

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   long UserLogin=AccountInfoInteger(ACCOUNT_LOGIN);
   Print("UserLogin=",UserLogin);
   // проверка
   if (UserLogin ==0)
   {
      Alert("Номер счета = 0!");
      return(INIT_FAILED);
   }  

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{

   return(rates_total);
}

Запускаю, см. журнал

2018.02.02 08:58:34.564 test EURUSD.m,H4: initialized
2018.02.02 08:58:34.564 test EURUSD.m,H4: UserLogin=2302693
2018.02.02 08:58:33.580 Custom indicator test EURUSD.m,H4: loaded successfully

Все ок - работает

Закрываю терминал. Запускаю его заново. И... брюки превращаются...

2018.02.02 09:00:16.016 Custom indicator test EURUSD.m,H4: removed
2018.02.02 09:00:16.016 test EURUSD.m,H4: uninit reason 8
2018.02.02 09:00:16.016 test EURUSD.m,H4: initialization failed (1)
2018.02.02 09:00:16.016 test EURUSD.m,H4: Alert: Номер счета = 0!
2018.02.02 09:00:16.016 test EURUSD.m,H4: UserLogin=0
2018.02.02 09:00:16.000 Custom indicator test EURUSD.m,H4: loaded successfully

Это я такой "умный" или так задумано разработчиком? Что не так в коде?

 
fromme2you:

Всем привет!

Столкнулся с такой проблемой: простецкий код индикатора

Запускаю, см. журнал

2018.02.02 08:58:34.564 test EURUSD.m,H4: initialized
2018.02.02 08:58:34.564 test EURUSD.m,H4: UserLogin=2302693
2018.02.02 08:58:33.580 Custom indicator test EURUSD.m,H4: loaded successfully

Все ок - работает

Закрываю терминал. Запускаю его заново. И... брюки превращаются...

2018.02.02 09:00:16.016 Custom indicator test EURUSD.m,H4: removed
2018.02.02 09:00:16.016 test EURUSD.m,H4: uninit reason 8
2018.02.02 09:00:16.016 test EURUSD.m,H4: initialization failed (1)
2018.02.02 09:00:16.016 test EURUSD.m,H4: Alert: Номер счета = 0!
2018.02.02 09:00:16.016 test EURUSD.m,H4: UserLogin=0
2018.02.02 09:00:16.000 Custom indicator test EURUSD.m,H4: loaded successfully

Это я такой "умный" или так задумано разработчиком? Что не так в коде?

Сам процесс подключения занимает какое-то время. Плюс может быть ситуация, когда нет интернет соединения - как думаете, что в таком случае вернёт функция AccountInfoInteger(ACCOUNT_LOGIN) ?

Попробуйте этот код:

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   long UserLogin=AccountInfoInteger(ACCOUNT_LOGIN);
   Print(__FUNCTION__,", UserLogin=",UserLogin);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   long UserLogin=AccountInfoInteger(ACCOUNT_LOGIN);
   Print(__FUNCTION__,", UserLogin=",UserLogin);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

прикрепите индикатор и перезагрузите терминал. Затем отключите интернет и снова запустите терминал

 
Vladimir Karputov:

Сам процесс подключения занимает какое-то время. Плюс может быть ситуация, когда нет интернет соединения - как думаете, что в таком случае вернёт функция AccountInfoInteger(ACCOUNT_LOGIN) ?

Попробуйте этот код:

прикрепите индикатор и перезагрузите терминал. Затем отключите интернет и снова запустите терминал

Ок, результат такой - понадобилось 2 тика, чтобы получить номер счета

0    11:01:04.890    Custom indicator test EURUSD.m,M5: loaded successfully
0    11:01:07.327    test EURUSD.m,M5: OnInit, UserLogin=2302693
0    11:01:07.327    test EURUSD.m,M5: initialized
0    11:01:07.327    test EURUSD.m,M5: OnCalculate, UserLogin=2302693
0    11:01:08.046    test EURUSD.m,M5: OnCalculate, UserLogin=2302693

....

0    11:01:58.049    test EURUSD.m,M5: OnCalculate, UserLogin=2302693
0    11:01:58.346    test EURUSD.m,M5: uninit reason 9
0    11:01:58.555    Custom indicator test EURUSD.m,M5: removed

перезапуск терминала

0    11:03:40.703    Custom indicator test EURUSD.m,M5: loaded successfully
0    11:03:40.719    test EURUSD.m,M5: OnInit, UserLogin=0
0    11:03:40.719    test EURUSD.m,M5: initialized
0    11:03:40.719    test EURUSD.m,M5: OnCalculate, UserLogin=0
0    11:03:42.051    test EURUSD.m,M5: OnCalculate, UserLogin=0
0    11:03:43.140    test EURUSD.m,M5: OnCalculate, UserLogin=2302693
0    11:03:43.140    test EURUSD.m,M5: OnCalculate, UserLogin=2302693

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

Спасибо за подсказку.

 
Vladimir Karputov:

Сам процесс подключения занимает какое-то время. Плюс может быть ситуация, когда нет интернет соединения - как думаете, что в таком случае вернёт функция AccountInfoInteger(ACCOUNT_LOGIN) ?

Попробуйте этот код:

прикрепите индикатор и перезагрузите терминал. Затем отключите интернет и снова запустите терминал

Обращение к AccountInfoInteger(ACCOUNT_LOGINодин раз:

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   long UserLogin=AccountInfoInteger(ACCOUNT_LOGIN);
   Print(__FUNCTION__,", UserLogin=",UserLogin);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(UserLogin <= 0) OnInit();
   Print(__FUNCTION__,", UserLogin=",UserLogin);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Vitaly Muzichenko:

Обращение к AccountInfoInteger(ACCOUNT_LOGINодин раз:

Ну как же - один раз? На каждом тике все равно обращаемся. Правда, непонятно, что это за UserLogin в OnCalculate. Переменная нигде не объявлена. А та переменная UserLogin, что в OnInit, с ним и пропадает.

 
Причина обращения: