Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1168

 

¿Me pueden decir si es posible hacer un bucle a través de las variables con nombres: L1, L2, L3 ... Ln para escribir en una matriz bidimensional.

Ejemplo con tres variables (en realidad hay más variables, es engorroso):

//+------------------------------------------------------------------+
//|                                                            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:

GRACIAS por la respuesta. Código completo. Aumento del tamaño de la matriz estática. Eliminada la entrada de control cero en los operadores... Un "tonto" común. Todavía estoy tratando de averiguar por qué no está añadiendo. ¿Qué no hay en mi código ahora? Gracias por los consejos. Todavía no he trabajado con arrays estáticos en mql5.....

HE ACTUALIZADO EL CÓDIGO. La pregunta es la misma...

aquí hay errores al compilar su código


 
stepystr:

¿Me pueden decir si es posible hacer un bucle a través de las variables con nombres: L1, L2, L3 ... Ln para escribir en una matriz bidimensional.

Ejemplo con tres variables (de hecho, hay más variables, es engorroso):

Por supuesto, el tema está "torcido" (en MQL4 y MQL5), por lo que sería bueno especificar la plataforma a la que se dirige la pregunta ))))

 
stepystr:

¿Me pueden decir si es posible hacer un bucle a través de las variables con nombres: L1, L2, L3 ... Ln para escribir en un array bidimensional.

Ejemplo con tres variables (de hecho hay más variables, es engorroso):

En primer lugar, tenemos que decidir el número de valores en la segunda dimensión de la futura matriz. Ya ahora podemos ver que el número de elementos no es igual. Probablemente, deberíamos tomar el máximo uno, y donde haya unos redundantes deberíamos rellenar con ceros o -1, por ejemplo. Y no estaría de más definir de antemano la primera dimensión si se conoce. Y luego en el bucle anidado toma L1 y escribe todo lo que necesita en el array, luego la segunda iteración del bucle exterior escribe en el siguiente índice todo lo que hay en L2 y así sucesivamente.


Y muy correctamente, es mejor meterlo en una estructura.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Entonces el array podrá cambiar de dimensión en la primera y en la segunda dimensión. Es decir, será un array unidimensional en un array unidimensional.
 
Alexandr Sokolov:

aquí hay errores al compilar su código


Fui yo quien acortó el código y Tf - no me di cuenta. La pregunta es fundamental, ¿por qué los elementos de la matriz estática no se procesan para el cálculo?

Aquí he comprobado, la compilación sin errores))) El resultado del cálculo es el mismo - ¡¡¡NULL!!! arrays open[], close[] etc - no es tan importante....

//+------------------------------------------------------------------+
//|                                                          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);
  }
Incluso.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Estaba acortando el código y Tf - no me di cuenta. La pregunta es fundamental, ¿por qué los elementos de la matriz estática no se procesan para el cálculo?

Aquí lo he comprobado, compilación sin errores))) El resultado del cálculo es el mismo - ¡¡¡NULL!!! arrays open[], close[] etc - no tan importante....

La compilación no comprueba los errores lógicos del propio programador - esto se deja a la conciencia del programador, porque el compilador aún no es capaz de leer la mente.

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

Por supuesto, el tema está "torcido" (en MQL4 y MQL5), por lo que sería bueno especificar la plataforma a la que se dirige la pregunta))

MQL4.

 
Artyom Trishkin:

La compilación no comprueba los errores lógicos del propio programador - esto se deja a la conciencia del programador, porque el compilador aún no es capaz de leer la mente.

Fundamentalmente estoy buscando una razón donde? en la escritura de código existente o hay algo más en el código para procesar una matriz estática?

No puedo saber lo que no sé... Así que pido a un observador externo, con experiencia, que me señale dónde no sé))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

¿estoy buscando principalmente la razón donde? en la escritura del código existente o hay algo más en el código para procesar la matriz estática?

No puedo saber lo que no sé... Así que le pido a un observador externo con experiencia que me indique dónde no sé))

no llega a los cálculos


aquí hay una inicialización

input bool      Tf = false;


y aquí hay una condición de prueba

if(Tf==true)
 
¿Están disponibles las operaciones de la base de datos SQLite en el probador? Me refiero a añadir y modificar datos.