English Deutsch
preview
MQL5入門(第5部):MQL5における配列関数の入門ガイド

MQL5入門(第5部):MQL5における配列関数の入門ガイド

MetaTrader 5トレーディング | 20 5月 2024, 10:31
88 0
Israel Pelumi Abioye
Israel Pelumi Abioye

はじめに

連載第5部では、配列関数の複雑さをやさしく学びたい全くの初心者向けに、MQL5の魅力的な世界をご紹介します。このセクションでは、配列関数に関連するありがちな誤解を解き、コードの各行がわかるだけでなく徹底的に理解されるようにすることを目的としています。私は、コーディングの経験の有無にかかわらず、すべての人がMQL5言語について学ぶ機会を持つべきだと心から信じています。だからこそ、私は常にインクルーシブな環境を作ることに尽力していきます。

この記事では、シンプルさと明快さが第一のテーマです。コーディングやその未知の領域について好奇心旺盛な方々のパイプ役になりたいのです。最初は戸惑うかもしれませんが、楽しみながら学べるように、各配列関数を1行ずつ説明していくつもりです。共に、配列関数にまつわる謎を解き明かし、複雑なアルゴリズム取引の世界をうまく切り抜けるために必要な知識を身につけましょう。これは単なる記事ではありません。コーディング変革の素晴らしい旅への招待状なのです。 

そして、それだけではありません。私は、コードだけでなく、初心者とベテランのプログラマーが集まり、アイデアを交換し、質問を投げかけ、チームワークを促進できるようなコミュニティを作りたいと考えています。これは人生を変えるコーディングの冒険への招待状です。単なる記事ではありません。第5部からのご挨拶です。ここでは、知識とアクセシビリティがぶつかり合い、コードを書くすべての人に感謝されます。コーディングを楽しみましょう。

この記事では、以下の配列関数を取り上げます。

  • ArrayBsearch
  • ArrayResize
  • ArrayCopy
  • ArrayCompare
  • ArrayFree
  • ArraySetAsSeries
  • ArrayGetAsSeries
  • ArrayIsSeries
  • ArrayInitialize
  • ArrayFill
  • ArrayIsDynamic
  • ArrayMaximum
  • ArrayMinimum

第5部に入る前に、第4部で学んだことをまとめたビデオを紹介します。これは、すべての人に状況を知ってもらうためのまとめです。これからも、MQL5配列を全くの初心者にも理解しやすいものにしながら、協力的で知識を共有できるコミュニティを築いていきましょう。私と一緒にコーディングの旅に出かけましょう。




1.ArrayBsearch

ArrayBsearch()関数は、昇順に配列された配列に対して使用することができます。これは、配列の値を小さいものから大きいものへと昇順に並び替えることを示唆しています。この関数は二分探索の手法を採用しており、並び替えられた配列に対しては確実に結果を返しますが、並び替えられていない配列やランダムに並べられた配列に対してはうまく動作しないことがあります。したがって、効果的で正確な検索をおこなうには、ArrayBsearch()を使用する前に、配列が正しく並び替えられていることを確認する必要があります。

たとえ

小さいものから大きいものへと特定の順序で並べ替えられた数字の集合があるとします。この並べ替えられたリストから、特定の数字、たとえば30を検索するとします。手作業でひとつひとつの数字を調べるのではなく、ArrayBsearch()関数はスマートアドバイザーとして機能します。リストの2(インデックス2)の位置に30があることを知らせ、適切な場所に素早く誘導します。まるで、あなたの捜索を几帳面に早めてくれる親切な友人がいるようなものです。

構文

int ArrayBsearch(array[],value);

説明

  • int: 関数が返すデータ型です。この場合は整数で、配列の中で見つかった値のインデックス、または提案された値の位置を表します。
  • ArrayBsearch: 関数の名前
  • array[]: 検索対象の配列
  • value: 配列から検索する値

void OnStart()
  {

// Declare an array of sorted numbers
   double sortedArray[] = {10, 20, 30, 40, 50};

// Value to search for
   double searchValue = 30;

// Call ArrayBsearch function
   int resultIndex = ArrayBsearch(sortedArray, searchValue);

// Print out the index of 30 in the array
   Print("Found the resultIndex at index ", resultIndex); // The output will be index 2

  }

説明

double sortedArray[] = {10, 20, 30, 40, 50};

  • 並び替えられた数{10, 20, 30, 40, 50}を含む sortedArrayという名前の配列を宣言します。

double searchValue = 30;

  • searchValueに配列から探したい数値である30を設定します。

  int resultIndex = ArrayBsearch(sortedArray, searchValue);

  • 引数としてsortedArrayとsearchValueを渡して、ArrayBsearch()関数を呼び出します。searchValueが見つかったインデックスを返し、値が存在しない場合は挿入候補を返します。

Print("Found the resultIndex at index ", resultIndex);

  • 検索結果を表示します。searchValueが見つかればインデックスを表示し、見つからなければ挿入候補を表示します。

この例では、sortedArrayが検索対象の配列で、searchValueが配列から探したい値です。この関数は、値が見つかったインデックスを返し、その結果を表示します。


2. ArrayResize

MQL5のArrayResize()関数を使用すると、プログラムの実行中に動的配列のサイズを変更できます。サイズが事前に決定されている静的配列とは対照的に、動的配列ではプログラム実行中にサイズを調整することができます。言い換えれば、ArrayResize()は、プログラムの実行中に、その瞬間のニーズに応じて動的配列のサイズ変更や拡張を可能にするツールです。これにより、ランタイム中のデータをより効果的に扱う柔軟性が増します。

プログラミングの静的配列のサイズは固定で、プログラムのコンパイル段階で設定されます。サイズが固定されており、実行時に変更できないため、要素数は一定に保たれます。これらの配列に割り当てられるメモリは、宣言されたサイズによって決まります。例えば、5つの要素を持つ配列は、常に5つの要素のためのスペースを持っています。

// Static array declaration
int staticArray[5] = {1, 2, 3, 4, 5};

逆に動的配列は、プログラム実行中にサイズを調整したり決定したりできるので、柔軟性があります。これらの配列は最初はサイズなしで宣言されます。MQL5では、ArrayResize()のような関数を使用してメモリ割り当てを変更することができます。プログラムの実行中に必要に応じて異なる要素数に対応できるように、データ構造体のサイズを柔軟に変更する必要がある場合は、動的配列が特に役立ちます。

// Dynamic array declaration
int dynamicArray[];

たとえ

たくさんのおもちゃ(要素)が入った魔法のリュック(配列)があるとします。冒険の旅に出るとき、静的リュックが収納できるおもちゃの数を選択することができ、道中ずっとその状態を保つことができます。収納しきれないほどのおもちゃを持ち運ぼうとすると大変なことになります。

動的リュックは、追加のおもちゃや友達と共有したいおもちゃに合わせて大きくできる特別なものと考えることができます。リュックのサイズを変更し、魔法の冒険に必要なだけのおもちゃを持ち運ぶには、呪文を唱えるようにArrayResize()を使用します。

動的リュックのサイズは外出先で変更できるので、それに限られることはありません。この順応性により、新しいおもちゃを見つけたり、他の人と分け合ったりと、魔法の旅は常に驚きと興奮に満ちたものになります。これは、配列に要素を増やす準備をしてもらったりスペースを作ってもらうようなものです。プログラム実行中におこなわれるこの動的な調整は、多用途性と柔軟性を提供し、初期サイズが不明な配列にとって貴重なツールとなります。

構文

ArrayResize
(
    array[],          // Reference to the array to be resized
    new_size,         // New size for the array
    reserve_size = 0  // Optional space reserved for future elements
);

パラメータ

  • Array[]: サイズ変更したいおもちゃ箱(配列)
  • new_size: 今ボックスに入れたいおもちゃ(要素)の数です。おもちゃが5個あって、10個分のスペースが欲しかったら、new_sizeは10になります。
  •  reserve_size = 0: 時には、再度サイズ変更することなく、将来さらに多くのおもちゃを入れるスペースを確保したいと思うかもしれません。reserve_sizeは、もっとおもちゃを入れられるように準備するようなものです。

void OnStart()
  {

// Dynamic array declaration
   int dynamicArray[];

// Resizing the dynamic array to have 5 elements
   ArrayResize(dynamicArray, 5);

// Assigning values to dynamic array elements
   dynamicArray[0] = 10;
   dynamicArray[1] = 20;
   dynamicArray[2] = 30;
   dynamicArray[3] = 40;
   dynamicArray[4] = 50; 

// Accessing elements in a dynamic array
   Print("Element at index 2: ", dynamicArray[2]); // Output: 30

// Resizing the dynamic array to have 8 elements
   ArrayResize(dynamicArray, 8);

// Assigning values to the additional elements
   dynamicArray[5] = 60;
   dynamicArray[6] = 70;
   dynamicArray[7] = 80;

// Accessing elements after resizing
   Print("Element at index 6: ", dynamicArray[6]); // Output: 70

  }

説明

動的配列宣言

int dynamicArray[];

  • ここでは、初期サイズを指定せずにdynamicArray()という動的配列を宣言します。

動的配列のサイズを5要素に変更する

ArrayResize(dynamicArray, 5);

  • ArrayResize()関数を使用して、動的配列のサイズを5要素に設定します。

動的配列要素への値の割り当て

dynamicArray[0] = 10;
dynamicArray[1] = 20;
dynamicArray[2] = 30;
dynamicArray[3] = 40;
dynamicArray[4] = 50;

  • 値は動的配列の個々の要素に割り当てられます。

動的配列の要素へのアクセス

Print("Element at index 2: ", dynamicArray[2]); // Output: 30

  • Print関数は、動的配列のインデックス2の値を表示するために使用されます。この場合、「30」と表示されます。

動的配列のサイズを8要素に変更する

ArrayResize(dynamicArray, 8);

  • 動的配列は再び8要素にサイズ変更され、前回のサイズ変更時の値が保持されます。

追加要素に値を割り当てる

dynamicArray[5] = 60;
dynamicArray[6] = 70;
dynamicArray[7] = 80;

  • サイズ変更後に新しく追加された要素には、追加の値が割り当てられます。

サイズ変更後の要素へのアクセス

Print("Element at index 6: ", dynamicArray[6]); // Output: 70

  • Print関数は、2回目のサイズ変更後に動的配列のインデックス6の値を表示するために使用されます。この場合、「70」と出力されます。

3. ArrayCopy

MQL5では、配列間の要素の複製にArrayCopy()関数を使用します。配列の特定の範囲で定義された部分を、選択的に別の配列に複製することができます。この関数を使用すると、配列内のデータの管理や配置が簡単になり、特定の要素を取り出して配列間で移動させることが容易になります。

たとえ

2つのリストがあり、最初のリストから2番目のリストへ正確にコピーしたい項目があるとします。ここでMQL5のArrayCopy()関数が役立ちます。ArrayCopy()関数はコピーアシスタントとして機能し、配列から特定の項目を選択して別のリストにきれいにコピーすることができます。

より具体的な例を挙げます。5つの異なる商品の価格を含む配列があり、特定の3つの商品の価格だけを含む2番目の配列を作成したいとします。ArrayCopy()関数を使えば、元の配列を維持したまま、これら3つの価格だけをきれいに取り出して新しい配列に複製することができます。これは、あるコレクションから別のコレクションへの項目のコピーや選択を簡単にし、配列操作タスクの効率と整理を向上させる便利なツールがあるのと似ています。

構文

ArrayCopy( 
          dst_array[],         // The destination array to receive copied elements 
          src_array[],         // The source array from which elements will be copied
          dst_start=0,         // The index in the destination array to start writing from  
          src_start=0,         // The index in the source array from which to start copying 
          count                // The number of elements to copy; default is to copy the entire array
);

この強力なコマンドを使えば、配列を正確かつコントロールしながら巧みに結合することができます。この魅惑的なプロセスにおいて、dst_arrayは要素のコピー先として機能し、src_arrayは要素のコピー元として機能します。dst_start、src_start、countなどの追加パラメータは、結合操作を細かく調整する柔軟性を提供します。MQL5プログラミングの魅惑的な領域で、配列の完璧な融合を編成するコマンドを作ることだと考えてください。

void OnStart()
  {

// Declare two dynamic arrays
   int sourceArray[];
   int destinationArray[];

// Resizing the dynamic arrays to have 5 elements each
   ArrayResize(sourceArray,5);
   ArrayResize(destinationArray,5);

// Assigning values to dynamic array elements
   sourceArray[0] = 1;
   sourceArray[1] = 2;
   sourceArray[2] = 3;
   sourceArray[3] = 4;
   sourceArray[4] = 5;

   destinationArray[0] = 10;
   destinationArray[1] = 20;
   destinationArray[2] = 30;
   destinationArray[3] = 40;
   destinationArray[4] = 50;

// Copy elements from sourceArray to destinationArray starting from index 1
   ArrayCopy(destinationArray, sourceArray, 5, 0, WHOLE_ARRAY);

// Print the value of the element at index 7 in destinationArray
   Comment("Value at index 7 in destinationArray: ", destinationArray[7]);

  }

説明

配列の宣言

int sourceArray[];
int destinationArray[];

  • ここでは、sourceArrayと destinationArrayという2つの動的配列を宣言します。
配列のサイズ変更
ArrayResize(sourceArray, 5);
ArrayResize(destinationArray, 5);
  • ArrayResize()関数は、動的配列のサイズを設定するために使用されます。この場合、両方の配列はそれぞれ5つの要素を持つようにサイズ変更されます。
値の割り当て
sourceArray[0] = 1;
sourceArray[1] = 2;
sourceArray[2] = 3;
sourceArray[3] = 4;
sourceArray[4] = 5;

destinationArray[0] = 10;
destinationArray[1] = 20;
destinationArray[2] = 30;
destinationArray[3] = 40;
destinationArray[4] = 50;
  • 値はsourceArrayとdestinationArrayの個々の要素に割り当てられます。

配列コピー

ArrayCopy(destinationArray, sourceArray, 5, 0, WHOLE_ARRAY);
  • ArrayCopy()関数は、sourceArrayからdestinationArrayに要素をコピーするために使用されます。インデックス0から始まる5つの要素をコピーすることを指定します。
値の出力
Comment("Value at index 7 in destinationArray: ", destinationArray[7]);
  • コメントが出力され、destinationArrayのインデックス7の値が表示されます。

このコードの全体的な目的は、sourceArrayからdestinationArrayへ特定のインデックスから始まる要素をコピーすることで、ArrayCopy()関数を実証することです。最後の行は、コピーが成功したことを確認するためにdestinationArrayの要素の値を表示します。


4. ArrayCompare

MQL5のArrayCompare()関数は、2つの配列を比較し、その要素を体系的に評価するためのツールです。両配列の先頭(インデックス0)から比較を開始し、対応するインデックスの要素が等しいかどうかを確認します。すべての要素が一致すれば、配列は等しいとみなされます。しかし、任意のインデックスで不一致が生じた場合、この関数はどちらの配列が数値的に大きい要素を保持しているかを評価し、両者の関係を決定するための基礎を提供します。この関数は、配列間の内容の類似性や非類似性を測るのに特に便利です。

たとえ

2つの数字のリストがあるシナリオを思い浮かべてください。リストAとリストBです。ArrayCompare()は、一種の特殊な調査官として機能し、これらのリストを分析し、その関係を知らせてくれます。両リストの先頭の数字から始めて、調査員は両者を比較します。数字の不一致を検出すると、どちらのリストが「大きい」か「小さい」かを即座に判断します。両方のリストを確認し、異常がなければ「等しい」と判断します。

 

現在、この探偵はユニークな方法で調査結果を報告しています。

  • リストAがリストBより小さいとみなされた場合、-1と報告
  • 両方のリストが等しいとみなされた場合、0と報告
  • リストAがリストBより大きいと見なされた場合、1と報告
  • 調査中に混乱や問題があれば、-2と報告

つまりArrayCompare()は、探偵が事件の犯人を突き止めるように、2つの数字のリストの関係を理解するのに役立つのです。

構文

int ArrayCompare(const void& array1[], const void& array2[], int start1 = 0, int start2 = 0, int count = WHOLE_ARRAY);

パラメータ

  • array1[]:最初の配列
  •  array2[]:2番目の配列
  • start1:比較を開始する最初の配列における、最初の要素のインデックス(デフォルトは0)
  • start2:比較を開始する2番目の配列における、最初の要素のインデックス(デフォルトは0)
  • count:比較する要素の数(デフォルトでは、両方の配列のすべての要を比較(count = WHOLE_ARRAY))

void OnStart()
  {

// Declare two arrays
   int ListA[] = {1, 2, 3, 4, 5};
   int ListB[] = {1, 2, 3, 4, 6};
// Use ArrayCompare to compare the arrays
   int result = ArrayCompare(ListA, ListB, 0, 0, WHOLE_ARRAY);  
// Print the result
   if(result == -1)
      {
      Print("ListA is less than ListB");
      }
   else if(result == 0)
      {
      Print("ListA is equal to ListB");
      }
   else if(result == 1)
      {
      Print("ListA is greater than ListB");
      }
    else if(result == -2)
      {
       Print("Error: Incompatible arrays or invalid parameters");
      }

  }

説明

int ListA[] = {1, 2, 3, 4, 5};

  • ListAという名前の整数配列を宣言し、値1、2、3、4、5で初期化します。

int ListB[] = {1, 2, 3, 4, 6};

  • ListBという名前の整数配列を宣言し、値1、2、3、4、6で初期化します。

int result = ArrayCompare(ListA, ListB, 0, 0, WHOLE_ARRAY);

  • ArrayCompare()関数を使用して、配列ListAとListBを比較します。比較は両方の配列のインデックス0から始まり、配列全体が比較されます。

条件文(if、else if)は、結果変数の値を確認し、比較結果に基づいてメッセージを表示します。

  • resultが-1であれば、ListAはListBより小さい
  • resultが0であれば、ListAとListBは等しい
  • resultが1であれば、ListAはListBより大きい
  • resultが-2であれば、互換性のない配列または無効なパラメータによるエラーを示す

以下の配列

int ListA[] = {1, 2, 3, 4, 5};
int ListB[] = {1, 2, 3, 4, 6};

において、ArrayCompare(ListA、ListB、0、0、WHOLE_ARRAY)の結果は-1です。

説明

  • 比較は両配列の最初の要素(インデックス0)から始まる
  • インデックス0から3の要素は、どちらの配列でも同じ
  • インデックス4の時点で、リストAには5があり、リストBには6がある
  • 5<6なので、リストAはリストBより小さいとみなされる

したがって、結果は-1となります。ListAとListBの値を自由に変更して、比較結果がどのように変わるかをご自分でご覧ください。


5. ArrayFree

MQL5では、ArrayFree()を呼び出すことは、動的配列のリセットボタンを押すことに似ています。配列を、さまざまな物の入れ物として考えてみましょう。これは、ArrayFree()を使用するときに、コンテナを空にして新しい物を入れる準備をするのと似ています。古くなった情報を取り除くことで、新しいデータのためのスペースを確保する手段なのです。別の言い方をすれば、次に何が起こるかわからないから、中身を消去するということです。この関数を使用することで、配列が空であることを確認し、新しいMQL5プログラミングに備えることができます。

たとえ

あなたが魔法の袋(配列)を持っているとします。おもちゃを集めるなど、別のことに使いたいときもあるでしょう。しかし、新しいおもちゃを手に入れる前に、袋が空であることを確認する必要があります。それがArrayFree()です。杖を振って袋の中身を消し、新しいおもちゃや数字を入れられるようにします。「袋よ袋、もっと楽しいことの準備をしなさい」と言っているようなものです。これで、MQL5の世界で魔法の袋を使用した新しい冒険の準備は万端です。

構文

ArrayFree(array[] // dynamic array to be freed);

void OnStart()
  {

// Declare a dynamic array
   int dynamicArray[];
// Resize the dynamic array and assign values
   ArrayResize(dynamicArray, 5);
   dynamicArray[0] = 10;
   dynamicArray[1] = 20;
   dynamicArray[2] = 30;
   dynamicArray[3] = 40;
   dynamicArray[4] = 50;
   
// Print elements before freeing the array
   Print("Index 0 before freeing: ", dynamicArray[0]); // Output will be 10
   
// Free the dynamic array using ArrayFree
   ArrayFree(dynamicArray);
   
// Attempting to access elements after freeing (should result in an error)
//   Print("Index 0 after freeing: ", dynamicArray[0]);

// Reassign new values to the array
   ArrayResize(dynamicArray, 3);
   dynamicArray[0] = 100;
   dynamicArray[1] = 200;
   dynamicArray[2] = 300;
   
// Print elements after reassigning values
   Print("Index 0 after reassigning: ", dynamicArray[0]); // Output will be 100

  }

説明

動的配列の宣言

int dynamicArray[];

  • 空の動的配列を初期化します。

サイズ変更と値の割り当て

ArrayResize(dynamicArray, 5);
dynamicArray[0] = 10;
dynamicArray[1] = 20;
dynamicArray[2] = 30;
dynamicArray[3] = 40;
dynamicArray[4] = 50;

  • 動的配列を5要素にサイズ変更し、各要素に値を割り当てます。
解放前に要素を出力する

Print("Elements before freeing: ", dynamicArray[0]); // Output will be 10

  • 配列の最初のインデックスの値(10)を表示します。
動的配列の解放
ArrayFree(dynamicArray);
  • 動的配列が占有していたメモリを解放します。
解放後に要素へのアクセスを試みる
// Print("Elements after freeing: ", dynamicArray[0]);
  • この行は、配列が解放されているので、実行時エラーを避けるためにコメントアウトされています。
新しい値の割り当て
ArrayResize(dynamicArray, 3);
dynamicArray[0] = 100;
dynamicArray[1] = 200;
dynamicArray[2] = 300;
  • 配列のサイズを3 要素に変更し、新しい値を代入します。
値を再割り当てした後に要素を出力する
Print("Elements after reassigning: ", dynamicArray[0]); // Output will be 100
  • 再割り当て後の配列の最初のインデックスの値(100)を表示します。

この例では、ArrayFree()を使用して動的配列を解放した後、3つの要素を持つようにサイズを変更し、それらの要素に新しい値を代入しています。これは、動的配列を解放した後に再利用する方法を示しています。

MQL5の複雑な配列関数を使いこなすと、もっと多くの魔法を発見できるでしょう。コードの熟練度を向上させる、さらなる機能の詳細な探求にご期待ください。開発者としての経験に関係なく、この旅はまだ終わっていません。次のセクションでその驚異を掘り下げていくと、エキサイティングな発見が待っています。好奇心を持ち続けながら、一緒にコーディングの旅を続けましょう。


6.  ArraySetAsSeries

MQL5プログラミングでは、ArraySetAsSeries()は配列のインデックス方向を変更できる関数です。この関数を使用することで、配列の最後から最初にアクセスするように設定し、デフォルトの順方向を変更することができます。これは、金融データやその他の配列を扱う際に、時系列を逆にした順番で要素にアクセスすることが有効な場合に特に有効です。

注:この魔法は、動的配列(実行時にサイズを優雅に調整できる配列)にのみ有効であることに注意することが重要です。

たとえ

魔法にかけられた絵本が本棚に整然と並べられているとします。一冊一冊が特別な番号のように、そのエキサイティングな物語を探求するあなたを待っています。通常は、本棚に並んでいる順に、最初の本から最後の本へと読んでいきます。

本棚からすべての本を取り出さずに、コレクションに加えた最新の物語を発見する旅に出たいと想像してみてください。ここでArraySetAsSeries()の魅力が発揮されます。あなたの本棚(配列)にこの魔法をかけると、「追加した最新の物語が魔法のように最初に現れるように、物語を並べ替えて」と言っているようなものです。これは、毎日何冊の新しい本を集めたかを記録するなど、物語(数字)が時間とともに変化する場合に特に役立ちます。ArraySetAsSeries()を使えば、まず最新の絵本を開き、魔法の図書館をさかのぼってコレクションの成長を確認することができます。まるで、非凡な文学的冒険のための逆読みの呪文を持っているようなものです。

構文

ArraySetAsSeries(
   array[],    // array to be set as series
   bool   flag // true denotes reverse order of indexing
);

パラメータ

  • array[]: 時系列プロパティで魔法をかけたい配列です。特別な力を与えたい魔法のアーティファクトを選択するようなものです。
  • boolフラグ: ブール値です。trueに設定すると、インデックス付けの神秘的な反転が有効になり、不思議に、配列が最後の要素が最初の要素になる時系列に変わります。falseに設定すると、配列は魔法を使わない通常の振る舞いをします。

例:
void OnStart()
  {

// Declare a dynamic array
   int magicalArray[];

// Assign values to the array
   ArrayResize(magicalArray, 5);
   magicalArray[0] = 10;
   magicalArray[1] = 20;
   magicalArray[2] = 30;
   magicalArray[3] = 40;
   magicalArray[4] = 50;

// Print elements before setting as series
   Print("Elements before setting as series:");
   Print("Index 0: ", magicalArray[0]);
   Print("Index 1: ", magicalArray[1]);
   Print("Index 2: ", magicalArray[2]);
   Print("Index 3: ", magicalArray[3]);
   Print("Index 4: ", magicalArray[4]);

// Set the array as a series
   ArraySetAsSeries(magicalArray, true);

// Print elements after setting as series
   Print("Elements after setting as series:");
   Print("Index 0: ", magicalArray[0]);
   Print("Index 1: ", magicalArray[1]);
   Print("Index 2: ", magicalArray[2]);
   Print("Index 3: ", magicalArray[3]);
   Print("Index 4: ", magicalArray[4]);

  }

説明

動的配列の宣言
double magicalArray[];

  • magicalArrayという名前の動的配列を、サイズを指定せずに宣言します。
配列への値の割り当て

ArrayResize(magicalArray, 5);
magicalArray[0] = 10;
magicalArray[1] = 20;
magicalArray[2] = 30;
magicalArray[3] = 40;
magicalArray[4] = 50;

  • 配列のサイズを5要素に変更します。
  • 次に、配列の各要素に特定の値を割り当てます。
シリーズとして設定する前に要素を出力する

Print("Elements before setting as series:");
Print("Index 0: ", magicalArray[0]); // output will be 10
Print("Index 1: ", magicalArray[1]); // output will be 20
Print("Index 2: ", magicalArray[2]); // output will be 30
Print("Index 3: ", magicalArray[3]); // output will be 40
Print("Index 4: ", magicalArray[4]); // output will be 50

  • このセクションでは、配列の各要素の値を表示してから、それを系列として設定します。
配列をシリーズとして設定する

ArraySetAsSeries(magicalArray, true);

  • ArraySetAsSeries()を使用して、配列をシリーズとして設定します。2番目のパラメータtrueは、インデックスの逆順付けを示します。
シリーズとして設定した後に要素を出力する

Print("Elements after setting as series:");
Print("Index 0: ", magicalArray[0]); // output will be 50
Print("Index 1: ", magicalArray[1]); // output will be 40
Print("Index 2: ", magicalArray[2]); // output will be 30
Print("Index 3: ", magicalArray[3]); // output will be 20
Print("Index 4: ", magicalArray[4]); // output will be 10

  • 最後に、配列を系列として設定した後、各要素の値を表示します。出力の順番は、シリーズとして設定したためにインデックスが逆になっていることを反映しています。

要約すると、このコードは動的配列に値を代入し、それを系列として設定する前後にその要素を表示し、インデックスの順序の変化を観察する方法を示しています。

MQL5プログラミングの魅惑的な旅の中で、私たちは魔法の関数ArraySetAsSeries()を探求してきました。杖を振って配列のタイムトラベル能力の順番を逆にするようなものです。この章を締めくくるにあたり、練習あるのみということを忘れないでください。新しいことに挑戦し、ゆっくり読み、気軽に質問してください。魔法のようなコーディングの冒険で、コミュニティから援助を得ることができます。さらなるコーディングに乾杯!


7.  ArrayGetAsSeries

MQL5のArrayGetAsSeries()関数は、配列にAS_SERIESフラグが設定されているかどうかを判断するために使用されます。このフラグは、配列要素のアクセス順序に影響します。この関数がtrueを返せば、要素が逆順でアクセスされることを表し、falseを返せば、配列はデフォルトの順序を維持します。この関数は、データアクセスの順序が重要な配列を扱うときに便利で、配列の構成に基づいてデータアクセスパターンを確認し、適応させる方法を提供します。

たとえ

魔法のような数字のリストがあり、そのリストがタイムトラベルという特別なゲームを好むことがあるとします。この不思議なツール、ArrayGetAsSeries()を使用すると、リストがゲームをしているかどうかを教えてくれます。trueならば、リストはゲームをしているので、カウントダウンのように数字を逆から読みます。falseならば、リストは普通のもので、数え上げるように最初から最後まで数字を読みます。よって、魔法リストのルールを理解するのに役立ちます。

構文

bool ArrayGetAsSeries(
array[]    // // The array that is being examined for its time series configuration.
);

void OnStart()
  {

// Declare two dynamic arrays
   int timeSeriesArray[];
   int regularArray[];
// Resize the arrays to have 5 elements
   ArrayResize(timeSeriesArray, 5);
   ArrayResize(regularArray, 5);
// Assign values to the arrays
   timeSeriesArray[0] = 1;
   timeSeriesArray[1] = 2;
   timeSeriesArray[2] = 3;
   timeSeriesArray[3] = 4;
   timeSeriesArray[4] = 5;

   regularArray[0] = 5;
   regularArray[1] = 4;
   regularArray[2] = 3;
   regularArray[3] = 2;
   regularArray[4] = 1;
// Set the time series flag for the first array
   ArraySetAsSeries(timeSeriesArray, true);
// Check if the dynamic arrays follow the time series convention using if statements
   if(ArrayGetAsSeries(timeSeriesArray))
     {
      Print("timeSeriesArray is a time series. Elements are accessed from end to beginning.");
     }
   else
     {
      Print("timeSeriesArray maintains its original order. Elements are accessed from beginning to end.");
     }

   if(ArrayGetAsSeries(regularArray))
     {
      Print("regularArray is a time series. Elements are accessed from end to beginning.");
     }
   else
     {
      Print("regularArray maintains its original order. Elements are accessed from beginning to end.");
     }

  }

説明

// Declare two dynamic arrays
int timeSeriesArray[];
int regularArray[];

  • timeSeriesArrayとregularArrayという2つの動的配列を宣言します。MQL4の動的配列は、実行中にサイズを変更することができます。
// Resize the arrays to have 5 elements
ArrayResize(timeSeriesArray, 5);
ArrayResize(regularArray, 5);

  • ArrayResize()関数を使用して、両方の配列のサイズを5要素に設定します。このステップによって、配列が要素を格納するのに十分なスペースを確保できます。

// Assign values to the arrays
timeSeriesArray[0] = 1;
timeSeriesArray[1] = 2;
timeSeriesArray[2] = 3;
timeSeriesArray[3] = 4;
timeSeriesArray[4] = 5;

regularArray[0] = 5;
regularArray[1] = 4;
regularArray[2] = 3;
regularArray[3] = 2;
regularArray[4] = 1;

  • 両方の配列の要素に特定の値を割り当てています。timeSeriesArrayには昇順に値が割り当てられ、regularArrayには降順に値が割り当てられます。
// Set the time series flag for the first array
ArraySetAsSeries(timeSeriesArray, true);
  • ArraySetAsSeries()関数を使用して、timeSeriesArrayの時系列フラグをtrueに設定します。つまり、timeSeriesArray内の要素は、末尾から先頭にアクセスされます。
// Check if the dynamic arrays follow the time series convention using if statements
    if(ArrayGetAsSeries(timeSeriesArray))
    {
        Print("timeSeriesArray is a time series. Elements are accessed from end to beginning.");
    }
    else
    {
        Print("timeSeriesArray maintains its original order. Elements are accessed from beginning to end.");
    }

    if(ArrayGetAsSeries(regularArray))
    {
        Print("regularArray is a time series. Elements are accessed from end to beginning.");
    }
    else
    {
        Print("regularArray maintains its original order. Elements are accessed from beginning to end.");
    }
  • このコードスニペットは、動的配列であるtimeSeriesArrayとregularArrayが条件文を使用して時系列規則に準拠しているかどうかを確認します。ArrayGetAsSeries()関数を使用して、各配列に時系列フラグが設定されているかどうかを判断します。最初のif文は、timeSeriesArrayを確認し、それが時系列として識別された場合、対応するメッセージが出力され、その要素は終わりから始まりにアクセスされることを示します。そうでない場合、elseブロックで、timeSeriesArrayが元の順序を維持し、要素が最初から最後までアクセスされるというメッセージを表示します。このプロセスをregularArrayに対して繰り戻します。この条件付き確認は、動的配列内の要素がどのようにインデックス付けされているかを理解する上で極めて重要であり、配列へのアクセスの方向性について貴重な洞察を与えてくれます。

ArrayGetAsSeries()の複雑さを理解することは、MQL5における貴重なスキルです。時系列データをナビゲートする場合でも、配列をそのままの順序で扱う場合でも、これらの関数はあなたのアルゴリズム取引の旅に力を与えてくれます。初心者のうちは質問すべきだし、そうすることで一緒にコミュニティを築いていけます。 ハッピーコーディング!


8. ArrayIsSeries

MQL5で配列が時系列を表すかどうかを判断する場合、ArrayIsSeries()関数は不可欠です。時間に関連するデータを含む配列は、金融プログラミングでは時系列と呼ばれ、始値、高値、安値、終値のような価格値を格納するために頻繁に使用されます。この関数は指定された配列を解析して時系列が検出されるとtrueを返し、そうでなければfalseを戻します。この判断は、データの時間的性質を理解することが重要な、チャート上で金融データを扱う場合に不可欠です。

MQL5でカスタム指標を作成する場合、特にテクニカル分析の文脈では、通常の配列と時系列配列を区別することが不可欠になります。ArrayIsSeries()関数はこのプロセスを単純化し、開発者が配列に時間依存情報が含まれているかどうかに基づいてコードを調整できるようにします。この機能は、MQL5言語を使用して開発されたアルゴリズム取引戦略、テクニカル分析ツール、その他の金融アプリケーションの効率性と精度に貢献します。

ArrayGetAsSeriesとArrayIsSeriesの違い

ArrayGetAsSeries()とArrayIsSeries()はどちらも配列の動作に関係する関数ですが、その目的は異なります。ArrayGetAsSeries()は、配列のインデックスが、一般に逆順と呼ばれる、後ろから前に要素を取得するように設定されているかどうかを確認するために使用されます。この関数は配列を操作するときに便利で、開発者はデータが時系列でアクセスされるのか、逆順でアクセスされるのかを確認することができます。配列が直列(逆順でアクセス)に設定されている場合はtrueを返し、そうでない場合はfalseを戻します。

一方、ArrayIsSeries()は、配列が時系列かどうかを識別することに重点を置いています。時系列配列は金融プログラミングでは一般的で、始値、高値、安値、終値などのデータを時系列で表現します。ArrayGetAsSeries()と異なり、ArrayIsSeries()は、配列のインデックスの方向には関心がありません。その代わりに、配列に時間関連の情報が含まれているかどうかを確認します。配列が時系列の場合はtrueを返し、そうでない場合はfalseを戻します。これらの関数は、配列動作を処理するための包括的なツールキットを提供することで互いに補完し合い、アルゴリズム取引システムやテクニカル分析ツールでさまざまな種類の金融データを扱う際に柔軟性を提供します。

たとえ

毎日、お気に入りのおもちゃの値段のようなものをリストアップしているとします。さて、このリストが特別なものかどうか、物語と同じように時間に関連しているかどうかを知りたい場合は、ArrayIsSeries()という魔法の呪文を使えます。この呪文は、リストが時間旅行的なタッチを持っていて、時系列かどうかを確認します。リストが後ろから読むか前から読むかは関係ありません。それよりも、タイムトラベルの冒険のようかどうかを知りたいのです。

つまり、呪文がtrueと言うなら、私たちのリストはタイムトラベル物語のようなもので、おもちゃの値段が日ごとに変化していることを意味します。しかし、もしfalseと言うなら、このリストは時間に関係する魔法を持たない、ただの数字の集まりかもしれません。まるで、 このリストが特別なタイムトラベルの話ですかどうかを聞いているようなものです。そして呪文は、はいかいいえかというシンプルな答えを与えてくれます。

構文:
bool ArrayIsSeries(
array[] //the array you want to check if it's a timeseries.
)

void OnStart()
  {

// Declare an array
   double priceSeries[];
// Resize the array and assign values (considering it as a time series)
   ArrayResize(priceSeries, 5);
   priceSeries[0] = 1.1;
   priceSeries[1] = 1.2;
   priceSeries[2] = 1.3;
   priceSeries[3] = 1.4;
   priceSeries[4] = 1.5;
// Check if the array is a time series
   bool isSeries = ArrayIsSeries(priceSeries);
// Print the result
   if(isSeries)
     {
      Print("This array is a time series!");
     }
   else
     {
      Print("This array is not a time series.");
     }

  }

説明

// Declare an array
double priceSeries[];

  • priceSeriesという空の動的配列を宣言し、double値を格納します。

// Resize the array and assign values (considering it as a time series)
ArrayResize(priceSeries, 5);
priceSeries[0] = 1.1;
priceSeries[1] = 1.2;
priceSeries[2] = 1.3;
priceSeries[3] = 1.4;
priceSeries[4] = 1.5;

  • 配列のサイズを5要素に変更し、各要素に特定の値を割り当てます。これらの値は仮想的な時系列を表しています。

// Check if the array is a time series
bool isSeries = ArrayIsSeries(priceSeries);

  • ArrayIsSeries()関数を使用して、配列priceSeriesが時系列とみなされるかどうかを確認します。結果(trueまたはfalse)はブール変数isSeriesに格納されます。
// Print the result
if (isSeries) {
    Print("This array is a time series!");
} else {
    Print("This array is not a time series.");
}
  • 最後に、ArrayIsSeries()で得られた結果に基づいて、配列が時系列とみなされるかどうかを示すメッセージを表示します。時系列であるかないかで、メッセージが異なります。

この場合の出力は「This array is not a time series.」です。なぜでしょうか。この配列は、値を代入しても時系列を表さないので、最初のうちは、特に初めての人は少し混乱するかもしれません。しかし、今はシンプルに考えましょう。もっと詳しく調べ、一緒に学んでいきます。質問は大歓迎です。


9.配列初期化

ArrayInitialize()はMQL5の関数で、数値配列のすべての要素の初期値を指定されたプリセット値に設定します。ArrayInitialize()は、各要素に同じ値をひとつずつ手作業で代入する代わりに、選択した値をすべての要素に一度に適用することで処理を効率化します。この関数は、特に一様な初期化が必要な数値データを扱う場合に、一貫した開始点を持つ配列を準備するのに便利です。これは初期値を設定するだけで、予備要素や ArrayResize()を使用した将来の拡張には影響しないことに留意してください。

たとえ

配列と呼ばれる不思議なコンテナのセットがあり、各コンテナには値を格納するための特別なスペースがあるとします。さて、これらのスペースすべてで特定の値から始めたい場合は、ArrayInitialize()という特別なコマンドを使用する。このコマンドは、魔法のように一度にすべてのスペースに必要な初期値を設定するので、各スペースに個別に設定する手間が省けます。

しかし、ここからが面白いところです。後でこれらのコンテナを大きくして、別の魔法のコマンド(ArrayResize)を使用してさらにスペースを追加することにした場合、新しいスペースはそこに存在するが、元のものと同じ魔法の値は持たない。 それぞれ入力する値が微妙に異なるので、別々に選択する必要があります。それはお城の内部空間を拡張することに似ています。お城の内部空間を拡張するのと同じで、新しい部屋を古い部屋と同じ調度品で飾るとは限りません。

構文

int ArrayInitialize(
   array[],   // initialized array
   value       // value that will be set
);

void OnStart()
  {

// Declare a dynamic array
   int myArray[];

// Resize the array to have an initial size (let's use 3 elements)
   ArrayResize(myArray, 3);

// Assign values to all elements before initialization
   myArray[0] = 10;
   myArray[1] = 20;
   myArray[2] = 30;

// Assign values to all elements before initialization
   myArray[0] = 10;
   myArray[1] = 20;
   myArray[2] = 30;

// Initialize the array with a value (let's use 0.0)
   ArrayInitialize(myArray, 0);

// Print the values of all elements after initialization
   Print("Values after initialization:");
   Print("myArray[0] = ", myArray[0]); // outpot wil be 0
   Print("myArray[1] = ", myArray[1]); // outpot wil be 0
   Print("myArray[2] = ", myArray[2]); // outpot wil be 0
// Resize the array to have 5 elements
   ArrayResize(myArray, 5);

// Assign values to the additional elements after resizing
   myArray[3] = 40;
   myArray[4] = 50;

// Print the values of all elements after resizing
   Print("Values after resizing:");
   Print("myArray[3] = ", myArray[3]); // outpot wil be 40
   Print("myArray[4] = ", myArray[4]); // outpot wil be 50


  }

説明

// Declare a dynamic array
   int myArray[];

  • ここでは、myArrayという動的整数配列を宣言します。サイズに決まりはありません。

// Resize the array to have an initial size (let's use 3 elements)
   ArrayResize(myArray, 3);

  • myArrayの初期サイズが3要素になるようにサイズ変更します。つまり、配列内の3つの整数分のメモリーを確保することになります。

// Assign values to all elements before initialization
   myArray[0] = 10;
   myArray[1] = 20;
   myArray[2] = 30;

  • 配列を初期化する前に、手動で要素に値を代入します。この場合、myArray[0]を10、myArray[1]を20、myArray[2]を30に設定します。

// Initialize the array with a value (let's use 0.0)
   ArrayInitialize(myArray, 0);

  • ここで、ArrayInitialize()関数を使用して、「myArray」の全要素を指定された値(この場合は0)に設定します。

// Print the values of all elements after initialization
Print("Values after initialization:");
Print("myArray[0] = ", myArray[0]); // Output will be 0
Print("myArray[1] = ", myArray[1]); // Output will be 0
Print("myArray[2] = ", myArray[2]); // Output will be 0

  • 初期化後、myArrayの全要素の値を表示します。予想通り、すべての要素が0に設定されました。

// Resize the array to have 5 elements
ArrayResize(myArray, 5);

  • 次に、「myArray」のサイズを変更し、合計5つの要素を持つようにします。これは、配列に2つの要素を追加できることを意味します。

// Assign values to the additional elements after resizing
myArray[3] = 40;
myArray[4] = 50;

  • サイズ変更後、追加要素(myArray[3]と myArray[4])に値を割り当てます。

// Print the values of all elements after resizing
Print("Values after resizing:");
Print("myArray[3] = ", myArray[3]); // Output will be 40
Print("myArray[4] = ", myArray[4]); // Output will be 50

  • 最後に、新しく追加された要素も含めて、サイズ変更後の「myArray」内のすべての要素の値を表示します。

プログラマーが配列の各要素の値を指定した値に設定できる強力なツールが、MQL5ArrayInitialize()関数です。これにより、すべての配列要素に一貫した開始点が保証され、配列の初期状態が明確になり、コントロールしやすくなります。この関数は、各要素を同じ指定された数値に初期化することを覚えておいてください。これは単純に見えるかもしれませんが、さまざまな種類のアプリケーション用に配列をセットアップする上で重要なステップです。後の記事で、アルゴリズム・取引の領域を深く掘り下げ、ArrayInitialize()の重要性を強調します。集中し続け、コーディングを楽しみましょう。


10. ArrayFill

ArrayFill()はMQL5の関数で、配列操作のタスクを簡略化する上で重要な役割を果たします。この関数により、開発者は配列要素の範囲を指定した値で効率的に埋めることができ、手作業による反復や代入の必要がなくなります。各要素を個別に設定するために何行もコードを書く代わりに、ArrayFill()は簡潔で効果的なソリューションを提供します。この機能により、コードの可読性が向上し、特に大きな配列や繰り返しのある代入を扱う場合にエラーが発生する可能性が低くなります。配列要素に共通の値を素早く入力できるこの関数は、コーディングプロセスを合理化し、一括初期化が必要なさまざまなシナリオを処理するための貴重なツールになります。

たとえ

例えば、いくつかのスロットがある箱があり、その中のいくつかのスロットを同じおもちゃに使いたいとします。魔法の呪文のように、ArrayFill()はおもちゃを選択し、このおもちゃでこのスロットを埋めなさいと指示することができます。だから、ひとつひとつおもちゃを置くのではなく、すべてのおもちゃを一度に置くことができます。おもちゃの車をたくさん持っている人に、最初の5枠を赤い車で埋め、次の5枠を青い車で埋めなさいと言うのと似ています。この時間節約マジックは、おもちゃ箱の秩序を保つのに役立ちます。

構文
ArrayFill(
    array[], // array to be filled
    start,   // Starting slot (index) for filling
    count,   // Number of slots to fill
    value    // The value to fill the slots with
);

パラメータ

  • array[]:これが棚の配列です。
  • start:これは、商品を置き始める最初の棚を指定するようなものです。インデックスまたはポジションを提供します。
  •  count:この商品を次の○段の棚に置きたい」と言うのと似ています。棚の数を決めます。
  • value:これが棚に置きたい商品です。数字でも、色でも、棚に収まるものなら何でもいいです。

void OnStart()
  {

// Declare an array of shelves
   int roomShelves[];

// Set the size of the array (number of shelves)
   ArrayResize(roomShelves, 10);

// Fill the first 5 shelves with books (value 42)
   ArrayFill(roomShelves, 0, 5, 42);

// Fill the next 5 shelves with toys (value 99)
   ArrayFill(roomShelves, 5, 5, 99);

// Display the contents of the shelves after filling
   Print("Contents of the shelves after filling:");
   Print("Shelf 0: ", roomShelves[0]); // output will be 42
   Print("Shelf 1: ", roomShelves[1]); // output will be 42
   Print("Shelf 2: ", roomShelves[2]); // output will be 42
   Print("Shelf 3: ", roomShelves[3]); // output will be 42
   Print("Shelf 4: ", roomShelves[4]); // output will be 42
   Print("Shelf 5: ", roomShelves[5]); // output will be 99
   Print("Shelf 6: ", roomShelves[6]); // output will be 99
   Print("Shelf 7: ", roomShelves[7]); // output will be 99
   Print("Shelf 8: ", roomShelves[8]); // output will be 99
   Print("Shelf 9: ", roomShelves[9]); // output will be 99

  }

説明

int roomShelves[];

  • 部屋の棚を表す整数配列 roomShelvesを宣言します。

ArrayResize(roomShelves, 10);

  • roomShelves 配列のサイズを変更し、部屋の10個の棚を表す10個の要素を持つようにします。

ArrayFill(roomShelves, 0, 5, 42);

  • 最初の5つの棚(インデックス0から4)を値42で埋めます。

ArrayFill(roomShelves, 5, 5, 99);

  • 次の5つの棚(インデックス5から9)を値99で満たし、その棚にあるおもちゃを表します。

Print("Contents of the shelves after filling:");

  • 次の行に棚の内容が表示されることを示すメッセージを表示します。

Print("Shelf 0: ", roomShelves[0]);から “Print("Shelf 9: ", roomShelves[9]);

  • 各棚の内容を出力し、棚のインデックスと対応する値を表示します。

このMQL5コードは、ArrayFill()関数を使用して roomShelvesという動的配列を埋める方法を示しています。当初、配列は10棚にサイズ変更されました。次のステップでは、ArrayFill()を使用して、最初の5つの棚を42で満たし、次の5つの棚を99で満たす。各棚の内容が出力されると、充填処理後に配列の各要素に割り当てられた値が最終的に明らかになります。このコードは、ArrayFill()が、動的配列の指定されたセグメントを定義済みの値で効果的に初期化することによって、配列構造内に定義済みの値を設定する柔軟な方法を提供することを示しています。

注:ArrayFill()とArrayInitialize()はどちらもMQL5の配列操作関数ですが、その目的は異なります。ArrayFill()は、配列内の特定範囲の要素を、指定された値で埋めるように設計されています。配列のサブセットへの一括割り当てを効率的に行えるので、配列の一部を選択的に変更したり初期化したりするのに便利です。対照的に、ArrayInitialize()は、配列全体の全要素の値を一律に設定する、より一般的な関数です。これは、配列全体の一貫した開始状態を保証し、すべての要素を同じ値に初期化する迅速な方法を提供します。つまり、ArrayFill()が的を絞った割り当てに特化しているのに対して、ArrayInitialize()は、配列全体を一律に初期化する広範なツールなのです。


11. ArrayIsDynamic

配列が動的か静的かを確認するために、MQL5の便利なツールの1つに ArrayIsDynamic()関数があります。静的配列のサイズはコンパイル時に固定されますが、動的配列のサイズは実行時に変更できます。ArrayIsDynamic()は、配列が動的か静的かを判定し、配列の性質に応じて単純なtrueかfalseを戻します。このデータを使えば、プログラムは配列の柔軟性に応じて動作を変更することができ、プログラム実行中にサイズを変更できるかどうかを判断することができます。

たとえ

配列は、プログラミングの世界では、複数のオブジェクトを格納できる魔法の箱に似ています。箱の中には、必要なときに、より多くのアイテムを入れたり、スペースを取らないようにサイズを変更できる特別な魔法を持つものもあります。これらはダイナミックボックスと呼ばれます。逆に、サイズが決まっていて、どんなことがあっても動かないボックスもあります。これらはスタティック・ボックスと呼ばれます。

さて、ボックスが動的か静的かを判断するには、ウィザードのようなArrayIsDynamic()関数を使用することができます。この呪文の結果は、箱が静的(大きさが一定)なのか、動的(大きさが変化する)なのかを示しています。プログラマーがこのようなことを知る必要があるのは、魔法のようなコードでボックスをどのように操作するかを決めるときに意味があるからです。静的なものであれば、設定したサイズを超えないように注意しなければなりません。動的なものであれば、必要に応じて大きくしたり小さくしたりすることができます。

構文
bool ArrayIsDynamic(array[]   // array to be checked);
例:
void OnStart()
  {

// Declare a static array
   int staticArray[5];

// Declare a dynamic array
   int dynamicArray[];

// Check if the static array is dynamic
   bool isStaticArrayDynamic = ArrayIsDynamic(staticArray);

   if(isStaticArrayDynamic)
     {
      Print("The staticArray is dynamic.");  // This message won't be printed.
     }
   else
     {
      Print("The staticArray is static, meaning its size is fixed.");
     }

// Check if the dynamic array is dynamic
   bool isDynamicArrayDynamic = ArrayIsDynamic(dynamicArray);

   if(isDynamicArrayDynamic)
     {
      Print("The dynamicArray is dynamic, meaning its size can be changed.");
     }
   else
     {
      Print("The dynamicArray is static.");  // This message won't be printed.
     }
     
  }

説明

int staticArray[5];

  • この行は、固定サイズ5要素の「staticArray」という名前の配列を宣言しています。

int dynamicArray[];

  • この行は、固定サイズを指定せずに「dynamicArray」という動的配列を宣言しています。

bool isStaticArrayDynamic = ArrayIsDynamic(staticArray);

  • この行では、ArrayIsDynamic()関数を使用して staticArrayが動的かどうかを確認し、その結果をisStaticArrayDynamicに代入しています。

bool isStaticArrayDynamic = ArrayIsDynamic(staticArray);

  • この行では、ArrayIsDynamic()関数を使用して staticArrayが動的かどうかを確認し、その結果をisStaticArrayDynamicに代入しています。

静的配列の結果を表示します。

  • 続く if-else ブロックは、前のステップで得られた結果に基づいて、staticArrayが動的か静的かを示すメッセージを表示します。

bool isDynamicArrayDynamic = ArrayIsDynamic(dynamicArray);

  • この行では、ArrayIsDynamic()関数を使用して dynamicArrayが動的かどうかを確認し、その結果をisDynamicArrayDynamicに代入しています。

動的配列の結果を表示します。

  • 続く if-else ブロックは、前のステップで得られた結果に基づいて、dynamicArrayが動的か静的かを示すメッセージを表示します。

このコードでは、配列が動的か静的かを判定するためにArrayIsDynamic()を使用しています。


12. ArrayMaximum

MQL5のArrayMaximum()関数は、数値配列内の最大要素のインデックスを特定するために設計された強力なツールです。この機能は、最高値を決定することが意思決定に重要なシナリオで特に役立ちます。配列を効率的に検索することで、この関数は配列のシリアルを考慮した最大要素のインデックスを返します。配列が金融データやテクニカルデータを表す場合、最大値を見つけることは、意味のある洞察を引き出したり、情報に基づいた取引の意思決定をおこなうための基本的なステップです。

たとえ

あなたがプレーしたさまざまなゲームのスコアのような数字のリストを持っているとします。ArrayMaximum()関数は、あなたのリストを見て、どのゲームで一番成績が良かったかを教えてくれる小さなヘルパーのようなものです。どのゲームの得点が一番高かったかを知りたければ、このヘルパーはそれぞれの得点を確認し、一番高い得点を見つけたら、そのゲームを指差して、「このゲームがあなたのベストゲームです」と言います。自分でリストを全部見なくても、友達が、あなたの最高のゲームをすぐに見つけてくれるようなものです。コンピュータプログラムでは、このヘルパーは数字の束の中から最大の数を見つけるのに便利です。

構文
int ArrayMaximum(
    array[],       // Array for search
    start,          // Index to start checking with
    count = WHOLE_ARRAY    // Number of checked elements (default: search in the entire array)
);

パラメータ

  • array[]:最大値を求める配列
  • start:最大値の検索を開始する配列のインデックス
  • count = WHOLE_ARRAY:検索で考慮する要素の数(デフォルト値WHOLE_ARRAYは、配列全体を検索することを意味する)

これで、ArrayMaximum(array, start, count)を呼び出すと、この関数は配列の指定された範囲内で最大の要素を見つけ、そのインデックスを戻します。最大値が見つからない場合は-1を戻します。

void OnStart()
  {
  
// Declare an array with integer values
   int myArray[] = {42, 18, 56, 31, 75, 23};

// Find the maximum value and its index
   int maxIndex = ArrayMaximum(myArray);

// Check if a maximum was found
   if(maxIndex != -1)
     {
      Print("The maximum value in the array is: ", myArray[maxIndex]);
      Print("Index of the maximum value: ", maxIndex);
     }
   else
     {
      Print("No maximum value found in the array.");
     }

  }

説明

int myArray[] = {42, 18, 56, 31, 75, 23};

  • myArrayという名前の整数配列を宣言し、それを6つの整数値で初期化します。

int maxIndex = ArrayMaximum(myArray);

  • ArrayMaximum()関数をmyArrayに対して呼び出し、配列内の最大値のインデックスを求めます。結果は変数 maxIndexに格納されます。

if (maxIndex != -1) { 

  • この条件文は、最大値が見つかったかどうかを確認します。maxIndexが-1でなければ、配列に最大値が存在することを意味します。

Print("The maximum value in the array is: ", myArray[maxIndex]);

  • 最大値が見つかった場合、maxIndexから得たインデックスを使用して最大値を表示します。

Print("Index of the maximum value: ", maxIndex);

  • 最大値のインデックスを表示します。

} else { Print("No maximum value found in the array."); }

  • maxIndexが-1のとき(最大値が見つからなかったとき)、このブロックが実行され、最大値が見つからなかったというメッセージが出力されます。

配列内の最大値とそのインデックスを決定するには、このコードに示すようにArrayMaximum()を使用します。


13. ArrayMinimum

MQL5のArrayMinimum()という便利な関数を使用すると、数値配列の1次元目の最小(最小)要素のインデックスを決定できます。この関数はさまざまなサイズの配列を扱うことができ、非常に柔軟です。配列の直列順序を考慮することで、正確な結果を保証します。

ArrayMinimum()は、主に配列の最小要素のインデックスを見つけるために使用されます。これは、配列の要素の順序を考慮しながら、最も小さい値のインデックスを与えます。検索で最小値が見つからなかった場合、この関数は -1を戻します。配列内の最小要素の正確な位置を決定する必要がある場合に便利です。

構文
int ArrayMinimum(array[],start,count = WHOLE_ARRAY);
例:
void OnStart()
  {

// Declare an integer array
   int myArray[] = {10, 5, 8, 3, 12};

// Find the index of the minimum element in the entire array
   int minIndex = ArrayMinimum(myArray, 0, WHOLE_ARRAY);

// Print the result
   Print("Index of the minimum element: ", minIndex);

  }

ArrayMaximum()と同じように、このコードはmyArray全体で最小の要素のインデックスを見つけ、その結果を表示します。


結論

この記事では、MQL5における配列関数の世界について説明し、その機能と応用を明らかにしました。検索やコピーから、時系列配列のサイズ変更や処理まで、ArrayBsearch、ArrayCopy、ArrayCompare、ArrayResize、ArrayFree、ArraySetAsSeries、ArrayGetAsSeries、ArrayInitialize、ArrayFill、ArrayIsDynamic、ArrayIsSeries、ArrayMaximum、ArrayMinimumなど、さまざまな関数を検討しました。各関数は、配列を操作し、取引アルゴリズムの能力を高める上で重要な役割を果たします。

この記事を締めくくるに当たり、的を絞った消化しやすい学習体験を保証するために、意図的にすべての配列関数を取り上げなかったことにご注意ください。次回の記事では、ArrayPrint、ArrayRange、ArrayInsert、ArrayRemove、ArrayReverse、ArraySize、ArraySort、ArraySwap、ArrayToFP16、ArrayToFP8、ArrayFromFP16、ArrayFromFP8といった他の配列関数を紹介します。この段階的なアプローチは、学習曲線をよりスムーズにすることを目的としています。さて、次回はMQL5の配列関数の探索を続けます。


MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/14306

MQL5における修正グリッドヘッジEA(第3部):シンプルヘッジ戦略の最適化(I) MQL5における修正グリッドヘッジEA(第3部):シンプルヘッジ戦略の最適化(I)
この第3部では、以前に開発したシンプルヘッジとシンプルグリッドエキスパートアドバイザー(EA)を再考します。最適な戦略の使用を目指し、数学的分析と総当り攻撃アプローチを通じてシンプルヘッジEAを改良することに焦点を移します。戦略の数学的最適化について深く掘り下げ、後の回でコーディングに基づく最適化を探求するための舞台を整えます。
ニューラルネットワークが簡単に(第68回):オフライン選好誘導方策最適化 ニューラルネットワークが簡単に(第68回):オフライン選好誘導方策最適化
最初の記事で強化学習を扱って以来、何らかの形で、環境の探索と報酬関数の決定という2つの問題に触れてきました。最近の記事は、オフライン学習における探索の問題に費やされています。今回は、作者が報酬関数を完全に排除したアルゴリズムを紹介したいと思います。
プログラミングパラダイムについて(第2部):オブジェクト指向アプローチによるプライスアクションエキスパートアドバイザーの開発 プログラミングパラダイムについて(第2部):オブジェクト指向アプローチによるプライスアクションエキスパートアドバイザーの開発
オブジェクト指向プログラミングのパラダイムとMQL5コードへの応用について学びます。この第2回目の記事では、オブジェクト指向プログラミングの具体的な内容をより深く掘り下げ、実践的な例を通して実体験を提供します。EMA指標とローソク足価格データを使用した、手続き型プライスアクションエキスパートアドバイザー(EA)をオブジェクト指向コードに変換する方法を学びます。
RestAPIを統合したMQL5強化学習エージェントの開発(第2回):三目並べゲームREST APIとのHTTPインタラクションのためのMQL5関数 RestAPIを統合したMQL5強化学習エージェントの開発(第2回):三目並べゲームREST APIとのHTTPインタラクションのためのMQL5関数
この記事では、MQL5がPythonやFastAPIとどのように相互作用できるか、MQL5のHTTP呼び出しを使用してPythonの三目並べゲームと相互作用する方法について説明します。この記事では、この統合のためのFastAPIを使用したAPIの作成について説明し、MQL5でのテストスクリプトを提供することで、MQL5の多用途性、Pythonのシンプルさ、そして革新的なソルーションを生み出すために異なるテクノロジーを接続するFastAPIの有効性を強調しています。