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

 

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

Пример с тремя переменными (по факту переменных больше, громоздко получается):

//+------------------------------------------------------------------+
//|                                                            1.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

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;";

//Надо: Вместо rsLevels[] задать двухмерный массив

string rsLevels[]; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{

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

 L1 = StringTrimLeft(StringTrimRight(L1));
 
 if(StringSubstr(L1, StringLen(L1)-1, 1) != ";")
  L1 = StringConcatenate(L1, ";");

 int s = 0,i = StringFind(L1, ";", s);
 string current;
 
 while(i>0)
 
 {
 
  current=StringSubstr(L1, s, i - s);
  
  ArrayResize(rsLevels, ArraySize(rsLevels) + 1);
  
  rsLevels[ArraySize(rsLevels) - 1] = current;
  
  s = i + 1;
  
  i = StringFind(L1,";",s);
  
 }
 
//---------------------------------------------------------

 for(int x=0; x<ArraySize(rsLevels); x++)
  
 {

  Print(rsLevels[x]); 
   
 }
 
 return(INIT_SUCCEEDED);
}
 
kopeyka2:

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

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

вот ошибки при компиляции вашего кода


 
stepystr:

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

Пример с тремя переменными (по факту переменных больше, громоздко получается):

Тема "кривоватая", конечно (по MQL4 и MQL5), поэтому в начале вопроса не плохо бы было указывать к какой именно платформе адресуется вопрос )))

 
stepystr:

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

Пример с тремя переменными (по факту переменных больше, громоздко получается):

Для начала необходимо определиться с количеством значений во втором измерении будущего массива. Уже сейчас видно, что количество элементов не одинаковое. Наверное надо взять максимальное, а там где остаются лишние заполнять нулями или -1 например. Да и первое измерение не мешает определить заранее если оно известно. И потом во вложенном цикле брать L1 и писать в массив всё что надо, затем вторая итерация внешнего цикла пишет в следующий индекс всё что есть в L2 и так далее.


А совсем правильно, лучше засунуть это в структуру.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Тогда можно будет менять размерность и в первом измерении и во втором. То-есть будет одномерный массив в одномерном массиве.
 
Alexandr Sokolov:

вот ошибки при компиляции вашего кода


Это я код сокращал и Tf - просто  не заметил. Вопрос же принципиальный , почему элементы из статического массива не обрабатываются для расчета? 

Вот проверил, компиляция без ошибок))) Результат расчетов тот же - НОЛЬ !!!  массивы open[], close[] и тд - не так важно....

//+------------------------------------------------------------------+
//|                                                          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;
input double    CorrectorHL = 1.0;           //Корректор HL фильтрации размера свечи
input double    CorrectorOC = 1.0;           //Корректор OC фильтрации размера свечи
input color     ColorLines = clrLime;        //Цвет линий
input bool      Tf = false;
//----
int    limit=0,br=0,to_copy=0;
double corrHL,corrOC;
double averpips,averpipsHL,coeff;
double filterOC,filterHL,candle,candleHL;
double opn,hgh,lw,cls;
double Open[65],High[65],Low[65],Close[65];
double level_1,level_2,level_3;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"UP Period ");
   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(CorrectorHL<=0)
      corrHL=1;
   else
      corrHL=CorrectorHL;
   if(CorrectorOC<=0)
      corrOC=1;
   else
      corrOC=CorrectorOC;
//----
   if(nBars<0)
      to_copy=6;
   else
      to_copy=nBars;
      //+------------------------------------------------------------------+
//| Поиск события и установка меток  на графике                      |
//+------------------------------------------------------------------+
   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=0; 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);
         filterOC=averpips;
         filterHL=averpipsHL;
        }
     
     }
   Comment("indexmass  ",indexmass,"  Open ",Open[10],"  candle  ",candle,"  averpips ",averpips);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
Все ровно
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Это я код сокращал и Tf - просто  не заметил. Вопрос же принципиальный , почему элементы из статического массива не обрабатываются для расчета? 

Вот проверил, компиляция без ошибок))) Результат расчетов тот же - НОЛЬ !!!  массивы open[], close[] и тд - не так важно....

При компиляции не проверяются логические ошибки самого программиста - это на совести программиста остаётся, так как компилятор ещё пока не умеет читать мысли.

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

Тема "кривоватая", конечно (по MQL4 и MQL5), поэтому в начале вопроса не плохо бы было указывать к какой именно платформе адресуется вопрос )))

MQL4.

 
Artyom Trishkin:

При компиляции не проверяются логические ошибки самого программиста - это на совести программиста остаётся, так как компилятор ещё пока не умеет читать мысли.

мне принципиально искать причину где? в записи УЖЕ имеющегося кода или в коде НЕТ еще чего то для обработки статического массива?

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

мне принципиально искать причину где? в записи УЖЕ имеющегося кода или в коде НЕТ еще чего то для обработки статического массива?

Я не могу знать того , что не знаю... Поэтому прошу внешнего наблюдателя, с опытом, отметить  где я не знаю)))

оно и не доходит до расчётов


вот инициализация

input bool      Tf = false;


а вот проверочное условие

if(Tf==true)
 
Операции с базой SQLite доступны из тестера ? Я про добавление и изменение данных.
Причина обращения: