Как перениести глобальную переменную, структуру в индикаторе при переходе на другой таймфрейм? - страница 5

 
fxsaber:

Если напишите замер производительности, будет интересно сравнить.

Ок. Давайте. Только реализуйте Вашу часть сами. 
Вот моя часть.
Предлагаю от балды такой тестовый индикатор (желтым выделено то, что отвечает за сохранение и восстановление массива структуры между ТФ):
При первом вызове происходит генерация массива случайных узлов (по умолчанию 100) в пределах окна, которые соединяются кривой Безье.
При изменении ТФ узлы, привязанные к времени и цене, сохраняются и не меняются. 
Для лучшего замера лучше количество узлов сделать 1000

#property indicator_chart_window
#include <Canvas\iCanvas.mqh> //https://www.mql5.com/ru/code/22164
#include <CVar\StructArr.mqh>
#define SIZE 100

struct Node {
   datetime time;
   double price;
};
Node line[];

ulong t0 = GetMicrosecondCount();
CStructArr<Node> Var("Bezier",line);
ulong t1=GetMicrosecondCount()-t0;

int OnInit() {
   if (ArraySize(line) == 0) GenerateLine();
   else {
      Print("Востановление данных - " + string(t1)+ " микросекунд");
      Print("Время uint[] -> T[] - " + string(Var.uint_to_t)+ " микросекунд");
   }
   DrawBezier(line);
   return(INIT_SUCCEEDED);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
   return(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GenerateLine() {
   ArrayResize(line,SIZE);
   for (int i = 0; i<SIZE; i++) {
      line[i].time = Canvas.TimePos(double(rand() % W.Width));
      line[i].price = Canvas.Price(rand() % W.Height);
   }
   t0 = GetMicrosecondCount();
   Var.Set(line);
   t0 = GetMicrosecondCount()-t0;
   Print("Сохранение данных - " + string(t0)+ " микросекунд");
   Print("Время T[] -> uint[] - " + string(Var.t_to_uint)+ " микросекунд");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DrawBezier(Node &arr[]) {
   int size = ArraySize(arr);
   if (size>1) {
      Canvas.Erase(0x00FFFFFF);
      int X[],Y[];
      ArrayResize(Y,size);
      ArrayResize(X,size);
      for(int i=0; i<size; i++) {
         X[i] = (int)Canvas.X(line[i].time);
         Y[i] = (int)Canvas.Y(line[i].price);
      }
      Canvas.PolylineSmooth(X,Y,0xFFFF00FF,3);
      Canvas.Update();
   }
}
//+------------------------------------------------------------------+

2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Сохранение данных - 15 микросекунд
2021.07.11 04:41:02.705 TestVar (EURUSD,M6)     Время T[] -> uint[] - 4 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Востановление данных - 317 микросекунд
2021.07.11 04:42:03.085 TestVar (EURUSD,M10)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Востановление данных - 878 микросекунд
2021.07.11 04:42:10.012 TestVar (EURUSD,M12)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Востановление данных - 1061 микросекунд
2021.07.11 04:42:44.235 TestVar (EURUSD,M30)    Время uint[] -> T[] - 8 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Востановление данных - 303 микросекунд
2021.07.11 04:43:20.556 TestVar (EURUSD,M20)    Время uint[] -> T[] - 4 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Востановление данных - 443 микросекунд
2021.07.11 04:43:25.339 TestVar (EURUSD,M15)    Время uint[] -> T[] - 5 микросекунд


при SIZE = 1000:

2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Сохранение данных - 41 микросекунд
2021.07.11 05:01:32.602 TestVar (EURUSD,M5)     Время T[] -> uint[] - 26 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Востановление данных - 586 микросекунд
2021.07.11 05:01:36.541 TestVar (EURUSD,M6)     Время uint[] -> T[] - 64 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Востановление данных - 648 микросекунд
2021.07.11 05:01:38.317 TestVar (EURUSD,M10)    Время uint[] -> T[] - 35 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Востановление данных - 567 микросекунд
2021.07.11 05:01:40.534 TestVar (EURUSD,M12)    Время uint[] -> T[] - 36 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Востановление данных - 449 микросекунд
2021.07.11 05:01:42.814 TestVar (EURUSD,M15)    Время uint[] -> T[] - 44 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Востановление данных - 728 микросекунд
2021.07.11 05:01:45.015 TestVar (EURUSD,M20)    Время uint[] -> T[] - 59 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Востановление данных - 2349 микросекунд
2021.07.11 05:01:47.536 TestVar (EURUSD,M30)    Время uint[] -> T[] - 45 микросекунд
Файлы:
TestVar.mq5  6 kb
StructArr.mqh  3 kb
 

Для MQL было бы шикарно иметь какой нибудь указатель для глобальных переменных индикатора. Которые бы инициализировались один раз и только при установке индикатора.

Типа:
int global Var;

Тогда весь огород с ресурсами был бы не нужен. Помечтали и хватит, пилим дальше.

 
Nikolai Semko:

Вот моя часть.

        array out of range in 'iCanvas.mqh' (114,55)
 
Mikhail Nazarenko:

Для MQL было бы шикарно иметь какой нибудь указатель для глобальных переменных индикатора. Которые бы инициализировались один раз и только при установке индикатора.

Типа:
int global Var;

Тогда весь огород с ресурсами был бы не нужен. Помечтали и хватит, пилим дальше.

Помимо PersistentStorage, ещё прекрасен был-бы ServerSideStorage (чтобы хоть мелочь сохранять на стороне сервера) и AuthorOwnedCloud(чтобы какими-то данными управлял автор)..но это что-то из 21 века :-)

Помечтали и хватит..

 
Nikolai Semko:

При изменении ТФ узлы, привязанные к времени и цене, сохраняются и не меняются. 

Разве это статистически значимый замер кастинга массивов?

 
Taras Slobodyanik:

:)

Странно что теперь никто не пишет про "костыли", "изобретение велосипеда", "сложности переноса данных на другой терминал", "задача должна решаться средствами MQL "...
Получается что решения от метаквотов - это костыли и моветон)


А где это решение от MQ ?
 

fxsaber:

  array out of range in 'iCanvas.mqh' (114,55)


У вас видно устаревшая версия.
последняя версия 1.43
https://www.mql5.com/ru/code/22164

Файлы:
iCanvas.mqh  52 kb
 
fxsaber:

Разве это статистически значимый замер кастинга массивов?

никто не мешает ввести свои коррективы.

ЗЫ
И пожалуйста, не заводите разговор про стринги.
В таком типе задач они неактуальны, поэтому в моем классе они не реализованы и моя структура не может содержать тип string.
Знаю, что у вас они реализованы. Но речь о другом.

 
PapaYozh:

А где это решение от MQ ?

да, конечно, этих решений совсем нет.

Поэтому пользователи изобретают "костыли-велосипеды" - FileWriteStruct  и GlobalVariableSet.
Ну и самые безкостыльные решения, конечно же - это запись переменных в ресурсы, плюс запись структур в глобальные переменные)

 
Nikolai Semko:

У вас видно устаревшая версия.
последняя версия 1.43
https://www.mql5.com/ru/code/22164

Именно эта версия выдала ошибку.

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