Сохранение переменной в памяти при переключении таймфрейма индикатора - страница 4

 
Valeriy Yastremskiy:

в советнике все меняются по компиляции, даже в тестере. Удивило разное поведение в индюке. Внешние не менялись, ни экстерн, ни инпут по компиляции. Подтверждение что ех4 в кеше висит.) И даже после перезагрузки терминала, ничего не изменилось. Убрал признаки внешних переменных, все поменялось по компиляции.

Там видимо файл создается с настройками и если добавить или убрать input-extern переменную то он заново создается и настройки берутся из кода.
 
Fedor Arkhipov:
Да, у советников глобальные переменные остаются. У индюков инициализируются.

Наоборот поняли меня. У советников меняю и инпут переменные и просто глобальные или статик в коде, и после компиляции вижу изменения у работающего в тестере советника.

У индикатора меняю екстерн переменную в коде, компилирую при работающем индюке. ничего не происходит. Убираю екстерн. Компилирую. Вижу изменения. 

зы и далее меняю эту переменную в коде при работающем индюке, компилирую и вижу изменения.

extern int q=1;  // Повесить инд. на чарт. При смене 1 на 3 и компиляции алерт инит =1, 
                  //если убрать extern то алерт инит =3

//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
  
  Alert("Инит q= ",q);
   
   

   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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[])

  {
 
q=2;
Alert("Start q= ",q) ;  
  return(rates_total);                           // Выход из спец. ф-ии start()
  }
 
Fedor Arkhipov:

P.S. Глобальные переменные  и запись в файл не предлагать. Т.к. тогда защиту будет очень просто сломать.

  1. OnDeinit индикатора на предыдущем ТФ может сработать позже OnInit индикатора не переключенном ТФ. В КБ есть решение этой проблемы.
  2. Через Resource можно передать любую информацию. Даже квалифицированный программист ее не достанет, если не будет знать имя ресурса.
 
fxsaber:

  1. OnDeinit индикатора на предыдущем ТФ может сработать позже OnInit индикатора не переключенном ТФ. В КБ есть решение этой проблемы.
  2. Через Resource можно передать любую информацию. Даже квалифицированный программист ее не достанет, если не будет знать имя ресурса.
1. С чего это вдруг OnDeinit сработает позже? Индики выполняются в одном потоке. Может вы так подумали, потому что экран обновился позже, если например объекты были удалены не сразу?

2. Как ресурс поможет сохранить переменную? Мы же в переменные ресурса тоже передаем значения при вызове.

 
Fedor Arkhipov:
1. С чего это вдруг OnDeinit сработает позже? Индики выполняются в одном потоке. Может вы так подумали, потому что экран обновился позже, если например объекты были удалены не сразу?

2. Как ресурс поможет сохранить переменную? Мы же в переменные ресурса тоже передаем значения при вызове.

  1. Курим форум.
  2. Динамические ресурсы.
 
fxsaber:

  1. Курим форум.
  2. Динамические ресурсы.

1. Я ни разу не сталкивался. Мне достаточно знать что индикаторы работают в одном потоке.

2. Какой например?

 
fxsaber:

  1. OnDeinit индикатора на предыдущем ТФ может сработать позже OnInit индикатора не переключенном ТФ. В КБ есть решение этой проблемы.
  2. Через Resource можно передать любую информацию. Даже квалифицированный программист ее не достанет, если не будет знать имя ресурса.

Добрый... 

 
Fedor Arkhipov:

1. Я ни разу не сталкивался. Мне достаточно знать что индикаторы работают в одном потоке.

https://www.mql5.com/ru/code/18138

2. Какой например?

https://www.mql5.com/ru/docs/common/resourcecreate#dynamic_resourcecreate

Документация по MQL5: Общие функции / ResourceCreate
Документация по MQL5: Общие функции / ResourceCreate
  • www.mql5.com
[in]  Относительный путь к файлу, содержащему данные для ресурса. Если путь начинается с обратной косой черты "\" (пишется "\\"), то файл ищется относительно папки Если второй вариант функции вызывается для...
 

Так это для MT5.Ну хотя там тоже они исполняются в одном потоке.

Речь шла о МТ4 и о сохранении данных при переключении таймфрема.

А в ресурс-изображение если запокавать переменную, так она скорее всего не создаться при вызове индикатора из советника в тестере стратегий при оптимизации или тестировании.

В МТ5 много всяких "приколов" возникает с индикаторами. Там может быть что угодно.

Вот, например, только вчера кодил индикатор с Histogram2, так он рисовал белиберду, пока я не задал начало отрисовки.

Пока нашел в чем дело, потратил несколько часов, проверял расчеты и не мог найти ошибки. В МТ4 такой проблемы вообще не возникало.

 
Aleksey Mavrin #:

И снова язык быстрее остальных органов. Даже уже хочется спорить на деньги))

Не стоит, они Вам на рынке пригодятся. 

//+------------------------------------------------------------------+ //|                                                            t.mq4 | //|                        Copyright 2020, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link      "https://www.mql5.com" #property version   "1.00" #property strict static int x=0; //+------------------------------------------------------------------+ //| Expert initialization function                                   | //+------------------------------------------------------------------+ int OnInit()   {    if ( x==0 ) Print("Инициализация"); //---    //---    return(INIT_SUCCEEDED);   } //+------------------------------------------------------------------+ //| Expert deinitialization function                                 | //+------------------------------------------------------------------+ void OnDeinit(const int reason)   { //---      } //+------------------------------------------------------------------+ //| Expert tick function                                             | //+------------------------------------------------------------------+ void OnTick()   { //---    x++;   } //+------------------------------------------------------------------+ //| Tester function                                                  | //+------------------------------------------------------------------+ double OnTester()   { //---    double ret=0.0; //--- //---    return(ret);   } //+------------------------------------------------------------------+

Это советник. Поиграйте кнопками ТФ, инструментом и т.п. 

После сделайте код индикатором и сделайте то же самое. 

Узнаете много нового и интересного. 


С уважением и удивлением. tara