Ошибки, баги, вопросы - страница 2531

 
Aleksey Vyazmikin:

Жаль, что даже в тестах не решились поучаствовать. Тема на мой взгляд интересная, так как оказалось, что разные процессоры по разному справляются с разными задачами, но статистики ещё мало.

Мой раритетный процессор остался лишь у меня и в музее, это вряд ли кому интересно.

 
Aleksey Vyazmikin:

Жаль, что даже в тестах не решились поучаствовать.

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

по моему нужен четкий мануал (с картинками ) и минимум раздумий что делать для пользователя, тогда может активность пользователей появится

 
Igor Makanu:

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

по моему нужен четкий мануал (с картинками ) и минимум раздумий что делать для пользователя, тогда может активность пользователей появится

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

 

Такой вопрос.

Нужно сохранять указатель на массив типа double[] (обычный, индикаторный), чтобы к нему можно было обращаться внутри программы.

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

Оба решения мне кажутся очень некрасивыми. Передавать ссылку через все дерево вызовов уже некрасиво, а если учесть, что неизвестно, в каком месте может потребоваться обратиться к массиву - то это вобще становится довольно глупо.

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

Сталкивался кто-то с этой проблемой ? Как обойти это дурацкое ограничение ?

Помню, когда-то, кажется, fxsaber предлагал функцию копирования адреса с использованием каких-то шаманских действий, но не могу ее найти.

Кто что предложит ?

 
Vict:

Мой раритетный процессор остался лишь у меня и в музее, это вряд ли кому интересно.

Оценить прогресс всегда интересно.


Igor Makanu:

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

по моему нужен четкий мануал (с картинками ) и минимум раздумий что делать для пользователя, тогда может активность пользователей появится

Багов там не должно быть, у остальных же всё запустилось нормально. Сейчас там есть скрин, как должен быть настроен тестер стратегий.

Я не думал, что вообще могут возникнуть трудности с настройкой оптимизатора... Что там сейчас не понятно - давайте подскажу.


Vict:

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

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

 
Georgiy Merts:

Такой вопрос.

Нужно сохранять указатель на массив типа double[] (обычный, индикаторный), чтобы к нему можно было обращаться внутри программы.

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

Оба решения мне кажутся очень некрасивыми. Передавать ссылку через все дерево вызовов уже некрасиво, а если учесть, что неизвестно, в каком месте может потребоваться обратиться к массиву - то это вобще становится довольно глупо.

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

Сталкивался кто-то с этой проблемой ? Как обойти это дурацкое ограничение ?

Помню, когда-то, кажется, fxsaber предлагал функцию копирования адреса с использованием каких-то шаманских действий, но не могу ее найти.

Кто что предложит ?

Если мы про mql5 говорим, то, как вариант, оборачиваем индикатор в класс и, при необходимости, его дергаем, а уже в нем организуем копирование и хранение необходимых данных на нужную нглубину и контроль их однократного обновления на каждом тике. Я так делаю.
 
Vladimir Simakov:
Если мы про mql5 говорим, то, как вариант, оборачиваем индикатор в класс и, при необходимости, его дергаем, а уже в нем организуем копирование и хранение необходимых данных на нужную нглубину и контроль их однократного обновления на каждом тике. Я так делаю.

Да я и сам так делаю обычно...

Но с индикаторными буфферами обертка не проходит. Или я что-то пропустил, и уже это как-то можно сделать?

 
Georgiy Merts:

Но с индикаторными буфферами обертка не проходит.

всегда проходила
 
Georgiy Merts:

Но с индикаторными буфферами обертка не проходит. Или я что-то пропустил, и уже это как-то можно сделать?

работает все, но массивы которые будут индикаторными буферами должны быть описаны с модификатором public

вот под MQL4 делал из одного индикатора HMA - 4 шт в одном подокне:

CHMA *hma[4];
int OnInit()
  {
//--- indicator buffers mapping
   int i=0;
   hma[0] = new CHMA(4,PeriodInd1,Method1,Price1,Shift1);
   hma[1] = new CHMA(3,PeriodInd2,Method2,Price2,Shift2);
   hma[2] = new CHMA(2,PeriodInd3,Method3,Price3,Shift3);
   hma[3] = new CHMA(1,PeriodInd4,Method4,Price4,Shift4);

   IndicatorBuffers(16);
   IndicatorSetDouble(INDICATOR_MINIMUM,0.0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,5.0);
   IndicatorSetInteger(INDICATOR_HEIGHT,IndHeight);
   while(i<8)       { SetIndexBuffer(i,hma[int(i/2)].Uptrend); SetIndexBuffer(i+1,hma[int(i/2)].Dntrend); i+=2; 			}
   for(i=0;i<4;i++) { SetIndexBuffer(i+8,hma[i].ExtMapBuffer); SetIndexBuffer(i+12,hma[i].vect); 					}
   for(i=0;i<8;i++) { SetIndexStyle(i,DRAW_ARROW,EMPTY,ArrowWidth, i%2==0 ? ArrowColor1 : ArrowColor2); SetIndexArrow(i,ArrowCode); 	}
   for(i=8;i<17;i++){ SetIndexStyle(i,DRAW_NONE);											}
   IndicatorShortName("");
   IndicatorDigits(0);
//---
   return(INIT_SUCCEEDED);
  }

и сам класс в который тело старого индикатора просто скопировал:

class CHMA
  {
private:
   int               period_,shift_,p,level_;
   ENUM_APPLIED_PRICE price_;
   ENUM_MA_METHOD    method_;
   double            GetWMA(int x,int per){ return(iMA(NULL,0,per,0,method_,price_,x+shift_)); }
public:
   double            ExtMapBuffer[],vect[],Uptrend[],Dntrend[];
                     CHMA(int level,int period,ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int shift);
   void              calcind(int lim,int prevcalculated);
   int               lastvalue();
  };

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

 
TheXpert:
всегда проходила

В смысле ? Можно объявить индикаторным массивом член класса ???

Сейчас проверю.

Хм... Точно...

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

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