Новая версия платформы MetaTrader 4 build 1220 - страница 3

 
Stanislav Korotky:

Если таймер больше ни для чего не используется, его имеет смысл прибивать в MyOnInit. И назначение IsReadyToInit - не ясно: почему не вставить в if просто проверку AccountInfoString(ACCOUNT_SERVER) на пустоту?

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

 
fxsaber:
Прошу помощи по индикатору в MT4.

Запускаю этот индикатор и перезагружаю Терминал. Индикатор в OnInit не видит название сервера.

Кто как это побеждает? Неужели только через таймер?

OnInit() в индикаторах штука капризная, я бы такие вещи в OnCalculate() проверял бы

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[])
{  static string AccServer = AccountInfoString(ACCOUNT_SERVER);      //--- инициализация static переменных происходит до вызова OnInit(), так сказал @Ilyas , проверить бы это в индикаторах - не проверял
   if(AccServer=="") AccServer = AccountInfoString(ACCOUNT_SERVER);  //---  первый запуск и нет конекта, пробуем получить имя сервера
   else
   {  if(AccServer!=AccountInfoString(ACCOUNT_SERVER)) ;             //---  конект с сервером уже был и было переключение на новый сервер
   }
   if(prev_calculated==0);                                           //--- первый вызов индикатора или смена таймфрейма или подгрузка данных из истории....думаю тут тоже можно было AccServer проверить
 
Igor Makanu:

OnInit() в индикаторах штука капризная, я бы такие вещи в OnCalculate() проверял бы

Такой способ не сработает на выходных. Окончательно пришел к этому

#property strict

#property indicator_chart_window
#property indicator_buffers 0

int OnInit()
{  
  const bool Res = !EventSetTimer(1);
  
  OnTimer();
  
  return(Res);
}

bool IsReadyToInit()
{
  static string PrevAccountServer = "";  
  
  const string AccountServer = AccountInfoString(ACCOUNT_SERVER);
  const bool Res = (PrevAccountServer != AccountServer);
  
  if (Res)
    PrevAccountServer = AccountServer;
    
  return(Res); 
}

bool IsOnInit()
{
  static bool Init = false;
  
  if (!Init)
  {
    if (Init = IsReadyToInit())
    {
      OnDeinit(REASON_ACCOUNT);
      
      MyOnInit();
    }
  }
  else if (IsReadyToInit()) 
  {
    OnDeinit(REASON_ACCOUNT);
    
    MyOnInit();
  }
  
  return(Init);
}

void MyOnInit()
{
  Alert(AccountInfoString(ACCOUNT_SERVER) + " " + _Symbol);    
}

void OnTimer()
{
  if (!IsOnInit())
    return;
}

void OnDeinit( const int Reason )
{
  if (Reason != REASON_ACCOUNT)
    EventKillTimer();
}

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 (!IsOnInit())
    return(0);
    
  return(rates_total);
}


Если Терминал не подключен к серверу, то узнать название сервера штатными средствами, похоже, невозможно. Через WinAPI можно.

 
fxsaber:

Такой способ не сработает на выходных. Окончательно пришел к этому

по моему Ваш код будет переключение ТФ воспринимать как конект к новому серверу

проверил, обрывы связи Ваш кон не видит

а мой видит

вот этот принт видит обрыв связи

{ 
  if(prev_calculated==0) Print("prev_calculated==0");
  if (!IsOnInit())
    return(0);
    
  return(rates_total);
}
 
Igor Makanu:

по моему Ваш код будет переключение ТФ воспринимать как конект к новому серверу

Смена ТФ вызывает другую копию индикатора.


Не фиксирую обрывы связи, т.к. не нужны.

 
fxsaber:

Если Терминал не подключен к серверу, то узнать название сервера штатными средствами, похоже, невозможно. Через WinAPI можно.

пролистал справку не нашел как получить полное имя файла с путями, а идея была открыть для чтения файл истории .hst и узнать папку в которой он лежит - папка имя сервера

 
Igor Makanu:

пролистал справку не нашел как получить полное имя файла с путями, а идея была открыть для чтения файл истории .hst и узнать папку в которой он лежит - папка имя сервера

К сожалению, разработчики проигнорировали такие просьбы.

string FileName( const int handle, const bool Path = false );
 
fxsaber:

К сожалению, разработчики проигнорировали такие просьбы.

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

 
fxsaber:

К сожалению, разработчики проигнорировали такие просьбы.

Полагаю, должен сработать обход через созданный вручную линк на нужные объекты файловой системы внутри папки Files. Тогда можно использовать обход иерархии по FileFindFirst/Next и читать названия папок.

 

Здравствуйте, всем.

Мне нужн оффициалный MetaTrader 4 Client Terminal build 1220

где я могу скачать? я искал во многих сайтах. 

если возмоно оставте ссылку к инсталятор.

извиняюсь за простой может и быть не тот вопрос.

мне не надо алпари мт 4 или еще что. 

если вопрос не тот тогда дайте мне ссылку к ДОК чтоб я понял что на самом деле нужно.
.

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