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

 

Доброго всем интернета и здоровья.


Вопрос, что я делаю не так? Массивы (СТАТИЧЕСКИЕ) заполняются, а расчет дает 0 (ноль). Подскажите , чего нет у меня в коде. Почему элементы массива не сравнивается и не складываются?... Спасибо


 double Open[60],High[60],Lo[60,Close[60]; int to_copy=60;
if(CopyOpen(NULL,PERIOD_H4,1,to_copy,Open)<to_copy)return(0);
   if(CopyHigh(NULL,PERIOD_H4,1,to_copy,High)<to_copy)return(0);
   if(CopyLow(NULL,PERIOD_H4,1,to_copy,Low)<to_copy)return(0);
   if(CopyClose(NULL,PERIOD_H4,1,to_copy,Close)<to_copy)return(0);
//----   
   //int start=to_copy*PeriodSeconds(PERIOD_H4)/PeriodSeconds(_Period);
   int start=to_copy;
   
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=start; j++)
           {
            if(Open[j]>Close[j])
               candle+=Open[j]-Close[j];
            if(Close[j]>Open[j])
               candle+=Close[j]-Open[j];
            candleHL+=High[j]-Low[j];
            br+=1;
           } //for 
Comment(High[10],". ",candle);
candle дает результат 0 ноль
 
kopeyka2:

Доброго всем интернета и здоровья.


Вопрос, что я делаю не так? Массивы (СТАТИЧЕСКИЕ) заполняются, а расчет дает 0 (ноль). Подскажите , чего нет у меня в коде. Почему элементы массива не сравнивается и не складываются?... Спасибо


1) В цикле есть выход за рамки массива - если размер буфера 60, то последний индекс будет 59, так как первым индексом является 0

2) Код не полный - например как определяется Tf и чем был инициализирован candle?


* при копировании цен индексация смещается на единицу, так как вы копируете 60 элементов начиная с первого индекса, то есть цены первого закрытого бара уже будут под индексом 0

 

Как работает функция

IsStopped();

... и какой перечень задач выполняет?


В справке написано - "Проверяет принудительное завершение работы mql5-программы". То есть она как бы "смотрит" на какое-то количество строк кода вперёд и проверят корректность всего что угодно? Как устанавливается область её ответственности (например на строку или 10 строк)?


Я думал что она только не позволяет циклу выйти за рамки массива, но я увидел её ещё в коде FAMA перед копированием цен High и Low

 
Alexandr Sokolov:

Как работает функция

... и какой перечень задач выполняет?


В справке написано - "Проверяет принудительное завершение работы mql5-программы". То есть она как бы "смотрит" на какое-то количество строк кода вперёд и проверят корректность всего что угодно? Как устанавливается область её ответственности (например на строку или 10 строк)?


Я думал что она только не позволяет циклу выйти за рамки массива, но я увидел её ещё в коде FAMA перед копированием цен High и Low

Никуда она не смотрит... Там же всё чётко написано. Проверяет флаг... Перечитайте.

Документация по MQL5: Проверка состояния / IsStopped
Документация по MQL5: Проверка состояния / IsStopped
  • www.mql5.com
Возвращает true, если в системной переменной _StopFlag содержится значение, отличное от 0. Ненулевое значение записывается в переменную _StopFlag, если поступила команда завершить...
 
Alexandr Sokolov:

Как работает функция

... и какой перечень задач выполняет?


В справке написано - "Проверяет принудительное завершение работы mql5-программы". То есть она как бы "смотрит" на какое-то количество строк кода вперёд и проверят корректность всего что угодно? Как устанавливается область её ответственности (например на строку или 10 строк)?


Я думал что она только не позволяет циклу выйти за рамки массива, но я увидел её ещё в коде FAMA перед копированием цен High и Low

если происходит остановка MQL-программы, то будет выставлен флаг _StopFlag , который можно проверить как используя предопределенную переменную так и ф-цию IsStopped() - разницы нет, что удобно то и используйте

после выставления флага _StopFlag , MQL-программе дается незначительное время на остановку, затем терминал принудительно выгрузит ее

самое распростаренненое исполльзование - зацикленные скрипты, пишется не 

while(true)
{
...
}

а лучше написать так:

while(!IsStopped())
{
...
}

ну бывает еще в затратных расчетах или в больших в циклах  используют

for(int i=0; i<1e6 && !IsStopped(); i++)
{

}
 

Всем по привету.

Подскажите возможно ли перебрать в цикле переменные с именами: L1, L2, L3 ... Ln для записи в двухмерный массив

extern string L1       = "1.15110;1.14105;1.13240;1.12370;1.11640;1.11170;1.10655;1.09895;1.08850;1.07850;1.06475;";
extern string L2       = "1.32130;1.31030;1.29860;1.29042;1.27985;1.25605;1.24725;1.23565;1.22505;1.20815;1.20115;1.18850;1.16690;1.14465;"; 
extern string L3       = "0.94947;0.93222;0.91472;0.90077;0.89075;0.88658;0.86814;0.84687;0.82795;0.81132;0.79022;0.75976;"; 

...

extern string Ln      = " ... ";    
 
Alexandr Sokolov:

1) В цикле есть выход за рамки массива - если размер буфера 60, то последний индекс будет 59, так как первым индексом является 0

2) Код не полный - например как определяется Tf и чем был инициализирован candle?


* при копировании цен индексация смещается на единицу, так как вы копируете 60 элементов начиная с первого индекса, то есть цены первого закрытого бара уже будут под индексом 0

СПАСИБО за ответ. Полный код. Увеличил статический размер массива. Запись контроля нуля в операторах убрал... Общая "болванка". Пока хочу понять ПОЧЕМУ НЕ СЧИТАЕТ сложение. Чего теперь в моем коде нет? Спасибо за подсказки. Со статическими массивами в mql5 еще не работал.....

КОД ОБНОВИЛ . Вопрос тот же...

//+------------------------------------------------------------------+
//|                                                          123.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, "
//---- номер версии индикатора
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0
//----
input int       nBars = 20;
//----
int    limit=0,br=0,to_copy=nBars;
double corrHL,corrOC;
double averpips,averpipsH;
double candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   
   Comment("");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
   

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
//----
   if(Tf==true)
     {
      if(prev_calculated==0)
         for(int j=1; j<=to_copy; j++) // поменять на ноль?????
           {
            opn=Open[j];
            hgh=High[j];
            lw=Low[j];
            cls=Close[j];
            if(opn>cls)
               candle+=opn-cls;
            if(cls>opn)
               candle+=cls-opn;
            candleHL+=hgh-lw;
            br+=1;
           } //for j
      if(br>0)
        {
         averpips=candle/br;
         averpips=NormalizeDouble(averpips,_Digits);
         averpipsHL=candleHL/br;
         averpipsHL=NormalizeDouble(averpipsHL,_Digits);
        }
      }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpipsHL ",averpipsHL);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
Значения элементов массива больше нуля. В расчетах ноль
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
stepystr:

Всем по привету.

Подскажите возможно ли перебрать в цикле переменные с именами: L1, L2, L3 ... Ln для записи в двухмерный массив

удалил пост - Вы знаете про массивы

но все равно нельзя

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

 

Люди!!! Подскажите ... )))

 Полный код. Увеличил статический размер массива. Запись контроля нуля в операторах убрал... Общая "болванка". Пока хочу понять ПОЧЕМУ НЕ СЧИТАЕТ сложение. Чего теперь в моем коде нет? Спасибо за подсказки. Со статическими массивами в mql5 еще не работал.....

КОД ОБНОВИЛ . Вопрос тот же...

Значения элементов массива больше нуля. В расчетах ноль
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

СПАСИБО за ответ. Полный код. Увеличил статический размер массива. Запись контроля нуля в операторах убрал... Общая "болванка". Пока хочу понять ПОЧЕМУ НЕ СЧИТАЕТ сложение. Чего теперь в моем коде нет? Спасибо за подсказки. Со статическими массивами в mql5 еще не работал.....

КОД ОБНОВИЛ . Вопрос тот же...

Я с индикаторами на ВЫ, но это просто лишнее. Это уже есть )))

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

      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   if(CopyOpen(NULL,PERIOD_H4,0,to_copy,Open)<to_copy)
      return(0);
   if(CopyHigh(NULL,PERIOD_H4,0,to_copy,High)<to_copy)
      return(0);
   if(CopyLow(NULL,PERIOD_H4,0,to_copy,Low)<to_copy)
      return(0);
   if(CopyClose(NULL,PERIOD_H4,0,to_copy,Close)<to_copy)
      return(0);
     int indexmass=ArraySize(Open);
Причина обращения: