Новая версия платформы MetaTrader 4 build 1260 - страница 12

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

 
Maxim Kuznetsov:
Первая открытая вкладка традиционно глючит. Появляются артефактные вертикальные линии, а индикаторы забывают настройки стилей. Да, индикаторы имеют много буферов. И это только для первой слева вкладки и только для светлой темы. 

поймал на скриншот упомянутый "артефакт", он оказывается и в тестере бывает, если его долго мучать :-)

вертикальные полосы - это ОНО..

MT4 build 1260,

Windows10 Home ed. ver 1909 build 18363.900

UPDATE: удалось лоцировать место появляния :

фрактал вверх нарисованный как объект, жёлтого или зелёного цвета...

код который это рисует :

void DrawFractal(datetime time,double price,int type,int clr)
{
   string name;
   if (type==MODE_UPPER) name="cf.up."+IntegerToString(time);
   else name="cf.dn."+IntegerToString(time);
   if (ObjectCreate(0,name,OBJ_ARROW,0,time,price) || ObjectType(name)==OBJ_ARROW) {
      if (type==MODE_UPPER) {
         ObjectSetInteger(0,name,OBJPROP_ARROWCODE,217);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
         switch(clr) {
            case TYPE_GRAY: ObjectSetInteger(0,name,OBJPROP_COLOR,FRACTAL_COLOR); break;
            case TYPE_TREND: ObjectSetInteger(0,name,OBJPROP_COLOR,UP_TREND_COLOR); break;
            case TYPE_CONTR: ObjectSetInteger(0,name,OBJPROP_COLOR,VOLAT_COLOR);break;
            case TYPE_GOLD: ObjectSetInteger(0,name,OBJPROP_COLOR,GOLD_COLOR); break;
         }
      } else {
         ObjectSetInteger(0,name,OBJPROP_ARROWCODE,218);
         ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_TOP);
         switch(clr) {
            case TYPE_GRAY: ObjectSetInteger(0,name,OBJPROP_COLOR,FRACTAL_COLOR); break;
            case TYPE_TREND: ObjectSetInteger(0,name,OBJPROP_COLOR,DN_TREND_COLOR); break;
            case TYPE_CONTR: ObjectSetInteger(0,name,OBJPROP_COLOR,VOLAT_COLOR);break;
            case TYPE_GOLD: ObjectSetInteger(0,name,OBJPROP_COLOR,GOLD_COLOR); break;
         }
      }
      ObjectSetInteger(0,name,OBJPROP_TIME,time);
      ObjectSetDouble(0,name,OBJPROP_PRICE,price);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,1);
      ObjectSetInteger(0,name,OBJPROP_BACK,1);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,0);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,0);
   }
}
 
Это баг четверки?
class A
{
public:
  void f( A* ) {}
};

class B : public A
{
public:
  void f( B* )
  {
    this.A::f(&this); // '::' - syntax error
  }
};
 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) {
                
}

Теперь возвращает ошибку 

и больше не заводится. В 1220 еще работал. Теперь этот формат не поддерживается или это баг? Пример с вашего же дефолтного индикатора который теперь ругается.

Так же больше не появляется вкладка Parameters для задавания типа цены


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

 

Очень лютый баг с данными всех индикаторов появился в тестере стратегий

Если мы вызовем любой индикатор в индикаторе через функции типа iMA и другие или через iCustom и при этом передадим отличный от текущего таймфрейм то индексы данных перестают обновляться с новыми барами и возвращают данные до первого бара после старта индикатора.

Пример запускаем на любом тф ниже H1:

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[]) {

//---New Bar
   bool isNewBar = prev_calculated != rates_total;
   if(isNewBar) {
      double value = iCCI(_Symbol, PERIOD_H1, 14, PRICE_CLOSE, 1);
      Print(value);
   }

return rates_total;
}

мы ожидаем получать данные с бара под индексом 1, тоесть каждый новый бар на H1 данные должны меняться но они зависают и возвращают [1] бар который был в момент старта даже через месяц.

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



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

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Georgiy Liashchenko:

Очень лютый баг с данными всех индикаторов появился в тестере стратегий

Если мы вызовем любой индикатор в индикаторе через функции типа iMA и другие или через iCustom и при этом передадим отличный от текущего таймфрейм то индексы данных перестают обновляться с новыми барами и возвращают данные до первого бара после старта индикатора.

Пример запускаем на любом тф ниже H1:

мы ожидаем получать данные с бара под индексом 1, тоесть каждый новый бар на H1 данные должны меняться но они зависают и возвращают [1] бар который был в момент старта даже через месяц.

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



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

Это древняя проблема визуализатора. У него нет доступа к другим ТФ. Поэтому и добавили тестирование индикаторов как экспертов. Тестируйте именно так.

 
Ihor Herasko:

Это древняя проблема визуализатора. У него нет доступа к другим ТФ. Поэтому и добавили тестирование индикаторов как экспертов. Тестируйте именно так.

А если мне нужно тестировать советник? Комплексные индикаторы все так же виснут. Я не могу поставить его на чарт и сверять данные с советником.

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

Следовательно доступ есть, данные получаем, есть просто баг который мешает обновлять данные

 
Georgiy Liashchenko:

А если мне нужно тестировать советник? Комплексные индикаторы все так же виснут. Я не могу поставить его на чарт и сверять данные с советником.

Выход только один - написать версию индикатора для визуализатора. В коде перед каждым обращением к таймсерии нужно искать соответствующий бар по времени через iBarShift, а уже полученный результат подставлять в вызов iTime, iHigh и т. д.

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

Следовательно доступ есть, данные получаем,

Конечно, есть. Окно визуализатора - это обычный график. При обращении к его свойствам получаем то, что имеется в реальном времени. Запросите Bid и Ask - получите текущие цены.

есть просто баг который мешает обновлять данные

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

 

Может, что не понимаю но, есть

#property tester_indicator "ИмяИндикатора.ex4"

Оное используется? Что бы вызвать нужный индикатор.

 
Ihor Herasko:

Выход только один - написать версию индикатора для визуализатора. В коде перед каждым обращением к таймсерии нужно искать соответствующий бар по времени через iBarShift, а уже полученный результат подставлять в вызов iTime, iHigh и т. д.

Конечно, есть. Окно визуализатора - это обычный график. При обращении к его свойствам получаем то, что имеется в реальном времени. Запросите Bid и Ask - получите текущие цены.

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

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



Запускается индикатор на любом тф ниже указаного в настройках, в примере M15 и H1. Мы получаем корректно все данные с верхнего тф, как можно видеть по верхнему окну индикатора.

Далее через некоторое количество баров мы бросаем на чарт этот же индикатор с теме же дефолтными настройками. Вторая копия точно так же корректно получает данные с верхнего тф, НО только до старта. Отжимаем паузу и видим картину, тестируемый индикатор корректно получает данные и отрисовывает их, в то же время его копия должна делать то же самое, но она залипает. Далее бросаем 3ю копию на чарт, чтобы проверить корректность данных. Видим что 3я копия так же корректно получает данные с верхнего тф и полностью соответствует данным 1го тестируемого индикатора. Однако отпустив паузу копия 3 залипает так же как и копия 2. Это не корректное поведение когда на 1 чарте 2 абсолютно идентичных индикатора дают разные результаты. 

Эмпирическим путем было установлено, что копия 2 и последующие перестают получать данные. То-есть обращаясь к данным путем iTime(_Symbol, PERIOD_H1, 1) или любым другим методом, мы получаем константно значения 1 бара с H1 до момента старта в независимости от того сколько баров прошло. Начав в 00:00 мы будем получать 23:00 к примеру даже если уже 07:00. Это никакая не особенность, это баг самый настоящий.

Суть проблемы заключается в том, что когда мы тестируем советник использующий такой тип индикатора, советник получает корректные данные как и в случае с тестируемым индикатором. Но когда мы бросаем на чарт индикатор, чтобы сверить данные получаемые советником, история повторяется. Индикатор корректно отрисовывает данные только до момента старта.

Это проблема только в тестере, на живом чарте, ее нет.


Uladzimir Izerski:

Может, что не понимаю но, есть

#property tester_indicator "ИмяИндикатора.ex4"

Оное используется? Что бы вызвать нужный индикатор.

Это свойство не имеет отношения к данному случаю. Но науки ради было протестировано и результатов не дало.

Файлы:
Причина обращения: