Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1177

 
Сергей Таболин:

Уважаемые, ну неужели никто ничего не может предположить?

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

Куда копать?

Может в сторону пути к индикатору в тестере?
[Удален]  
Artyom Trishkin:
Может в сторону пути к индикатору в тестере?

Это как?

У меня все нужные индикаторы лежат по этому пути

handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01"
handle_HMA7C = iCustom(Symbol(),0,"my_used\\my_HMA7C_201",

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

Для других индикаторов путь подходит, а для этого нет?

[Удален]  

Специально добавил ещё один индикатор перед этим.

   ResetLastError();
      handle_HMA7C = iCustom(Symbol(),0,"my_used\\my_HMA7C_201",45,9);
      if(handle_HMA7C == INVALID_HANDLE)                                                  // проверяем наличие хендла индикатора
      {
         Print("Не удалось получить хендл индикатора handle_HMA7C...",GetLastError());    // если хендл не получен, то выводим сообщение в лог об ошибке
         return(INIT_FAILED);                                                             // завершаем работу с ошибкой
      }
      else
      {
         Print("Получен хендл индикатора handle_HMA7C");
         if(!MQLInfoInteger(MQL_OPTIMIZATION))
         {
            if(!ChartIndicatorAdd(ChartID(),0,handle_HMA7C)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
         }
      }
   
   handle_ICTMP1 = iCustom(Symbol(),0,"my_used\\ICTMP_3.01",0,in_symb1,false,false,in_smoothing);
   if(handle_ICTMP1 == INVALID_HANDLE)                                                 // проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора handle_ICTMP1...",GetLastError());   // если хендл не получен, то выводим сообщение в лог об ошибке
      return(INIT_FAILED);                                                             // завершаем работу с ошибкой
   }
   else
   {
      Print("Получен хендл индикатора handle_ICTMP1");
      if(!MQLInfoInteger(MQL_OPTIMIZATION))
      {
         if(!ChartIndicatorAdd(ChartID(),0,handle_ICTMP1)) Print("Ошибка подключения индикатора к графику"); // подключаем индикатор к графику
      }
   }
2020.01.20 20:15:34.713 program file added: Indicators\my_used\my_HMA7C_201.ex5. 41715 bytes loaded
2020.01.20 20:15:34.920 2019.09.19 00:00:00   Получен хендл индикатора handle_HMA7C
2020.01.20 20:15:34.921 file Indicators\my_used\ICTMP_3.01 read error
2020.01.20 20:15:34.921 loading of ICTMP_ EURGBP,M15 failed [557]
2020.01.20 20:15:34.921 2019.09.19 00:00:00   cannot load custom indicator 'my_used\ICTMP_3.01' [4802]
2020.01.20 20:15:34.921 2019.09.19 00:00:00   Не удалось получить хендл индикатора handle_ICTMP1...4802
2020.01.20 20:15:34.921 tester stopped because OnInit returns non-zero code

На график советник по прежнему ставится нормально. Все индикаторы загружены и работают....

 
Сергей Таболин:

Уважаемые, ну неужели никто ничего не может предположить?

Куда копать?

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

[Удален]  
Igor Zakharov:

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

Спасибо, но нет. Хэндл создаётся единожды в OnInit.

[Удален]  

Отвечаю на свой же вопрос: дело было в точке.

my_used\\ICTMP_3.01
my_used\\ICTMP_301

Я считаю, разработчикам нужно обратить на это внимание.

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

Добрый день, после работы с квиком появился ряд вопросов:

1) Если я вывожу индикатор в отдельное окно, то как вывести другой индикатор в это же самое окно?

2) Как использовать в индикаторе вместо символов из обзора рынка данные с другого индикатора?

Спасибо.

 
VANDER:

Добрый день, после работы с квиком появился ряд вопросов:

1) Если я вывожу индикатор в отдельное окно, то как вывести другой индикатор в это же самое окно?

2) Как использовать в индикаторе вместо символов из обзора рынка данные с другого индикатора?

Спасибо.

Посмотрите это: 

Как выбрать данные для построения индикатора #


Примечание: второй индикатор брать из окна "Навигатор" и перетаскивать в окно первого индикатора.

Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
Технический индикатор — наиважнейший инструмент технического анализа. На основании сигналов технических индикаторов принимаются решения относительно того, как и когда совершать сделки. Суть их заключается в математическом преобразовании цены и/или объемов финансового инструмента для прогнозирования будущих изменений цен. При этом появляется...
 

Подскажите, что передать по ссылке?

#include <Arrays\ArrayString.mqh>
CArrayString *arr=new CArrayString;

void s()
 {
  arr.Shutdown();
   for(int i=0;i<10;i++)
     {
      arr.Add(IntegerToString(i));
     // Print(i);
     }
   ArrayStr(arr.); // сюда что вписать?

// ЗДЕСЬ ВСЁ ПОНЯТНО
  string mass[];
   for(int i=0;i<10;i++)
     {
      ArrayResize(mass,i+1);
      mass[i]=IntegerToString(i);
     // Print(i);
     }
   ArrayStr(mass); // передаём
   
 }

void ArrayStr(string &m[]) {
   // ...
 }
 
Vitaly Muzichenko:

Подскажите, что передать по ссылке?

думаю, что Вы хотите один элемент динамического массива строк хотите передать

ArrayStr(arr.At(0)); 

набросал тестовый скрипт, попробуйте с ним поэкспериментировать

#include <Arrays\ArrayString.mqh>
CArrayString *arr=new CArrayString;

void OnStart()
{
   InitCArrayString(arr,10); //заполним динамический массив строк 10-ю элементами
   PrintCArrayString(arr);//распечатаем все элементы динамического массива строк
   delete arr;
}
//+------------------------------------------------------------------+
void InitCArrayString(CArrayString &dinamic_string,int count)
{
   dinamic_string.Shutdown();
   for(int i=0;i<count;i++)
   {
      string s = "arr № "+IntegerToString(i+1);
      dinamic_string.Add(s);
   }
}
//+------------------------------------------------------------------+
void PrintCArrayString(CArrayString &dinamic_string)
{
   for(int i=dinamic_string.Total()-1; i>=0; i--)
   {
      Print(dinamic_string.At(i));
   }
}

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 10

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 9

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 8

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 7

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 6

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 5

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 4

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 3

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 2

2020.01.24 21:18:49.555 tst (EURUSD,H1) arr № 1