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

 
tol64:

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

То есть, вот так ошибки нет:

А вот так получаем ошибку 4802 (Индикатор не может быть создан):

Вот тут почитайте про tester_indicator.
 
marketeer:
Вот тут почитайте про tester_indicator.
Да читал я и перечитывал уже всё неоднократно. )) Но что-то не удаётся получить то, что нужно. А нужно мне задавать имя индикатора переменной.
 
tol64:
Да читал я и перечитывал уже всё неоднократно. )) Но что-то не удаётся получить то, что нужно. А нужно мне задавать имя индикатора переменной.
Ну так Вы добавили property test_indicator? Без этого, видимо, никак.
 
marketeer:
Ну так Вы добавили property test_indicator? Без этого, видимо, никак.

Пробовал. Что-то не получается так. Не могли бы показать пример (возможно неправильно делаю)?

P.S. Получилось. Проще некуда. Пошёл отдыхать. ))

P.S2. Но всё же получается зависимость от того, что нужно тогда прописывать все индикаторы через property test_indicator. То есть, если имя индикатора задаётся внешним параметром и у пользователя появился новый индикатор, то нужно снова лезть в код. Это не совсем то, что хотелось бы.

 
tol64:

P.S2. Но всё же получается зависимость от того, что нужно тогда прописывать все индикаторы через property test_indicator. То есть, если имя индикатора задаётся внешним параметром и у пользователя появился новый индикатор, то нужно снова лезть в код. Это не совсем то, что хотелось бы.

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

Все дело в том, что эксперты в тестере МТ5 запускаются вне терминала и не имеют всего окружения библиотек, что было в МТ4.

Например, эксперт вообще отправляется в клауд и чтобы передать дополнительные связи, надо:

  1. использовать статические имена индикаторов в вызовах, что позволяет компилятору автоматически прописывать зависимости эксперта
  2. явно прописывать через property список нужных индикаторов, чтобы вручную построить список зависимостей

Если используется динамические вызовы индикаторов, то нужно вручную прописать список используемых. Когда запускает сторонний тест, то вместе с экспертом посылаются все зависимые файлы. Это могут быть как локальные (они все равно вне терминала), так и удаленные или клаудные агенты.

Это цена, которую надо платить за "нажал на старт и ни о чем больше не думаю, все работает автоматически".

Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.
 
Renat:

Все дело в том, что эксперты в тестере МТ5 запускаются вне терминала и не имеют всего окружения библиотек, что было в МТ4.

Это цена, которую надо платить за "нажал на старт и ни о чем больше не думаю, все работает автоматически".

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

Возможно вопрос уже поднимался, но я не нашел его в форуме.

В следующем коде(в методе test()) при получении константного описателя(ссылки) на объект и присваивании его не константному, компилятор(МетаEditor 5.00, Build 687) не выдает ошибку:

class A{
   public:
      void someDo() {}
};

class B{
   public:
      void B( A* aA ) : mA( aA ) {}
      const A* getA() { return (mA); }   
   private:
      A* mA;
};

void test(){
   A a;
   B b( GetPointer( a ) );

   //Ошибки нет. И это правильно   
   const A* a1 = b.getA();
   //Ошибка есть: "...someDo' - call non-const method for constant object..". И это правильно   
   a1.someDo();
   
   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();
   //ошибки нет. Правильно (а2 не const)
   a2.someDo();
}
 
mvk:

Возможно вопрос уже поднимался, но я не нашел его в форуме.

В следующем коде(в методе test()) при получении константного описателя(ссылки) на объект и присваивании его не константному, компилятор(МетаEditor 5.00, Build 687) не выдает ошибку:

вот так будет без ошибок

class A{
   public:
      void someDo() const {};
};
 

вопрос к разработчикам по скорости работы указателей на объекты


почему первый код

class CSomeObj
{
public:
   double prm;
};

CSomeObj arr;

void OnStart()
{
        EventSetTimer(1);

        uint s0=GetTickCount();
        for (int i=0; i<100000000; i++) arr.prm=10;
        Print("1=", GetTickCount()-s0);
        
        s0=GetTickCount();
        CSomeObj *item=GetPointer(arr);
        for (int i=0; i<100000000; i++) item.prm=10;
        Print("2=", GetTickCount()-s0);
}

работает быстрее, чем второй в ДВА раза?

2012.08.21 09:56:40    info (EURUSD,D1)    2=1654
2012.08.21 09:56:38    info (EURUSD,D1)    1=795

сможете ли вы это оптимизировать, чтоб поднять скорость?

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