Выпущена бета-версия MetaTrader 4 Build 529 с новым компилятором - страница 18

 
mr_Johns:
а справочник MQL4 (который в эдиторе) тоже обновился соответственно?


да с запросом на обновление. Справочник для MQL4 там почти с 5-ки содран и много не соответствует реалиям компилятора, на данный момент.
 
ALXIMIKS:

Поправьте если не так понял.

Использую в индикаторе библиотечную функцию, в данной функции происходит объявление неких static переменной, которые участвуют в расчете индикаторного массива.

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

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

в теле произвести обнуление значений static переменных, и не забыть снять флаг перед завершением всего расчета.

На много проще было если бы static переменные имели какой-то параметр, задаваемый при их объявлении, отвечающий за то, будет или нет обнуляться значение этих переменных при переинициализации.

Сделайте вместо локальных статиков глобальные переменные (вне функций), и инициализируйте их при первом вызове.
 
ALXIMIKS:

На много проще было если бы static переменные имели какой-то параметр, задаваемый при их объявлении, отвечающий за то, будет или нет обнуляться значение этих переменных при переинициализации.

Будет ещё проще, если разработчики сделают спец-функцию типа ResetStaticVars().

// Кстати, сделать её не так-то просто. Я б не стал. Одно дело тупо обнулить весь сегмент данных, другое дело корректно присвоить все юзерские начальные значения. Гемор однако.

Вапче (как парадигма) сохранение значений в течении жизни программы весьма удобно. Просто тут вопрос обратной совместимости встал, ну и..

 

I know that this is a Russian speaking part of the forum, but since I am bad at talking Russian (even though I can read it) hope nobody will mind posting this here (since the English part seems completely inactive as far as these issues are concerned and since I did not see that someone posted about this issue)

There is one serious issue with the new metatrader that concerns external string parameters. Initially they have a correct value, but as soon as time frame or symbol is changed the content of a string parameter is lost. Here is a simple example that will show exactly what is happening. That issue also happens when such indicators are used through iCustom() call and that makes any such indicator unusable from any EA or other code

#property indicator_chart_window

extern string TestString = "whatever value that we want initially set";

int OnInit() { return(0); }
int deinit() { return(0); }
int start()
{
   Comment(TestString);
   return(0);
}
 
ALXIMIKS:

да с запросом на обновление. Справочник для MQL4
там почти с 5-ки содран и много не соответствует реалиям компилятора, на данный момент.

может там оставили то, что в ближайших планах? я на это расчитываю.
 
mr_Johns:
а справочник MQL4 (который в эдиторе) тоже обновился соответственно?

Да, давно обновился и активно дополняется ежедневно.
 

Что то я не могу разобраться для чего нам нужна подобная конструкция

#property icon "\\Files\\button.ico"
 
VOLDEMAR:

Что то я не могу разобраться для чего нам нужна подобная конструкция

При запуске советника на вкладке "Общие" будет картинка.
 
нет картинки
 
mladen:

I know that this is a Russian speaking part of the forum, but since I am bad at talking Russian (even though I can read it) hope nobody will mind posting this here (since the English part seems completely inactive as far as these issues are concerned and since I did not see that someone posted about this issue)

There is one serious issue with the new metatrader that concerns external string parameters. Initially they have a correct value, but as soon as time frame or symbol is changed the content of a string parameter is lost. Here is a simple example that will show exactly what is happening. That issue also happens when such indicators are used through iCustom() call and that makes any such indicator unusable from any EA or other code

Младен, мне проще ответить по-русски, тем более, что Вы свободно читаете.

Вот мое решение этой проблемы. В код init() включаю функцию ReInit(), которая повторно инициализирует те глобальные переменные, значения которых должны быть восстановлены при смене таймфрейма, или символа:

//-----------------------------------------------------------------------------
int init(){
   int Error;
   if( МинНаклонТренда<Zero ) МинНаклонТренда=0;
   if( МинНаклонТренда-МаксНаклонТренда>Zero ) МаксНаклонТренда=МинНаклонТренда;
   if( БарОкончания<1 ) БарОкончания=1;
   if( МинБазовыйПериод<1 ) МинБазовыйПериод=1;
   if( МаксБазовыйПериод<МинБазовыйПериод ) МаксБазовыйПериод=МинБазовыйПериод;
   if( БарНачала<МинБазовыйПериод+БарОкончания ) БарНачала=МинБазовыйПериод+БарОкончания;
   if( БарНачала>Bars-1 ){
      if( Bars>МинБазовыйПериод+БарОкончания ) БарНачала=Bars-1;
      else Alert("Неразрешимая ошибка: история("+Bars+")<=активация("+МинБазовыйПериод
                +")+окончание("+БарОкончания+")");
   }
   if( ТолщинаТрендовой<1 ) ТолщинаТрендовой=1;
   if( ТолщинаТрендовой>5 ) ТолщинаТрендовой=5;
   if( РазмерИндикатораТиков<1 ) РазмерИндикатораТиков=1;
   if( РазмерИндикатораТиков>5 ) РазмерИндикатораТиков=5;
   if( СдвигИндикатораТиков<3 ) СдвигИндикатораТиков=3;
   if( СдвигИндикатораТиков>100 ) СдвигИндикатораТиков=100;
   if( ПоказыватьВсе ) Visibility=0; else Visibility=EMPTY;
   LastBar     =БарОкончания;
   ЦветЛиний[0]=ЦветПоддержки;
   ЦветЛиний[1]=ЦветСопротивления;
   ЦветХорды[0]=ЦветВосходящейХорды;
   ЦветХорды[1]=ЦветНисходящейХорды;
   Цвет123[0]  =Цвет123ВТ;
   Цвет123[1]  =Цвет123НТ;
   NewTime     =0;
   ReInit();                                       // Повторная инициализация
   ClearScreen();                                  // Очистить экран
   Error=fVLine("StartLine","Старт",0,БарНачала,0,0,0,0,0,ЦветВертикалей);
   Error=fVLine("DeadLine","Пуск",0,БарОкончания,0,0,0,0,0,ЦветВертикалей);
   DeadLine=TimeCurrent();
   if( СтатическийРежим ){
      if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
      РежимРаботы=РежимРаботы+"Статический режим Пауза "+ПериодИмитацииТиков+" мс";
      МоделироватьДинамику=false;
      //РежимОтладки=false;
      while( true ){                               // Бесконечный цикл
         ReInit();                                 // Повторная инициализация
         start();                                  // Имитация тика
         Sleep(ПериодИмитацииТиков);               // Не работает в индикаторах
   }  }
   else {
      if( МоделироватьДинамику ){
         РежимРаботы=" Режим имитации динамики Размерность "+DoubleToStr(0.5*БарНачала*БарНачала,0);
         Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
         LastBar=БарНачала;
         while( LastBar>БарОкончания ){            // Перебор всех баров истории
            LastBar--;
            start();                               // Имитация тика
         }
         МоделироватьДинамику=false;
         Print("      Режим имитации динамики отключен!");
   }  }
   if( РежимОтладки ) РежимРаботы=" Отладка "; else РежимРаботы=" ";
   РежимРаботы=РежимРаботы+"Динамический режим";
   Print("      "+Version+РежимРаботы+" История: "+(БарНачала)+" баров с "+TimeToStr(Time[БарНачала]));
   if( !ПечататьПредупреждения ) Print("Печать предупреждений запрещена!");
   if( РежимОтладки ) start();                     // Имитация тика
   return(0);
}
//-----------------------------------------------------------------------------
// Повторная инициализация глобальных переменных и массивов
void ReInit(){
   StartTime[0]   =Time[БарНачала];
   StartTime[1]   =Time[БарНачала];
   Groups[0]      =0;
   Groups[1]      =0;
   OldMG[0]       =0;
   OldMG[1]       =0;
   MainGroup[0]   =0;
   MainGroup[1]   =0;
   QualityMax[0]  =0;
   QualityMax[1]  =0;
   OldStopLine    =0;
   return;
}
//-----------------------------------------------------------------------------
Причина обращения: