Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1168

 

Potete dirmi se è possibile fare un ciclo attraverso variabili con nomi: L1, L2, L3 ... Ln per scrivere in una matrice bidimensionale.

Esempio con tre variabili (in realtà ci sono più variabili, è ingombrante):

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

GRAZIE per la risposta. Codice completo. Aumento della dimensione dell'array statico. Rimossa la voce di controllo zero negli operatori... Comune "manichino". Sto ancora cercando di capire perché non si aggiunge. Cosa non c'è nel mio codice ora? Grazie per i suggerimenti. Non ho ancora lavorato con gli array statici in mql5.....

HO AGGIORNATO IL CODICE. La domanda è la stessa...

ecco gli errori durante la compilazione del tuo codice


 
stepystr:

Potete dirmi se è possibile fare un ciclo attraverso variabili con nomi: L1, L2, L3 ... Ln per scrivere in una matrice bidimensionale.

Esempio con tre variabili (in realtà, ci sono più variabili, è ingombrante):

Naturalmente, l'argomento è "storto" (in MQL4 e MQL5), quindi sarebbe bene specificare la piattaforma a cui è rivolta la domanda ))))

 
stepystr:

Potete dirmi se è possibile fare un ciclo attraverso variabili con nomi: L1, L2, L3 ... Ln per scrivere in una matrice bidimensionale.

Esempio con tre variabili (in realtà ci sono più variabili, è ingombrante):

Per prima cosa, dobbiamo decidere il numero di valori nella seconda dimensione della futura matrice. Già ora possiamo vedere che il numero di elementi non è uguale. Probabilmente, dovremmo prendere il massimo, e dove ci sono quelli ridondanti dovremmo riempire con zeri o -1, per esempio. E non sarebbe male definire in anticipo la prima dimensione, se è nota. E poi nel ciclo annidato prendete L1 e scrivete tutto ciò che vi serve nell'array, poi la seconda iterazione del ciclo esterno scrive nell'indice successivo tutto ciò che è in L2 e così via.


E, giustamente, è meglio infilarlo in una struttura.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Allora l'array potrà cambiare dimensione nella prima e nella seconda dimensione. Cioè, sarà un array unidimensionale in un array unidimensionale.
 
Alexandr Sokolov:

ecco gli errori durante la compilazione del tuo codice


Sono stato io ad accorciare il codice e Tf - semplicemente non me ne sono accorto. La domanda è fondamentale, perché gli elementi dell'array statico non vengono elaborati per il calcolo?

Qui ho controllato, compilazione senza errori))) Il risultato del calcolo è lo stesso - NULL !!! array open[], close[] ecc - non così 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);
  }
E' pari.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Stavo accorciando il codice e Tf - non me ne sono accorto. La domanda è fondamentale, perché gli elementi dell'array statico non vengono elaborati per il calcolo?

Qui ho controllato, compilazione senza errori))) Il risultato del calcolo è lo stesso - NULL !!! array open[], close[] ecc - non così importante....

La compilazione non controlla gli errori logici del programmatore stesso - questo è lasciato alla coscienza del programmatore, perché il compilatore non è ancora in grado di leggere la mente.

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

Naturalmente, l'argomento è "storto" (in MQL4 e MQL5), quindi sarebbe bene specificare la piattaforma a cui è rivolta la domanda)))

MQL4.

 
Artyom Trishkin:

La compilazione non controlla gli errori logici del programmatore stesso - questo è lasciato alla coscienza del programmatore, perché il compilatore non è ancora in grado di leggere la mente.

Sto fondamentalmente cercando la ragione dove? nella scrittura del codice esistente o c'è qualcos'altro nel codice per elaborare l'array statico?

Non posso sapere quello che non so... Quindi chiedo a un osservatore esterno, con esperienza, di indicare dove non so)))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Sto principalmente cercando la ragione dove? nella scrittura del codice esistente o c'è qualcos'altro nel codice per elaborare l'array statico?

Non posso sapere quello che non so... Quindi chiedo a un osservatore esterno con esperienza di indicare dove non so)))

non arriva ai calcoli.


ecco un'inizializzazione

input bool      Tf = false;


ed ecco una condizione di prova

if(Tf==true)
 
Le operazioni su database SQLite sono disponibili dal tester? Intendo aggiungere e cambiare i dati.