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

 
Nikolai Semko:

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

Просто пример совсем не про кастинг.

 
fxsaber:

Просто пример совсем не про кастинг.

Ладно ясно все.
Проехали
 
fxsaber:

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

Нет, у Вас что то другое, т.к. в 144 строке 55 позиция это не индекс.

 
Nikolai Semko:
Ладно ясно все.
Проехали

Все же потратили оба время.

#include "Convert.mqh" // https://c.mql5.com/3/360/Convert.mqh

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
CStructArr::CStructArr(const string name,T &var[]) {
   //ulong tt=GetMicrosecondCount();
   
   int sizeT = sizeof(T)/4;
   size = ArraySize(var);
   w=1+size*sizeT;
   ArrayResize(Var,w);
   h=1;
   
   Name="::"+name+ IntegerToString(ChartGetInteger(0,CHART_WINDOW_HANDLE));
   if(ResourceReadImage(Name,Var,w,h)) {
      uint_to_t = GetMicrosecondCount();
      CONVERT::ArrayToArray(Var, var);
      uint_to_t = GetMicrosecondCount()-uint_to_t;
   } else {
      for (int j=0; j<size; j++) {
         su.st=var[j];
         //for(int i=0; i<sizeof(T)/4; i++) Var[j*sizeof(T)/4+i]=su.u[i];
         ArrayCopy(Var, su.u,j*sizeT,0,sizeT);
         value[j]=var[j];
      }
      if(!ResourceCreate(Name,Var,w,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA)) printf("Error create Resource: "+DoubleToString(GetLastError(),0));
   }
}

template <typename T>
bool CStructArr::Set(T &var[]) {
   t_to_uint = GetMicrosecondCount();
   CONVERT::ArrayToArray(var, Var);  
   t_to_uint = GetMicrosecondCount() - t_to_uint;
   if(!ResourceCreate(Name,Var,w,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA)) {
      printf("Error create Resource: "+DoubleToString(GetLastError(),0));
      return(false);
   } else return(true);
}
 
Nikolai Semko:
Нет, у Вас что то другое, т.к. в 144 строке 55 позиция это не индекс.

Строка 114.


 
fxsaber:

Все же потратили оба время.

Исходный (SIZE = 1000).

        Сохранение данных - 71 микросекунд
        Время T[] -> uint[] - 49 микросекунд
        Востановление данных - 252 микросекунд
        Время uint[] -> T[] - 52 микросекунд
        Востановление данных - 258 микросекунд
        Время uint[] -> T[] - 51 микросекунд
        Востановление данных - 262 микросекунд
        Время uint[] -> T[] - 52 микросекунд

Модифицированный.

        Сохранение данных - 55 микросекунд
        Время T[] -> uint[] - 47 микросекунд
        Сохранение данных - 30 микросекунд
        Время T[] -> uint[] - 25 микросекунд
        Сохранение данных - 54 микросекунд
        Время T[] -> uint[] - 45 микросекунд
        Сохранение данных - 31 микросекунд
        Время T[] -> uint[] - 25 микросекунд
Восстановление данных не пашет. Разбираться нет времени. Скорее всего, при переключении ТФ старая копия вырубается позже новой.
 
fxsaber:

Строка 114.



Да, я ошибся с 144, но смотрел я на 114.
нет, чудес не бывает. Не может быть ошибка переполнения в такой позиции. 
Проверьте путь инклюдника и расположение ваших файлов. 
Значит у вас в папках два iCanvas и у Вас запускается старая версия.

 
fxsaber:

Исходный (SIZE = 1000).

Модифицированный.

Восстановление данных не пашет. Разбираться нет времени. Скорее всего, при переключении ТФ старая копия вырубается позже новой.

Да, также не смог запустить вашу версию. Записи не происходит.

 
Nikolai Semko:

Проверьте путь инклюдника и расположение ваших файлов. 

Значит у вас в папках два iCanvas и у Вас запускается старая версия.

Во всей MQL5-папке только один iCanvas. По ALT+G на него перехожу. Ошибка исключена.

 
fxsaber:

Просто пример совсем не про кастинг.

Такой замеритель.

#include "Convert.mqh"                     // https://c.mql5.com/3/360/Convert.mqh
#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  int Array[];
  MqlTick Ticks1[];
  
  ArrayResize(Ticks1, 10000);
  
  _B(CONVERT::ArrayToArray(Ticks1, Array), 1);
  
  MqlTick Ticks2[];
  
  _B(CONVERT::ArrayToArray(Array, Ticks2), 1);
  
  Print(ArrayCompare(Ticks1, Ticks2)); // Должен быть ноль.
}
Причина обращения: