Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1168

 

Você pode me dizer se é possível fazer loop através de variáveis com nomes: L1, L2, L3 ... Ln para escrever para uma matriz bidimensional.

Exemplo com três variáveis (na verdade, há mais variáveis, é complicado):

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

OBRIGADO pela resposta. Código completo. Aumento do tamanho da matriz estática. Removida a entrada de controle zero nos operadores. "boneco" comum. Ainda estou tentando descobrir POR QUE não está acrescentando. O que não está no meu código agora? Obrigado pelas dicas. Ainda não trabalhei com arrays estáticos em mql5.....

ATUALIZEI O CÓDIGO. A questão é a mesma...

aqui estão os erros na compilação de seu código


 
stepystr:

Você pode me dizer se é possível fazer loop através de variáveis com nomes: L1, L2, L3 ... Ln para escrever para uma matriz bidimensional.

Exemplo com três variáveis (de fato, há mais variáveis, é incômodo):

Naturalmente, o tópico é "torto" (em MQL4 e MQL5), por isso seria bom especificar a plataforma à qual a pergunta é dirigida ))))

 
stepystr:

Você pode me dizer se é possível fazer loop através de variáveis com nomes: L1, L2, L3 ... Ln para escrever para uma matriz bidimensional.

Exemplo com três variáveis (na verdade, há mais variáveis, é complicado):

Primeiro, precisamos decidir sobre o número de valores na segunda dimensão da futura matriz. Já podemos ver agora que o número de elementos não é igual. Provavelmente, devemos tomar o máximo de um, e onde houver redundantes, devemos preencher com zeros ou -1, por exemplo. E não faria mal definir a primeira dimensão de antemão se ela for conhecida. E então, no laço aninhado, pegue L1 e escreva tudo o que você precisa na matriz, depois a segunda iteração do laço externo escreve no próximo índice tudo em L2 e assim por diante.


E, muito corretamente, é melhor colá-lo em uma estrutura.

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
Então a matriz será capaz de mudar de dimensão na primeira e na segunda dimensão. Ou seja, será uma matriz unidimensional em uma matriz unidimensional.
 
Alexandr Sokolov:

aqui estão os erros na compilação de seu código


Fui eu quem encurtou o código e Tf - eu simplesmente não notei isso. A questão é fundamental, por que os elementos da matriz estática não são processados para cálculo?

Aqui eu verifiquei, compilação sem erros)))) O resultado do cálculo é o mesmo - NULL !!! arrays open[], close[] etc - not so 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);
  }
Está quites.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

Eu estava encurtando o código e Tf - eu simplesmente não notei isso. A questão é fundamental, por que os elementos da matriz estática não são processados para cálculo?

Aqui eu verifiquei, compilação sem erros)))) O resultado do cálculo é o mesmo - NULL !!! arrays open[], close[] etc - not so important....

A compilação não verifica erros lógicos do próprio programador - isto é deixado à consciência do programador, pois o compilador ainda não é capaz de ler mentes.

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

Claro, o tópico é "torto" (em MQL4 e MQL5), então seria bom especificar a plataforma à qual a pergunta é dirigida))))

MQL4.

 
Artyom Trishkin:

A compilação não verifica erros lógicos do próprio programador - isto é deixado à consciência do programador, porque o compilador ainda não é capaz de ler mentes.

Estou fundamentalmente procurando uma razão onde? por escrito o código existente ou há algo mais no código para processar uma matriz estática?

Não posso saber o que não sei... Então eu peço a um observador externo, com experiência, para apontar onde eu não sei))))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

estou procurando principalmente a razão onde? por escrito o código existente ou há algo mais no código para processar a matriz estática?

Não posso saber o que não sei... Então estou pedindo a um observador externo com experiência para apontar onde eu não sei))))

não chega aos cálculos.


aqui está uma inicialização

input bool      Tf = false;


e aqui está uma condição de teste

if(Tf==true)
 
As operações do banco de dados SQLite estão disponíveis através do testador? Refiro-me à adição e mudança de dados.
Razão: