Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1168

 

Pouvez-vous me dire s'il est possible de boucler sur des variables dont les noms sont : L1, L2, L3 ... Ln pour écrire dans un tableau à deux dimensions.

Exemple avec trois variables (en fait il y a plus de variables, c'est encombrant) :

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

MERCI pour la réponse. Code complet. Augmentation de la taille du tableau statique. Suppression de l'entrée du contrôle zéro dans les opérateurs... Un "mannequin" commun. J'essaie toujours de comprendre pourquoi ça ne s'ajoute pas. Que manque-t-il dans mon code maintenant ? Merci pour les conseils. Je n'ai pas encore travaillé avec des tableaux statiques dans mql5......

J'AI MIS À JOUR LE CODE. La question est la même...

voici les erreurs lors de la compilation de votre code


 
stepystr:

Pouvez-vous me dire s'il est possible de boucler sur des variables dont les noms sont : L1, L2, L3 ... Ln pour écrire dans un tableau à deux dimensions.

Exemple avec trois variables (en fait, il y a plus de variables, c'est encombrant) :

Bien sûr, le sujet est "tordu" (dans MQL4 et MQL5), il serait donc bon de préciser la plate-forme à laquelle la question est adressée )))).

 
stepystr:

Pouvez-vous me dire s'il est possible de boucler sur des variables dont les noms sont : L1, L2, L3 ... Ln pour écrire dans un tableau à deux dimensions.

Exemple avec trois variables (en fait il y a plus de variables, c'est encombrant) :

Tout d'abord, nous devons décider du nombre de valeurs dans la deuxième dimension du futur tableau. Nous pouvons déjà voir que le nombre d'éléments n'est pas égal. Il est probable que nous devrions prendre le maximum, et là où il y a des redondances, nous devrions les remplir avec des zéros ou -1, par exemple. Et cela ne ferait pas de mal de définir la première dimension au préalable si elle est connue. Ensuite, dans la boucle imbriquée, prenez L1 et écrivez tout ce dont vous avez besoin dans le tableau, puis la deuxième itération de la boucle externe écrit dans l'index suivant tout ce qui se trouve dans L2 et ainsi de suite.


Et à juste titre, il est préférable de le coller dans une structure.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Le tableau pourra alors changer de dimension dans la première et dans la deuxième dimension. C'est-à-dire qu'il s'agira d'un tableau unidimensionnel dans un tableau unidimensionnel.
 
Alexandr Sokolov:

voici les erreurs lors de la compilation de votre code


C'est moi qui ai raccourci le code et Tf - je ne l'ai juste pas remarqué. La question est fondamentale, pourquoi les éléments d'un tableau statique ne sont pas traités pour le calcul ?

Ici j'ai vérifié, compilation sans erreurs)))) Le résultat du calcul est le même - NULL ! !! tableaux open[], close[] etc - pas si important ....

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

Je raccourcissais le code et Tf - je ne l'avais pas remarqué. La question est fondamentale, pourquoi les éléments du tableau statique ne sont pas traités pour le calcul ?

Ici j'ai vérifié, compilation sans erreurs)))) Le résultat du calcul est le même - NULL ! !! tableaux open[], close[] etc - pas si important ....

La compilation ne vérifie pas les erreurs logiques du programmeur lui-même - ceci est laissé à la conscience du programmeur, car le compilateur n'est pas encore capable de lire dans les pensées.

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

Bien sûr, le sujet est "tordu" (dans MQL4 et MQL5), il serait donc bon de préciser la plateforme à laquelle la question est adressée))))

MQL4.

 
Artyom Trishkin:

La compilation ne vérifie pas les erreurs logiques du programmeur lui-même - ceci est laissé à la conscience du programmeur, car le compilateur n'est pas encore capable de lire dans les pensées.

Je cherche fondamentalement une raison où ? dans l'écriture du code existant ou y a-t-il quelque chose d'autre dans le code pour traiter un tableau statique?

Je ne peux pas savoir ce que je ne sais pas... Je demande donc à un observateur extérieur, ayant de l'expérience, de m'indiquer où je ne sais pas))).
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Est-ce que je cherche principalement la raison où ? dans l'écriture du code existant ou y a-t-il quelque chose d'autre dans le code pour traiter le tableau statique?

Je ne peux pas savoir ce que je ne sais pas... Je demande donc à un observateur extérieur ayant de l'expérience de me signaler les points que je ne connais pas))).

il n'arrive pas aux calculs.


voici une initialisation

input bool      Tf = false;


et voici une condition de test

if(Tf==true)
 
Les opérations sur la base de données SQLite sont-elles disponibles pour le testeur ? Je veux dire ajouter et modifier des données.