Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1168

 

Können Sie mir sagen, ob es möglich ist, eine Schleife durch Variablen mit folgenden Namen zu ziehen: L1, L2, L3 ... Ln, um in ein zweidimensionales Array zu schreiben.

Beispiel mit drei Variablen (in Wirklichkeit gibt es mehr Variablen, aber das ist zu umständlich):

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

DANKE für die Antwort. Vollständiger Code. Die Größe des statischen Arrays wurde erhöht. Nullkontrolleintrag in Operatoren entfernt... Allgemeiner "Dummy". Ich möchte immer noch nicht verstehen, WARUM es nicht als Zusatz zählt. Was steht jetzt nicht in meinem Code? Vielen Dank für die Tipps. Ich habe noch nicht mit statischen Arrays in mql5 gearbeitet.....

ICH HABE DEN CODE AKTUALISIERT. Die Frage ist dieselbe...

Beim Kompilieren Ihres Codes treten folgende Fehler auf


 
stepystr:

Können Sie mir sagen, ob es möglich ist, eine Schleife durch Variablen mit den Namen L1, L2, L3 ... Ln, um in ein zweidimensionales Array zu schreiben.

Beispiel mit drei Variablen (in Wirklichkeit gibt es mehr Variablen, es ist nur umständlich):

Natürlich ist das Thema "schief" (in MQL4 und MQL5), daher wäre es gut, die Plattform anzugeben, an die die Frage gerichtet ist ))))

 
stepystr:

Können Sie mir sagen, ob es möglich ist, eine Schleife durch Variablen mit folgenden Namen zu ziehen: L1, L2, L3 ... Ln, um in ein zweidimensionales Array zu schreiben.

Beispiel mit drei Variablen (in Wirklichkeit gibt es mehr Variablen, aber das ist zu umständlich):

Zunächst müssen wir uns für die Anzahl der Werte in der zweiten Dimension des zukünftigen Arrays entscheiden. Schon jetzt können wir sehen, dass die Anzahl der Elemente nicht gleich ist. Wahrscheinlich sollten wir die maximale Eins nehmen, und wo es überflüssige Einsen gibt, sollten wir sie z. B. mit Nullen oder -1 auffüllen. Und es kann nicht schaden, die erste Dimension vorher zu definieren, wenn sie bekannt ist. Und dann in der verschachtelten Schleife nehmen Sie L1 und schreiben alles, was Sie brauchen, in das Array, dann schreibt die zweite Iteration der äußeren Schleife alles in den nächsten Index in L2 und so weiter.


Und ganz richtig, es ist besser, sie in eine Struktur zu stecken.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Dann kann das Array die Dimension in der ersten und in der zweiten Dimension ändern. Das heißt, es wird ein eindimensionales Feld in einem eindimensionalen Feld sein.
 
Alexandr Sokolov:

Beim Kompilieren Ihres Codes treten folgende Fehler auf


Ich war es, der den Code und Tf gekürzt hat - ich habe es nur nicht bemerkt. Die grundsätzliche Frage ist, warum Elemente aus statischen Arrays nicht für die Berechnung verarbeitet werden.

Hier habe ich geprüft, Kompilierung ohne Fehler))) Das Ergebnis der Berechnung ist dasselbe - NULL !!! arrays open[], close[] etc - nicht so wichtig....

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

Ich habe den Code und Tf gekürzt - ich habe es nur nicht bemerkt. Die grundsätzliche Frage ist, warum Elemente aus statischen Arrays nicht für die Berechnung verarbeitet werden.

Hier habe ich geprüft, Kompilierung ohne Fehler))) Das Ergebnis der Berechnung ist dasselbe - NULL !!! arrays open[], close[] etc - nicht so wichtig....

Die Kompilierung prüft nicht auf logische Fehler des Programmierers selbst - dies bleibt dem Gewissen des Programmierers überlassen, denn der Compiler ist noch nicht in der Lage, Gedanken zu lesen.

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

Natürlich ist das Thema "schief" (in MQL4 und MQL5), so wäre es gut, die Plattform zu spezifizieren, an die die Frage gerichtet ist)))

MQL4.

 
Artyom Trishkin:

Die Kompilierung prüft nicht auf logische Fehler des Programmierers selbst - dies wird dem Gewissen des Programmierers überlassen, da der Compiler noch nicht in der Lage ist, Gedanken zu lesen.

Ich bin grundsätzlich auf der Suche nach dem Grund, wo? beim Schreiben der bestehenden Code oder gibt es etwas anderes in den Code, um die statische Array verarbeiten?

Ich kann nicht wissen, was ich nicht weiß... Deshalb bitte ich einen außenstehenden Beobachter mit Erfahrung, mir zu sagen, wo ich etwas nicht weiß)))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Bin ich in erster Linie auf der Suche nach dem Grund, wo? beim Schreiben von bestehenden Code oder gibt es etwas anderes in den Code, um das statische Array zu verarbeiten?

Ich kann nicht wissen, was ich nicht weiß... Ich bitte also einen außenstehenden Beobachter mit Erfahrung, mir zu sagen, wo ich nicht weiß)))

es kommt nicht zu den Berechnungen


Hier ist eine Initialisierung

input bool      Tf = false;


und hier ist eine Testbedingung

if(Tf==true)
 
Sind SQLite-Datenbankoperationen vom Tester aus verfügbar? Ich meine das Hinzufügen und Ändern von Daten.
Grund der Beschwerde: