Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2745

Vitaly Muzichenko #:
Разверните буфер и цикл, и чтобы меньше расчётов, сразу впишите символ "EURGBP"

Оценил юмор по - поводу EURGBP... тонко

EUR и GBP использую просто как пример

Alexey Belyakov #:

Подскажите пожалуйста ёщё такой момент... 

Cуть такая: есть два актива EUR/USD  и  GBP/USD . Между ними вычисляется разница, и транслируется в переменную. И на основе этой полученной переменной строится линия внизу в подокне.

Вот на основе вашего примера пытался свою задачу решить, да не тут то было. Не показывает. Пишет ошибка "array out of range"

Alexey Belyakov #:

Подскажите пожалуйста ёщё такой момент... 

Cуть такая: есть два актива EUR/USD  и  GBP/USD . Между ними вычисляется разница, и транслируется в переменную. И на основе этой полученной переменной строится линия внизу в подокне.

Вот на основе вашего примера пытался свою задачу решить, да не тут то было. Не показывает. Пишет ошибка "array out of range"

"array out of range" -  Цикл инициализации теперь огранич переменной limit (количество реально скопированных данных), а не общим rates_total.

Прошу помощи! 

 Подскажите, возникла проблема! В терминале МТ5 При тестировании DarcCloudPercingLINE RSI тестер стратегий  завис. И больше, кроме этого советника никого не тестирует.

Пробовал по разному отменять, перезагружать. В конце переустановил МТ5, а проблема осталась. Подскажите как ее решить?

VetrovAlex #:

Прошу помощи! 

 Подскажите, возникла проблема! В терминале МТ5 При тестировании DarcCloudPercingLINE RSI тестер стратегий  завис. И больше, кроме этого советника никого не тестирует.

Пробовал по разному отменять, перезагружать. В конце переустановил МТ5, а проблема осталась. Подскажите как ее решить?

1. Полная очистка папки тестера (самое вероятное решение)

В МТ4 в своё время делали так.  


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

Закройте терминал МТ5. Попробуй так. 


Нажмите Win + R , введите %APPDATA%\MetaQuotes\Terminal и нажмите Enter.

Внутри этой папки находится несколько подпапок с длинными названиями-хэшами (например, 3A7B9C... ). В каждой из них есть папка MQL5 .

Вам нужно зайти в каждую такую папку и полностью удалить содержимое внутри каталога Tester (обычно путь выглядит так: ...\Terminal\<Хэш>\tester\ ).

Удалите все файлы с расширениями .cache , .idx , .ini , а также папки bases и logs внутри директории tester . Именно здесь хранится зацикленный процесс зависшего теста.

Также проверьте общую папку терминалов: C:\Program Files\MetaTrader 5\Tester\Bases — если она есть, очистите её.

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

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

Откройте редактор кода MetaEditor ( F4 ), найдите файл этого советника.

Проверьте функцию OnTick() или OnCalculate() . Если там есть циклы while(true) без условия выхода или деление на переменную, которая может стать нулем (например, стандартное отклонение или объем), тестер зависнет намертво.

Попробуйте сбросить настройки советника перед запуском. Найдите кнопку «Свойства эксперта» (иконка гаечного ключа) и нажмите «Сброс». Часто зависание происходит из-за комбинации параметров (например, слишком маленький период RSI вроде 1 вместе с коротким стоп-лоссом).

3. Очистка глобального кэша графиков и истории

Иногда зависший расчет индикаторов ломает временные файлы свечей.

Зайдите в меню «Файл» -> «Открыть каталог данных».

Перейдите в папку Bases . Переименуйте её (например, в Bases_old ) или удалите историю конкретной пары, на которой виснет тест (например, Bases\History\Alpari-MT5\EURUSD.hcc ).

При следующем запуске МТ5 скачает историю заново. Это исправит ошибки, если зависание провоцировал битый тик истории.

4. Отключение лишних агентов тестирования

В МТ5 тестер распараллеливает задачи. Если один из локальных агентов получил повреждённую задачу от предыдущего запуска, он будет блокировать очередь.

Зайдите в «Сервис» -> «Настройки» -> вкладка «Агенты».

Убедитесь, что галочки стоят только на ваших физических ядрах CPU. Отключите лишние агенты.

Выделите каждый работающий агент и посмотрите внизу статус. Если какой-то из них показывает «Работает», но загрузка ЦП равна 0%, этот агент "залип". Выделите его и нажмите «Запретить использование агента», затем запустите тест снова.

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

Чтобы понять, где именно код дает сбой:

Запустите тест в режиме «Визуализация» на минимальном таймфрейме (М1) и очень коротком отрезке времени (буквально 1–2 дня).

Как только картинка замерла, переключитесь на рабочий стол Windows и откройте Диспетчер задач ( Ctrl+Shift+Esc ).

Найдите процессы metaeditor.exe или сторонние agent.exe . Если они потребляют 0% ЦП — это дедлок (ожидание ресурса). Если 25–50% — бесконечный цикл расчетов.

В момент замирания нажмите паузу в визуализаторе. Посмотрите, какая цена была на графике и какие объекты пытался нарисовать советник (линии Darc Cloud обычно перерисовываются сложными трендовыми линиями).

6. Запуск в безопасном режиме

Попробуйте запустить сам терминал с ключом /skipupdate или в чистом профиле:

Создайте ярлык МТ5, зайдите в его свойства и в поле «Объект» после закрывающей кавычки добавьте пробел и текст: /portable

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

7. Проверка журнала тестера

Перед тем как удалять файлы, загляните в журнал:

В окне тестера стратегий перейдите на вкладку «Журнал».

Последняя строка перед зависанием укажет на проблему: например, zero divide (деление на ноль), array out of range (выход за пределы массива при расчете облака Ишимоку) или просто резкое прекращение записей.

Начнн с пункта №1 (ручная чистка папки AppData ). В 99% случаев после удаления файлов из ...\Terminal\<ID>\tester\ зависание исчезает, так как стирается информация о прерванном процессе, которую переустановка основной программы не затрагивает.

 Добрый день!
Помогите пожалуйста решить одну задачу. Хочу посчитать - cколько закрытий цен после послдеднего пересечения ценой Машки. К примеру взял 9-периодную машку. 
...То есть сколько баров закрылось выше MA после последнего пересечения цены 9 -периодной MA ? 


 Мне удалось вытащить последние 100 цен Close, дальше упёрся. Не могу сообразить, как теперь посчитать количество после пересечения.


double  EMA[]; // массив для индикатора iMA

int MA;  // указатель на индикатор iMA


int OnInit()
  {
   //--- создание указателя на объект - индикатор iMA
   MA=iMA(NULL,PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE);
   return(0);
  }
 

void OnTick()
{

 CopyBuffer(MA,0,0,2,EMA);
 ArraySetAsSeries(EMA,true);  


int k=100;
for(int c = k; c>=1; c--)
{
double   clos = iClose(NULL,PERIOD_CURRENT, c);
if (  clos > EMA[0]  )
{
double nbar=+iBarShift(NULL,PERIOD_CURRENT,c); 
Print (" Количество последних закрытых баров выше MA[9]  == ",nbar);
}
}
}


Alexey Belyakov #:
 Добрый день!
Помогите пожалуйста решить одну задачу. Хочу посчитать - cколько закрытий цен после послдеднего пересечения ценой Машки. К примеру взял 9-периодную машку. 
...То есть сколько баров закрылось выше MA после последнего пересечения цены 9 -периодной MA ? 


 Мне удалось вытащить последние 100 цен Close, дальше упёрся. Не могу сообразить, как теперь посчитать количество после пересечения.



Задачу решил самостоятельно, всем спасибо!))

double  EMA[]; // массив для индикатора iMA

int MA;  // указатель на индикатор iMA


int OnInit()
  {
   //--- создание указателя на объект - индикатор iMA
   MA=iMA(NULL,PERIOD_CURRENT,9,0,MODE_EMA,PRICE_CLOSE);
   return(0);
  }
 


void OnTick()
{



 CopyBuffer(MA,0,0,50,EMA);
 ArraySetAsSeries(EMA,true);  



for(int i=1; i<=100; i++)
{
double clos = iClose(NULL,PERIOD_CURRENT,i);
if ( clos < EMA[i]) break;
 //Print("Количество до пересечения ===  ",i, "  Цена  ",clos, "  MA === ",EMA[i]);
 
 Comment(   
  
 "Количество до пересечения === ",i,"\n");
}
}
Здравствуйте..  Подскажите пожалуста как в графе инструментов добавить цвет фона стоп лосс и тейк профит... Как на фото
Файлы:
Alexey Belyakov #:
 Добрый день!
Помогите пожалуйста решить одну задачу. Хочу посчитать - cколько закрытий цен после послдеднего пересечения ценой Машки. К примеру взял 9-периодную машку. 
...То есть сколько баров закрылось выше MA после последнего пересечения цены 9 -периодной MA ? 


 Мне удалось вытащить последние 100 цен Close, дальше упёрся. Не могу сообразить, как теперь посчитать количество после пересечения.



Ответ буде в любом случае не точен !!!!!!!!!!!!! Автор, запроса, не указал под какую систему, это нужно сделать (мт4 или мт5). Однако , вот под мт 5, это будет выглядить так

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

//--- Input parameters
input group "--- Moving Average Settings ---";
input int    InpMAPeriod     = 9;          // Period of MA
input ENUM_MA_METHOD InpMAMethod = MODE_SMA; // Method
input ENUM_APPLIED_PRICE InpPrice = PRICE_CLOSE; // Price type

input group "--- Logic & Display ---";
input bool   InpCountAbove   = true;       // If true: count bars above MA. If false: below.
input color  InpTextColor    = clrWhite;
input uint   InpFontSize     = 12;
input string InpCorner       = "Top Right"; // Corner

//--- Global variables for caching
double ma_buffer[];
datetime last_calc_time = 0;
int cached_result = -1;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Create handle and buffer
   int handle = iMA(_Symbol, _Period, InpMAPeriod, 0, InpMAMethod, InpPrice);
   
   if(handle==INVALID_HANDLE)
     {
      PrintFormat("Error creating MA handle: %d", GetLastError());
      return(INIT_FAILED);
     }
   
   ArraySetAsSeries(ma_buffer, true);
   
//--- Set timer for recalculation on new bar
   EventSetTimer(1); 
   
   DrawComment(0); // Initial draw
   
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Timer event                                                      |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- Recalculate only when a new bar forms
   static datetime prev_bar_time=0;
   datetime curr_bar_time = iTime(_Symbol, _Period, 0);
   
   if(curr_bar_time != prev_bar_time)
     {
      prev_bar_time = curr_bar_time;
      CalculateAndDisplay();
     }
  }

//+------------------------------------------------------------------+
//| Main calculation logic                                           |
//+------------------------------------------------------------------+
void CalculateAndDisplay()
  {
//--- Avoid duplicate calculations within the same tick cluster
   if(TimeCurrent() == last_calc_time && cached_result >= 0) 
     {
      DrawComment(cached_result);
      return;
     }
   last_calc_time = TimeCurrent();

   int handle = iMA(_Symbol, _Period, InpMAPeriod, 0, InpMAMethod, InpPrice);
   if(CopyBuffer(handle, 0, 0, InpMAPeriod + 10, ma_buffer) <= 0) return;

   ArraySetAsSeries(ma_buffer, true);
   
   int total_bars = Bars(_Symbol, _Period);
   int limit = MathMin(total_bars - 1, 500); // Search depth to save resources

   bool found_cross = false;
   bool was_above = false;
   int counter = 0;

//--- 1. Find the state at the current bar (bar 0)
   double price_0 = Close[0];
   double ma_0 = ma_buffer[0];
   
   // Determine initial relation safely (handles flat MA)
   if(ma_0 == EMPTY_VALUE || ma_0 == 0) return;
   
   was_above = (price_0 > ma_0);

//--- 2. Loop backwards through history
   for(int i = 1; i < limit; i++)
     {
      double price_i = Close[i];
      double ma_i = ma_buffer[i];
      
      if(ma_i == EMPTY_VALUE) continue;

      // Check for intersection between bar i and bar i-1
      bool curr_above = (price_i > ma_i);
      bool prev_above = (Close[i-1] > ma_buffer[i-1]);

      // Intersection detected if boolean states differed
      if(curr_above != prev_above)
        {
         found_cross = true;
         
         // The loop continues from here counting in the direction we want
         break; 
        }
     }

//--- 3. Counting phase
   if(found_cross)
     {
      // Start counting from bar 1 (first closed bar AFTER the crossing point)
      for(int j = 1; j < limit; j++)
        {
         double p = Close[j];
         double m = ma_buffer[j];
         
         if(m == EMPTY_VALUE) { counter = 0; break; }

         bool condition_met = InpCountAbove ? (p > m) : (p < m);

         if(condition_met)
            counter++;
         else
            break; // Stop at first opposite close
        }
     }

   cached_result = counter;
   DrawComment(counter);
  }

//+------------------------------------------------------------------+
//| Drawing text on chart                                            |
//+------------------------------------------------------------------+
void DrawComment(int value)
  {
   string corner_str="CORNER_RIGHT_UPPER";
   StringToUpper(InpCorner);
   if(InpCorner=="TOP LEFT") corner_str="CORNER_LEFT_UPPER";
   else if(InpCorner=="BOTTOM RIGHT") corner_str="CORNER_RIGHT_LOWER";
   else if(InpCorner=="BOTTOM LEFT") corner_str="CORNER_LEFT_LOWER";

   string signal_dir = InpCountAbove ? "ABOVE" : "BELOW";
   string text = "Closes " + signal_dir + ": " + IntegerToString(value);
   
   Comment("\n\n\n\n"); // Clear previous comments
   ObjectCreate(0,"BarsCounterLabel",OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,"BarsCounterLabel",OBJPROP_CORNER,StringToEnum(corner_str));
   ObjectSetInteger(0,"BarsCounterLabel",OBJPROP_XDISTANCE,10);
   ObjectSetInteger(0,"BarsCounterLabel",OBJPROP_YDISTANCE,20);
   ObjectSetInteger(0,"BarsCounterLabel",OBJPROP_FONTSIZE,(int)InpFontSize);
   ObjectSetInteger(0,"BarsCounterLabel",OBJPROP_COLOR,InpTextColor);
   ObjectSetString(0,"BarsCounterLabel",OBJPROP_TEXT,text);
  }
  
//+------------------------------------------------------------------+
//| Helper to convert string to enum                                 |
//+------------------------------------------------------------------+
ENUM_BASE_CORNER StringToEnum(string s)
  {
   if(s=="CORNER_LEFT_UPPER") return(CORNER_LEFT_UPPER);
   if(s=="CORNER_RIGHT_LOWER") return(CORNER_RIGHT_LOWER);
   if(s=="CORNER_LEFT_LOWER") return(CORNER_LEFT_LOWER);
   return(CORNER_RIGHT_UPPER);
  }

//+------------------------------------------------------------------+
//| Deinitialization                                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   Comment("");
   ObjectsDeleteAll(0, OBJ_LABEL);
  }
//+------------------------------------------------------------------+
Igor Nagorniuk #:

Ответ буде в любом случае не точен !!!!!!!!!!!!! Автор, запроса, не указал под какую систему, это нужно сделать (мт4 или мт5). Однако , вот под мт 5, это будет выглядить так

Господи!!! Как много всего! 
Alexey Belyakov #:
Господи!!! Как много всего! 
Ну, извини). Я хожу в Москву, через, дальный восток))) .