Особенности языка mql5, тонкости и приёмы работы - страница 133

 
Alexey Viktorov:
Почему?
пробовал уже
 
Nikolai Semko:
пробовал уже

Но здесь

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

Nikolai Semko, 2019.04.03 22:33

Да, спасибо, Алексей. Забыл я про эту функцию. Видел ее раньше, но никогда ее не использовал.

Попробовал. Что-то происходит не так. Удалять то она удаляет, но после ее удаления все стопориться.

Просто добавил одну строку кода в функцию DrawSetup() перед расчетом индикатора со следующими параметрами.

IndicatorRelease(handle);
handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
for(int i=0;i<N;i++) handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);

Индикатор попросту перестает работать и понять причину не могу пока.

Абсолютно с Вами согласен. Это просто бесполезная игрушка.


совсем не так.
 
Alexey Viktorov:

Но здесь


совсем не так.
до этого пробовал.  Код удалил у себя, как неуспешный.
 
Еще можно попробовать освобождать все хендлы по цепочке, начиная с самого глубоко зарытого.
 
Andrey Khatimlianskii:
Еще можно попробовать освобождать все хендлы по цепочке, начиная с самого глубоко зарытого.

ну вот не фурычит. Или если фурычит, то какие-то тормоза включаются.

void BuildMaFromMa()
  {
   static int h[];
   for(int i=0;i<ArraySize(h);i++) IndicatorRelease(h[i]);
   handle=iMA(_Symbol,_Period,per1,0,MaMethod,PriceBase);
   ArrayResize(h,N);
   if (N>0) h[0]=handle; 
   for(int i=0;i<N;i++)
     {
      handle=iMA(_Symbol,_Period,per2,0,MaMethod,handle);
      h[i]=handle;
     }
  }

если задокументировать строчку с IndicatorReleaseто все работает нормально, а так какие-то тормоза включаются и не понимаю что происходит.

Файлы:
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Индикаторы: MaFromMa

Nikolai Semko, 2019.04.04 01:00

захотелось сравнить быстродействие рекурсии и итерации. 

Оказалось, что рекурсия побыстрее работает более чем в два раза... 

Наверное из-за того что стек работает быстрее...

Удивительное рядом. Ожидал обратный эффект. ))

#define size 1000000
uint sum1=0,sum2=0;
int i;
int X[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   ArrayResize(X,size);
   for(i=0;i<size;i++) X[i]=rand();

   ulong t=GetMicrosecondCount();
   i=0;
   while(i<size) { sum1+=X[i]; i++;}
//Recursion();
   ulong t1=GetMicrosecondCount()-t;

   t=GetMicrosecondCount();
   i=0;
//while(i<size) { sum1+=X[i]; i++;}
   Recursion();
   ulong t2=GetMicrosecondCount()-t;
   Print("время выполнения цикла    = "+string(t1)+" , контрольная сумма = "+string(sum1));
   Print("время выполнения рекурсии = "+string(t2)+" , контрольная сумма = "+string(sum2));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Recursion()
  {
   sum2+=X[i];
   i++;
   if(i<size) Recursion();
  }
//+------------------------------------------------------------------+
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1667 , контрольная сумма = 3510404212
2019.04.03 19:06:40.776 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 697 , контрольная сумма = 3510404212
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1653 , контрольная сумма = 3492310620
2019.04.03 19:06:41.697 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 699 , контрольная сумма = 3492310620
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1529 , контрольная сумма = 3510953577
2019.04.03 19:06:42.549 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 696 , контрольная сумма = 3510953577
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1559 , контрольная сумма = 3512212419
2019.04.03 19:06:43.332 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 698 , контрольная сумма = 3512212419
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1707 , контрольная сумма = 3497178596
2019.04.03 19:06:44.098 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 472 , контрольная сумма = 3497178596
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 2088 , контрольная сумма = 3485051380
2019.04.03 19:06:44.839 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 482 , контрольная сумма = 3485051380
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1612 , контрольная сумма = 3487817581
2019.04.03 19:06:45.538 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 448 , контрольная сумма = 3487817581
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1742 , контрольная сумма = 3475121003
2019.04.03 19:06:46.397 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 497 , контрольная сумма = 3475121003
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения цикла    = 1701 , контрольная сумма = 3485556615
2019.04.03 19:06:47.262 TestLoopVsRecursion (EURUSD,M1) время выполнения рекурсии = 701 , контрольная сумма = 3485556615

 

Ребят а есть у кого проверенная и надежная функция расчета лота по проценту от депозита для МТ 5, без стоп лосса?

Поделитесь...

 
Во время Оптимизации можно столкнуться с таким сообщением в Журнале Тестера
Tester  OnTesterInit failed. Optimization cannot be started.


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


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

input int Range = 0; // 1..9

int Tmp = 1 / Range;

void OnTesterDeinit() {}

double OnTester()
{
  return(Tmp);
}


Советник оптимизируется в диапазоне, где Range не достигает нуля. Но при этом Оптимизация проваливается.

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

Если из исходника убрать OnTesterDeinit-пустышку, то Оптимизация будет проходить без проблем.


Хорошо будет, если в Журнале Тестера в таких ситуациях будет отсылка к Журналу Терминала. Иначе не всегда получается понять (дебаг недоступен при Оптимизации), что же происходит.

 

Можно столкнуться с ситуацией, когда на чарте советники не запускаются.

Слева - обычный курсор при перетаскивании советника на чарт. Справа - наш случай.


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


Если сохранить tpl-шаблон, то эти чарты будет отличать одна строка

tester=1

Наверное, это единственный программный вариант определить тип чарта. Это фрейм-чарт.


Так что если хотите огородить себя от автоматической торговли, можете работать только с такими чартами.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Nikolai Semko:

В формуле синтетического инструмента выдает ошибку "Неизвестная ошибка парсинга" если имя символа начинается (или содержит) точку.

Slava, 2019.04.19 06:08

Если имя символа содержит точку, тире или ещё что-то непонятное (как насчёт "RTS-12.19"?), то это имя надо обрамлять в апострофы

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