MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1168

 

L1, L2, L3 ...という名前の変数をループさせることが可能かどうか教えてください。Lnで2次元配列に書き込む。

3つの変数を使った例(実際はもっと変数がある、面倒くさい)。

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

返信ありがとうございました。フルコードです。静的配列のサイズを拡大しました。演算子のゼロ制御の項目を削除しました...共通の「ダミー」。まだ、足し算をしない理由を理解したい。今、私のコードにないものは何ですか?ヒントをありがとうございました。mql5ではまだ静的 配列を扱ったことがないのですが......。

コードを更新しました。質問は同じ...

以下は、コンパイル時のエラーです。


 
stepystr:

L1, L2, L3 ...という名前の変数をループさせることが可能かどうか教えてください。Lnで2次元配列に書き込む。

3つの変数を使った例(実際はもっと変数があり、面倒です)。

もちろん、話題は「曲者」(MQL4とMQL5で)なので、質問先のプラットフォームを指定するのが良いと思います ))))

 
stepystr:

L1, L2, L3 ...という名前の変数をループさせることが可能かどうか教えてください。Lnで2次元配列に書き込む。

3つの変数を使った例(実際はもっと変数がある、面倒くさい)。

まず、未来配列の2次元目の値の数を決める必要があります。すでに今、要素の数が等しくないことがわかります。おそらく、最大値を取り、冗長な部分はゼロや-1などで埋めればよいのでしょう。また、1次元がわかっている場合は、あらかじめ定義しておいても損はないでしょう。そして、入れ子ループでL1を取り、必要なものをすべて配列に書き込み、外側のループの2回目の繰り返しでL2のすべてを次のインデックスに書き込む、といった具合です。


そして、まったく正しく、構造にこだわったほうがいいのです。

 struct name
   {
    double L1[];
    double L2[];
    double Ln[];
   }arr[];
そうすると,配列は1次元と2次元の次元を変更できるようになります.つまり、1次元配列の中の1次元配列になる。
 
Alexandr Sokolov:

以下は、コンパイル時のエラーです。


コードを短縮したのは私であり、Tf-は私が気づかなかっただけです。根本的な疑問なのですが、なぜ静的配列の 要素は計算処理されないのでしょうか?

ここで、確認したところ、エラーなくコンパイルできました)))計算結果は同じ - NULL !!! 配列 open[], close[] などはあまり重要ではありませんが......。

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

コードを短縮したのは私であり、Tf-は私が気づかなかっただけです。根本的な疑問なのですが、なぜ静的配列の 要素は計算処理されないのでしょうか?

ここで確認したところ、エラーなくコンパイルできました)))計算結果は同じ - NULL !!! 配列 open[], close[] などはあまり重要ではありませんが......。

コンパイルは、プログラマー自身の論理的な誤りをチェックしない。これは、プログラマーの良心に任されており、コンパイラーはまだ心を読むことができないからだ。

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

もちろん、話題は「曲者」(MQL4とMQL5で)なので、質問先のプラットフォームを指定するのが良いと思います)))

MQL4です。

 
Artyom Trishkin:

コンパイラはまだ心を読むことができないので、プログラマ自身の論理的な誤りをチェックすることはありません。これはプログラマの良心に任されています。

私は根本的に理由を探していますどこに?既存のコードを書くことで、または静的な配列を 処理するために、コード内の他の何かがあるのだろうか?

わからないものはわからない...。だから、経験のある外部の人に、わからないところを指摘してもらうのです)))
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Допускается объявление не более чем 4-мерного массива. При объявлении динамического массива (массива с неуказанным значением в первой паре квадратных скобок) компилятор автоматически создает переменную указанной выше структуры (объект динамического массива) и обеспечивает код для правильной инициализации.   Статические массивы При явном...
 
kopeyka2:

というのは、既存のコードを書く上で、あるいは、静的配列を 処理するコードの中で、何か別のものがあるのでしょうか?

わからないものはわからない...。だから、経験のある外部の方に、わからないところを指摘してもらうのです)))

計算までいかない。


以下は初期化です。

input bool      Tf = false;


で、以下がテスト条件です。

if(Tf==true)
 
SQLiteのデータベース 操作はテスターから可能ですか?データの追加や変更という意味です。