記事"MQL5 プログラミング基礎:配列"についてのディスカッション - ページ 3

 
Ernie Gunning:

MQLの英語版を試してみよう。


コードの投稿ありがとう。おかげで時間が節約できた。MQLの配列を使ってみたが、混乱した。あるはずの基本的な構造をもう一度書く必要があることにとても落ち込んでいたんだけど、君のコードを見つけたおかげで、配列とそれを動的に増加させる方法について研究する時間を節約できた。ありがとう。

恩返しができるといいな!以下のコードはすべてのデータ型で動作する。オブジェクトでも動作しますが、Contains(検索)メソッドは動作しないかもしれません。私がテストしたのはdouble, int, bool型だけです。文字列でも問題が発生する可能性があり、コードを拡張する必要があるかもしれません。



それなら、必要なすべての型に対してこのように宣言すればいい:




どなたかのお役に立てば幸いです。


どのようなデータ型にも動的配列を使うという私の提案は無視してください。すでに汎用的なCArrayListが宣言されています。このスレッドで解決されたオブジェクトを使用する問題に遭遇しました:https://www.mql5.com/en/forum/358432

Using CArrayList gives error
Using CArrayList gives error
  • 2020.12.20
  • www.mql5.com
Hi Guys, Thanks for your time. I'm struggling to use the CArrayList in the generics folder. Are these interfaces and classes complete...
 
私はすでにあなたの良い記事をいくつか読んでいる。この記事も例外ではなかった。
 

arrayResize()関数のエラーのようです。例では、配列の内容は1, 2, 3ではなく、通常のインデックスでは1, 1, 3です。この例を参照してください:

//+------------------------------------------------------------------+
//|false.mq5|。
//|著作権 2024, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケータ・バッファのマッピング
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数|
//+------------------------------------------------------------------+
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[])
  {
//---
   double ar[]; // 配列
ArrayResize(ar,2); // 配列を準備する
ar[0]=1; // 値を設定する
ar[1]=2; 
ArraySetAsSeries(ar,true); // インデックスの順序を変更する
ArrayResize(ar,3); // 配列のサイズを大きくする
ar[0]=3; // 新しい配列要素に値を設定する
Alert(ar[0]," ",ar[1]," ",ar[2]); // 配列の値を表示する
ArraySetAsSeries(ar,false);
Alert("Normal indexing: ", ar[0]," ",ar[1]," ",ar[2]); // 配列の値を表示する
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
arraySetAsSeries()関数を追加すると、arrayresieze関数の影響を受けるようです:
//+------------------------------------------------------------------+
//|エラーインデックスmq5
//|著作権 2024, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケータ・バッファのマッピング
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数|
//+------------------------------------------------------------------+
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[])
  {
//---
   double ar[]; // 配列
ArrayResize(ar,2); // 配列を準備する
ar[0]=9; // 値を設定する
ar[1]=8; 
ArrayResize(ar,6); // 配列のサイズを大きくする
Alert("Normal resize: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3], " ", ar[4], " ", ar[5]);
ArraySetAsSeries(ar,true); // インデックスの順序を変更する
ArrayResize(ar,4); // 配列のサイズを大きくする
ArraySetAsSeries(ar, false);
Alert("See the random element added: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]);
ArraySetAsSeries(ar,true); // インデックスの順序を変更する 0
ar[0]=8; // 新しい配列要素に値を設定する
Alert("Modify the first as serlies: ", ar[0]," ",ar[1]," ",ar[2]," ", ar[3]); // 配列の値を表示する
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+

ステップ

1. ar = {}
2. ar = {9, 8}.

3. ar = {9, 8, 0, 8, 0, 0}.

4.シリーズtrueとして設定:

ar = {0, 0, 8, 0, 8, 9}.

5.サイズを4に変更

ar = {0, 0, 8, 0}.

6.シリーズfalseに設定:

ar = {0, 8, 0, 0}.

7.シリーズtrueとして設定:

ar = {0, 0, 8, 0}.

8.最初の要素a[0]を修正する。

ar = {8, 0, 8, 0}.


配列のリサイズ(3~5)は値を取り、新しい位置にコピーします。私はこのように、最初にresize()し、次にsetasseries()することを好む:

//+------------------------------------------------------------------+
//|indexingarraytest.mq5
//|著作権 2024, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- インジケータ・バッファのマッピング
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数|
//+------------------------------------------------------------------+
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[])
  {
//---
   double ar[]; // 配列
ArrayResize(ar,2); // 配列を準備する
ar[0]=1; // 値を設定する
ar[1]=2;
ArrayResize(ar,3); // 配列のサイズを大きくする
Alert("Redimension to 3 normal: ", ar[0], " ", ar[1], " ", ar[2]); 
ArraySetAsSeries(ar,true); // インデックスの順序を変更する
Alert("Redimension to 3 series: ", ar[0], " ", ar[1], " ", ar[2]); 
ar[0]=8; // 新しい配列要素に値を設定する
Alert("Change the first element: ", ar[0]," ",ar[1]," ",ar[2]); // 配列の値を表示する
ArraySetAsSeries(ar, false);
Alert("Normal renew: ", ar[0]," ",ar[1]," ",ar[2]); // 配列の値を表示する
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+