English Deutsch
preview
MQL5入門(第4部):構造体、クラス、時間関数をマスターする

MQL5入門(第4部):構造体、クラス、時間関数をマスターする

MetaTrader 5エキスパートアドバイザー | 23 4月 2024, 14:52
113 0
Israel Pelumi Abioye
Israel Pelumi Abioye

はじめに

MQL5の旅の第4部へようこそ。構造体、クラス、時間関数のシンプルさを掘り下げながら、複雑な概念をより親しみやすくすることに重点を置いています。 MQL5の言語が誰にでも理解できるような、包括的な空間を作るという目標は変わりません。 質問は歓迎されるだけでなく、奨励されることを忘れないでください。質問は明確さと理解への道を切り開くのです。MQL5をマスターするまでの道のりが勉強になるだけでなく、楽しいものになるよう、一緒に探求を続けましょう。

特に初心者は、プログラミングに圧倒されてしまうことがあるかと思います。でも、心配は無用です。この記事は複雑な問題を解き、MQL5の世界に対する明確な洞察を提供するようにデザインされています。ご遠慮なくご質問jください。探究心はより良い理解への道を開くからです。 この章は、アルゴリズム取引の技術を習得するための足がかりとなるもので、理解を深めるためにコードの各行を解説しています。学ぶことは楽しい旅であるべきなので、一緒にシンプルさの領域に飛び込みましょう。そして、好奇心は最高の友であることを忘れないでください。

この記事では、以下のトピックを取り上げます。

  • 構造体
  • クラス
  • MQL5の時間関数

連載の第4部を進めるにあたり、いつものように、第3部で取り上げた概念の記憶をリフレッシュするための要約ビデオを提供します。このビデオは、読者の理解を補強し、素早く復習することで、この先の新教材に十分備えられるようにすることを目的としています。基本を再確認したり、見逃した細部を見直したりする必要を感じたら、この要約ビデオをご覧ください。どんどん質問して、一緒に学びの旅を続けましょう。



1. 構造体

構造体について

プログラミングにおいて構造体とは、異なるタイプのデータを1つの名前でグループ化できる複合データ型のことです。構造体を使用すると、論理的に関連する情報をまとまった形で整理し、管理することができます。構造体には、整数、浮動小数点数、文字などさまざまなデータ型を含めることができます。構造体の主な目的は、コードの明快さと再利用性を高め、複数の属性を持つ実体を表現することです。

MQL5では、構造体が同じ目的を果たします。これはユーザー定義のデータ型で、関連するデータ要素を格納するためのコンテナを作成することができます。MQL5の構造体は、取引アルゴリズム、金融商品、または異なる属性を単一のエンティティに関連付ける必要があるあらゆるシナリオにおいて、実世界のエンティティを表現するためによく使用されます。MQL5で構造体を宣言するための構文は、他のプログラミング言語と似ており、取引スクリプトやEA内で効率的にデータを整理し、アクセスするための汎用的な方法を提供します。


たとえ

構造物を魔法のリュックと想像してみましょう。このリュックには、おもちゃやお菓子、ちょっとした地図など、さまざまなものを入れることができます。リュックの中に入っているものは、それぞれ違う情報のようなものです。例えば、おもちゃはおもちゃの種類、お菓子はその味、地図は行きたい場所を示しています。 

さて、リュックをプログラミングにおける構造体として考えてみましょう。構造体は異なるタイプの情報(おもちゃ、お菓子、地図)を保持します。ちょうど構造体がプログラム内の異なるデータを保持するのと同じです。おもちゃについて知りたいときは、リュックの中を見て、そのおもちゃを見つけます。同様に、プログラムでは、構造体を使用して特定の情報を探します。 つまり、構造体とは、さまざまな種類のものを整理して持ち運び、必要なものを簡単に見つけることができる魔法のリュックのようなものなのです。

1.1. 構造体の宣言方法

MQL5で構造体を宣言することは、レシピカードに記入する前に構造体を定義することに似ています。含めたいさまざまな情報の種類と名前を指定します。

struct Person
 {
    string name;
    int age;
    string address;
};

説明

struct Person

  • この行は、Personという構造体の宣言を開始します。構造体とは、異なるタイプの変数を1つの名前でグループ化できる、ユーザー定義のデータ型だと考えてください。

string name;

  • 構造体の内部では、3つのメンバー(フィールドまたは変数)が宣言されています。最初のものはnameで、string型です。このフィールドは人の名前を保存するためのものです。

int age;

  • 2番目のメンバーはageで、int型です。このフィールドは人の年齢を保存するためのものです。

string address;

  • 3番目のメンバーはaddressで、これもstring型です。このフィールドは個人の住所を保存するためのものです。

構造体とは、その人に関する情報をきちんと整理するための、カスタムコンテナやフォームのようなものだと考えてください。このPerson構造体は、特定のフィールド(名前、年齢、住所)を持つフォームのように機能し、各個人の詳細を記入することができます。この構造体ができたら、さまざまな人のためにインスタンスを作成し、それぞれのインスタンスに特定の人に関する情報を保持させることができます。

1.2. 利用

構造体を宣言したら、次はそれを実行する番です。構造体の宣言は、パーソナライズされたインスタンスやオブジェクトを作成するための設計図だと考えてください。これらのインスタンスは、ちょうど作りたい料理ごとに固有のレシピカードを記入するように、各人に固有のデータを保持します。

void OnStart()
  {

   struct Person
     {
      string         name;
      int            age;
      string         address;
     };

// Creating variables of type Person
   Person person1, person2;

// Filling in details for person1
   person1.name = "Israel";
   person1.age = 25;
   person1.address = "123 Main St";

// Filling in details for person2
   person2.name = "Bob";
   person2.age = 30;
   person2.address = "456 Oak St";

// Now you can use person1 and person2 with their specific details
   Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);
   Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);

  }

説明

void OnStart()

  • これがスクリプト実行の起点となります。この関数内のコードはすべて、スクリプトが起動されたとき、またはチャートに添付されたときに実行されます。

Person person1, person2;

  • Person型の2つの変数person1とperson2を宣言します。これらの変数は、個人に関する情報を格納するコンテナとして機能します。

person1.name = "Israel";

  • person1のnameメンバーに値Israelを代入します。

person1.age = 25;

  • person1のageメンバーに値25を代入します。

person1.address="123MainSt";

  • person1のaddressメンバーに値123MainStを代入します。

「person2.name = "Bob";」から「person2.address = "456 Oak St";」

  • person2変数にも同様の割り当てをおこないます。

Print("Details of Person 1: ", person1.name, ", ", person1.age, ", ", person1.address);

  • Print関数を使用してperson1の詳細を出力します。

Print("Details of Person 2: ", person2.name, ", ", person2.age, ", ", person2.address);

  • Print関数を使用してperson2の詳細を出力します。

たとえ

あなたが魔法の工房で、特別な人のためにパーソナライズされた情報カードを作るマスタークリエイターだと想像してみてください。これらのカード(「人物カード」と呼ぶことにする)には、各人の名前、年齢、住所を記載する個別のセクションがあります。それぞれのカードが、その人を象徴する固有の要素を持っていることを確実にするために、制作過程には細心の注意が払われます。

人物カードの作成

  • 工房では、作業台に2枚の白紙のカードを並べ、person1とperson2と名付けます。それぞれのカードは、さまざまな人物の個別の詳細を封じ込めるように注意深くデザインされています。

person1に詳細を織り込む

  • 最初のperson1カードの作成に取りかかります。Nameセクションの下の指定されたスペースにIsraelという名前を刻みます。魔法のペンで、年齢欄に「25」と記入します。「123 Main St」という住所は、Addressセクションの下にあります。

person2に詳細を織り込む

  • 2枚目のカードperson2を呼び出して、このプロセスを繰り返します。今度はBobという名前、30という年齢、「456 Oak St」という住所がカードに刻まれます。

人物カードの公開

  • 華々しく、最初のperson1カードを提示し、「これがperson1の詳細です。Israel、25歳、123 Main St.在住」とその内容を説明します。 2枚目のperson2カードでも、同じように、持ち主固有の詳細を紹介します。

この魔法の工房では、Person構造体が魔法の設計図となり、各カードのセクションを指示します。変数person1とperson2には、それぞれ異なる個人の要素を凝縮した魔法のカードの具体的な表現として命を吹き込まれます。これらのカードを公開することで、そのカードが持つ魅惑的な詳細を垣間見ることができます。

メモ: プログラミングの旅において、配列や構造体のような概念には、最初は少し戸惑うかもしれません。配列と構造体は一見似ているため、初心者にありがちな誤解の1つはそれらを混同してしまうことです。どちらもデータを整理するものですが、同じではありません。 配列は整然と並んだリストのようなもので、似たような情報(似たようなデータ型)が順番に並んでおり、インデックスを通してアクセスできます。 一方、構造体はコンテナのようなもので、異なるタイプの情報(異なるデータ型)を特定のエンティティにまとめることができます。

つまり、配列が似たような要素の集まりを扱うのに対し、構造体はさまざまな情報を保持する複雑なデータ型を作ることができます。最初は少し難しく感じてもご心配なく。こうした微妙な違いを理解することも、プログラミングの世界へのエキサイティングな旅の一部なのです。


2.クラス

クラスについて

MQL5では、クラスはオブジェクトの作成を導く設計図やテンプレートのようなものです。ここでいうオブジェクトとは、クラスの具体的なインスタンスや実現物のことです。クラスとは、さまざまなオブジェクトを作るための指示書の集合であり、各オブジェクトはその指示書から作られた固有のアイテムのようなものだと考えてください。

Fruitというクラスがあり、リンゴ、バナナ、オレンジなどさまざまな果物を作る指示があるとします。オブジェクトは、その指示に基づいて作成した実際のリンゴ、バナナ、オレンジとなります。各果物オブジェクトは固有の属性(色や味など)を持ち、アクション(食べられるなど)を実行できます。つまりMQL5では、クラスがルールを定義し、オブジェクトはそのルールに従って作る具体的なものなのです。

たとえ

積み木で遊んでいて、かっこいい宇宙船の作り方が書かれた特別な説明書を持っているとしましょう。この一連の指示は「クラス」のようなものです。 どの色を使用するか、どのようにブロックを積み上げるか、そして宇宙船を飛ばす方法まで教えてくれる(まるでプログラミングの授業の設計図のように)などです。さて、この指示に従って宇宙船を建造するたびに、その宇宙船はクラスの「オブジェクト」のようなものになります。作る宇宙船はそれぞれ独自の色や特徴を持つことができますが、すべて同じ指示に従います。

つまり、コンピュータプログラミングにおけるクラスとは、楽しくてエキサイティングなものを作るための特別な指示書のようなものなのです。これは、プログラマーが特定の機能やアクションを持つもの(「オブジェクト」)を作成するのに役立ちます。どのように作るべきかを整理し、計画することで、毎回ゼロから始めることなく、似たようなものをたくさん作りやすくする方法です。素晴らしい宇宙船や車、あるいは魔法の生き物を作るための説明書一式があるのと同じです。

あなたが、様々な種類のクッキーを作ることができる魔法のクッキー工場を経営していると想像してください。クッキー作りの設計図やレシピはクラスのようなものです。各クッキーにどんな材料を入れ、どのように焼くかを定めています。

2.1. クラスの宣言方法

MQL5では、クラスを宣言する構文には「class」キーワードを使用し、その後にクラス名とクラスメンバーを含むコードブロックを続けます。

例:

void OnStart()
  {

   class Person
     {
   public:
      // Attributes (data members)
      string         name;
      int            age;

      // Methods (member functions)
      void           displayInfo()
        {
         Print("Name: ", name);
         Print("Age: ", age);
        }
     };

// Creating an object of the Person class
   Person person1;

// Initializing attributes of the object
   person1.name = "John";
   person1.age = 25;

// Calling the displayInfo method to print information
   person1.displayInfo();

  }

説明

クラス宣言:

class Person {

  • この行はPersonという名前のクラスを宣言しています。 classキーワードの後にはクラス名が続き、中かっこ"{"はクラス定義の開始を示します。

publicセクション
public:
  • この行はアクセス指定子publicを宣言しており、以下のクラスメンバー(属性とメソッド)はクラスの外部からアクセス可能であることを示しています。
属性(データメンバー)
string name;
int age;
  • これらの行は、クラス内で2つの属性(データメンバー)を宣言しています。文字列属性のnameと整数属性のageです。
メソッド(メンバー関数)
void displayInfo() 
{
    Print("Name: ", name);
    Print("Age: ", age);
}
  • これは、クラス内にdisplayInfoという名前のメソッド(メンバー関数)を定義しています。これは、Print関数を使用してnameとage属性の値をPrintします。
閉じ中かっこ
};
  • 閉じ中かっこ"}"は、クラス定義の終わりを示します。
OnStart関数での使用
void OnStart() {
  • OnStart関数はMQL5の特別な関数で、スクリプトまたはEAの実行開始時に実行されます。
オブジェクトの作成
Person person1;
  • この行は、person1という名前のPerson型のオブジェクトを作成します。 クラスの特定のインスタンスをインスタンス化します。

属性の設定

person1.name = "John";
person1.age = 25;

  • これらの行は、person1オブジェクトのname属性とage属性の値を設定します。
メソッド呼び出し

person1.displayInfo();

  • この行は、person1オブジェクトのdisplayInfoメソッドを呼び出し、属性に格納されている情報を表示します。


プログラミングにおけるクラスと構造体には共通点があるが、その目的は異なります。どちらも、関連するデータをグループ化してカスタムデータ型を定義するために使用されます。だたし、決定的な違いはその機能性にあります。

構造体はより単純で、メソッドや関数を組み込むことなく、主にデータのコンテナとして機能します。さまざまなデータ要素をグループ化し、便利にアクセスできるようにした、整理された保管庫のようなものです。一方、オブジェクト指向プログラミングにおけるクラスは、データだけでなくメソッドによる動作も含みます。クラスは、情報を保持するだけでなく、アクションや機能を実行する手段を提供する、多目的なツールキットだと考えてください。つまり、クラスも構造体もデータを整理するものですが、クラスではメソッドによってさらに機能を追加することができ、プログラミングにおける複雑な問題をモデル化し、解決するための強力なツールとなります。

クラスと構造体の区別に最初は少し圧倒されてもまったく問題ありません。次回の記事では、これらの概念を視覚的に分解し、把握しやすくした要約ビデオを掘り下げます。もし今少し混乱しているとしても、ご心配なく。すぐ分かるようになります。質問をどんどんお寄せください。一緒にプログラミングの基礎を探求しましょう。


3. MQL5の時間関数

時間

プログラミングや取引の文脈では、「時間」とは、時間、分、秒の進行のことです。これはアルゴリズム取引の基本的な側面です。金融市場は特定の時間枠の中で動いており、トレーダーはしばしばこうした時間的要素と戦略を同期させる必要があるからです。

関数

プログラミングにおいて「関数」とは、特定のタスクや操作を実行するために設計された、自己完結型のコードブロックのことです。関数はコードを整理し、よりモジュール化し、理解しやすくするのに役立ちます。入力を受け取り、処理し、出力を提供します。

時間関数について

プログラミングにおける時間関数、特にMQL5における時間関数は、開発者やトレーダーがアルゴリズム内で時間に関連するデータを扱い、操作することを可能にするツールです。これらの関数は、現在のサーバー時刻の取得、時刻値の変換、タイムスタンプを含む様々な操作の実行に役立ちます。アルゴリズム取引の文脈では、時間関数は、取引戦略を特定の時間枠に同期させ、正確な実行時間を設定し、取引シグナルの時間依存条件を作成するために極めて重要です。金融市場の時間的側面をナビゲートするために必要なツールを提供し、アルゴリズム取引戦略の精度と有効性を高めます。

たとえ

いつ遊ぶか、いつ食べるか、いつ寝るかなど、特定のことをするタイミングを教えてくれる魔法の時計があるとしましょう。コンピュータプログラムの世界では、時間関数は魔法の時計のようなもので、コンピュータが時間を管理し、さまざまなタスクを実行するタイミングを決めるのに役立ちます。

つまり、取引用のコンピュータプログラムを書く場合、時間関数を使用して、朝ならこの取引戦略を実行し、夜なら別のことをやるようにコンピュータに指示するかもしれません。 時間関数は、あなたが一日中魔法の時計の指示に従うように、異なる時間に何をすべきかをコンピュータに与える指示のようなものです。

MQL5の時間関数の魅力的な領域を深く掘り下げる前に、datetimeの謎を解き明かしてみましょう。

3.1.datetime

MQL5では、datetimeは日付と時刻を表すために使用される特殊なデータ型です。取引の世界で、現在の日付と時刻を把握できるデジタル時計を持っているようなものです。これにより、トレーダーやアルゴリズムはイベントを正確にタイムスタンプして、特定の時間条件に基づいて戦略を分析実行することができます。

3.1.1.datetime変数の宣言方法

datetime変数を、日付と時刻を保存できる魔法の時計と考えてください。datetime変数を宣言すると、その変数を特定の瞬間に設定することができます。

void OnStart()
  {

// Declaration of datetime variable
   datetime magicalClock;

// Assigning a special date and time to our magical clock
   magicalClock = D'2024.01.15 12:30:00';

// Let's tell the computer to show us the date and time inside our
   Comment(magicalClock);

  }

説明

datetime magicalClock;

  • ここでは、datetimeデータ型のmagicalClockという名前の変数を宣言します。この変数には、魔法の日付と時間が格納されます。

magicalClock = D'2024.01.15 12:30:00';

  • この行では、「YYYY.MM.DDHH:MI:SS」形式を使用して、特定の日時(2024年1月15日12:30:00)をmagicalClock変数に代入します。
  • 「D'」は日付定数を代入していることを示します。
  • 2024は年
  • 01は月
  • 15は日
  • 12は時間
  • 30は分
  • 00は秒

Comment(magicalClock);

  • 最後に、Comment関数を使用して、魔法の時計(magicalClock)の内容を表示します。コンピュータは保存された日付と時刻を出力し、私たちはdatetime変数に収められた魅惑的な瞬間を目撃することができます。

このコードスニペットでは、datetime変数の宣言、代入、出力を紹介し、MQL5で日付と時刻を管理する世界を垣間見ることができます。

図1:MT5でコードを実行した結果

3.2.コア時間関数

3.2.1.TimeCurrent

アルゴリズム取引の文脈では、MQL5のTimeCurrent()関数は、現在のサーバー時間を提供するという重要な役割を果たしています。この関数はdatetime値を返し、これは基本的に取引活動が実行されているサーバー上の現在のタイムスタンプを表します。

なぜこれが重要なのでしょうか。時間帯に応じた特定の行動を伴う取引戦略を実行しているとしましょう。例えば、市場の開閉時や不安定な時間帯に異なるアプローチをとることもできます。TimeCurrent()を使用すれば、プログラムで現在時刻にアクセスし、それに応じて取引判断を調整することができます。これは、サーバーの時刻と同期した時計を持つようなもので、アルゴリズムが一日を通して異なる市場の状況に動的に適応できるようにします。

実際的には、TimeCurrent()を使用して、取引アルゴリズムに時間依存の条件を作成することができます。例えば、特定の時間帯にのみ取引を開始したり、時間帯に応じてリスク管理戦略を調整したりすることができます。これは、刻々と変化する金融市場の状況に合わせてアルゴリズムを確実に同期させるための貴重なツールです。

たとえ

プログラミングにおける時間とは、物事がいつ起こるかを教えてくれる時計のようなものだと想像してみましょう。つまり、TimeCurrent()は、コンピュータに、その時計による現在時刻を尋ねるようなものです。

TimeCurrent()を使用すると、コンピュータは喜んで「2024.01.1512:30:00」のような特別な形式で現在時刻を教えてくれます。私たちはこの情報を使用して、特定のイベントがいつ発生したかを知ったり、プログラムの計画を立てたりすることができます。プログラミングの世界で、常に現在時刻を示す魔法の時計を持っているようなものです。

void OnStart()
  {

// Ask the magical clock for the current time
   datetime currentTime = TimeCurrent();

// Display the current time on the console
   Print("The magical clock says it's now: ", currentTime);

  }

説明

datetime currentTime = TimeCurrent();

  • ここでは、datetime型(日付と時刻の情報を保持するデータ型)のcurrentTimeという変数を宣言します。TimeCurrent()関数を使用して現在のサーバー時間を取得し、その結果をcurrentTime変数に代入します。

Print("The magical clock says it's now: ", currentTime);

  • Print()関数は、コンソールにメッセージを表示するために使用されます。この行では、currentTimeの値とともにメッセージを表示しています。つまり、「魔法の時計」によって報告された現在時刻を示しているのです。

つまり、簡単に言えば、このプログラムはTimeCurrent()関数を使用して現在時刻を確認し、コンソールにメッセージを表示して何を見つけたかを教えてくれます。

図2:MT5でコードを実行した結果

では、理解を深めるために、別の例を見てみましょう。ここでは、TimeCurrent()関数の使い方について掘り下げていきます。現在のサーバーの時刻が、あらかじめ定義された魔法の瞬間に一致するかどうかを確認するシナリオを説明します。これはMQL5の時間関数の理解を深めるのに役立つでしょう。また新たなコーディングの冒険にご期待ください。

例:

void OnStart()
  {

// Declaration of datetime variable
   datetime magicalClock;

// Assigning a special date and time to our magical clock
   magicalClock = D'2024.01.15 12:30:00';

// Check if TimeCurrent is equal to our magical clock
   if(TimeCurrent() == magicalClock)
     {
      Print("The magic moment has arrived!");
     }
   else
     {
      Print("Not yet the magic time...");
     }

  }

説明

datetime magicalClock;

  • datetimeデータ型の変数magicalClockを宣言します。

magicalClock = D'2024.01.15 12:30:00';

  • datetimeリテラル用の接頭辞「D」を使用して、magicalClockに特定の日時(2024年1月15日午後12時30分)を割り当てます。

if (TimeCurrent() == magicalClock) { ... }

  • 現在のサーバー時刻(TimeCurrent())と定義済みのmagicalClockを比較します。それらが等しければ、コンソールに「The magic moment has arrived!」と表示され、そうでなければ「Not yet the magic time...」と表示されます。

MQL5とアルゴリズム取引を探求する過程で、特に初心者にとっては、ある概念が分かりにくいと感じるのは普通のことです。学習プロセスには、質問し、説明を求めることが含まれることを忘れないでください。配列、カスタム関数、プリプロセッサ、イベント処理、その他私たちが取り上げたプログラミングのトピックなど、どんなことでも遠慮なくお尋ねください。

どんな技術もそうであるように、プログラミングは、初めのうちは不可解なものですが、交流と協力を通じて、私たちはその道のりをより楽しく、理解しやすいものにすることができます。私たちの学習体験の独自性は、質問し、ディスカッションすることにあります。学習プロセスを受け入れ、どんどん質問して、アルゴリズム取引の世界を一緒に解き明かしましょう。

3.2.2.TimeGMT

魔法の時計が標準時で動作するように、MQL5のTimeGMT()はグリニッジ標準時(GMT)で動作することができます。GMTは、世界中の人々が基準として使用し、世界的に標準化された時間の尺度を保証する世界共通の時計だと考えてください。この機能により、世界規模での行動の調整と同期化が促進され、アルゴリズム取引の世界における時間関連のオペレーションに共通の基盤が提供されます。

MQL5のTimeGMT関数は、クライアント端末が動作しているコンピュータのローカル時間に基づいて、夏時間(DST)で調整した現在のグリニッジ標準時(GMT)を返します。この調整により、返されるGMTは現在夏時間が適用されているかどうかを考慮するようになります。

たとえ

グリニッジという特別な町に不思議な時計があるとしましょう。この町はスーパーヒーローの本部みたいなものです。グリニッジにある魔法の時計の時刻は、世界中の誰もが従うスーパーヒーローの時刻とされています。 さて、異なる場所に友達がいて、それぞれ現地時間があるとしましょう。バーチャルのプレイデートやゲームを計画しようとすると、時計の時間がみんな違うので、ちょっと面倒なことになります。

GMTが救いの手を差し伸べます。みんなを同期するためのスーパーヒーローの時計のようなものです。GMTとはグリニッジにある不思議な時計の時刻のことで、グリニッジの時刻が分かれば、世界のどこにいても、友達との行動をより簡単に調整することができます。つまり、GMTは、異なる場所に住む人々が、いつ一緒に行動するかを合意するためのスーパーヒーローの時間のようなものなのです。

私たちのスーパーヒーローであるグリニッジの町では、1年の特定の期間に魔法の時計を速くしたり遅くしたりすることがあります。これは、彼らの時計を特別にパワーアップさせるようなものです。早める場合は夏時間と呼ばれ、遅くする場合は通常時間となります。 さて、世界中の友達たちがグリニッジからのスーパーヒーローの時刻を知りたいとき、魔法の時計が夏時間モードになっているかどうかを認識する必要があります。MQL5のTimeGMT()関数は、魔法の時計が現在夏時間モードかどうかを考慮して、スーパーヒーローの時間を教えてくれるメッセンジャーのようなものです。

プログラミングにおいて、この情報はトレーダーやアルゴリズムがグリニッジのスーパーヒーロー時計に加えられた調整を考慮しながら正確に時間を把握するのに役立つため、非常に重要です。つまり、TimeGMT()は、魔法の町で夏時間が適用されているかどうかを考慮して、正しいスーパーヒーローの時間を配信する信頼できるメッセンジャーなのです。

例:

void OnStart()
  {

// Declaration of a variable to store GMT time
   datetime gmtTime;

// Assigning the current GMT time to the variable
   gmtTime = TimeGMT();

// Printing the GMT time
   Print("Current GMT Time: ", TimeToString(gmtTime));

  }

説明

datetime gmtTime;

  • この行は、datetime型のgmtTimeという名前の変数を宣言します。datetimeは、日付と時刻の値を表すために使用されるMQL5のデータ型です。

gmtTime = TimeGMT();

  • この行は、現在のGMT時間をgmtTime変数に代入します。TimeGMT()関数は、現在のGMT時間を取得するために呼び出されます。

Print("Current GMT Time: ", TimeToString(gmtTime));

  • この行では、Print関数を使用してコンソールにメッセージを表示しています。これは、CurrentGMTTime:というテキストの後に、TimeToString(gmtTime)を使用して文字列に変換したGMT時間を表示します。

要約すると、このコードスニペットはGMT時間を格納する変数を宣言し、その変数に現在のGMT時間を代入し、コンソールに現在のGMT時間のメッセージを表示します。

3.2.3.TimeLocal

MQL5のTimeLocal()関数は、のコンピュータのローカル時間に時計を設定するようなものです。これは、特定の地理的位置の時刻を知るのに役立ちます。TimeLocal()を使用すると、グローバルタイムゾーンを調整することなく、コンピュータのシステムクロック通りの時刻を取得することになります。

例えば、ニューヨークにいて、コンピュータの時計がニューヨーク時間に設定されているとしましょう。TimeLocal()を使えば、コンピュータの時計に基づいた現在時刻が表示されます。これにより、日常生活や現地時間の設定に簡単に関連付けることができます。この関数は、世界的な変動を気にすることなく、自分のタイムゾーンの文脈で時間を操作したい場合に便利です。

たとえ

時間を教えてくれる魔法の時計があるとしましょう。MQL5のTimeLocal関数は、魔法の時計に、自分がいる場所の時刻を尋ねるようなものです。 魔法の時計が部屋の時間を認識するのと同じように、周囲の環境に応じた時間を表示します。

例:

void OnStart()
  {

// Declaration of a variable to store local time
   datetime localTime;

// Assigning the current local time to the variable
   localTime = TimeLocal();

// Printing the local time
   Print("Current Local Time: ", TimeToString(localTime));

  }

説明

このコードは、コンピュータにTimeLocal()関数を使い、特定の場所の時刻を調べるように要求します。すると、その時間が画面に表示されます。つまり、魔法の時計がコンピュータプログラムだとしたら、こうやって部屋で時間を教えてくれるのです。

図3:MT5でコードを実行した結果

3.2.4.TimeGMTOffset

MQL5のTimeGMTOffset()関数を使用すると、現地時間とGMT(グリニッジ標準時)の時差を求めることができます。これは、自分の時間が世界の標準時と比べて何時間進んでいるのか、あるいは遅れているのかを尋ねているようなものです。

TimeGMTOffset = TimeGMT() − TimeLocal()

TimeGMTOffsetは、GMT(グリニッジ標準時)と取引端末が動作しているコンピュータのローカル時間との時差(オフセット)を秒単位で直接提供する便利な関数です。

たとえ

さて、時間を教えてくれる魔法の時計があるとしましょう。ただし、この時計の動作は少し異なります。この時計は時刻を知らせるだけでなく、あなたの時刻と世界中の誰もが従う特別な時刻との差も教えてくれます。この特別な時間は、グリニッジ標準時(GMT)と呼ばれる、誰もが同意する時間です。 今、この特別な時間から自分の時間がどれだけ違うかを知るために難しい計算をする代わりに、TimeGMTOffsetという魔法のボタンがあります。このボタンを押すと、あなたの時間がこの世界共通の時間より何秒進んでいるか、あるいは何秒遅れているかという答えが直接表示されます。

違う場所にいる友達や、違うタイムゾーンにいる魔法生物と、同じ時間に何かを計画したいとき、この魔法のボタンがあれば、すべてを自分で計算する必要なく、会う時間を割り出すことができます。どこにいても、全員の認識がそろうようにするヘルパーがいるようなものです。

例:

void OnStart()
  {

// Declaration of variables
   int gmtOffsetSeconds, gmtOffsetMinutes;

// Assigning the current GMT offset to the variable in seconds
   gmtOffsetSeconds = TimeGMTOffset();

// Converting seconds to minutes
   gmtOffsetMinutes = gmtOffsetSeconds / 60;

// Printing the GMT offset in minutes
   Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);

  }

説明

int gmtOffsetSeconds, gmtOffsetMinutes;

  • ここでは2つの変数(gmtOffsetSecondsとgmtOffsetMinutes)を宣言し、それぞれGMTオフセットを秒と分で格納します。

gmtOffsetSeconds = TimeGMTOffset();

  • TimeGMTOffset()関数を使用して現在のGMTオフセットを秒単位で取得し、変数「gmtOffsetSeconds」に代入しています。

gmtOffsetMinutes = gmtOffsetSeconds / 60;

  • GMTオフセットを秒から分に変換するため、gmtOffsetSecondsを60で割り、その結果をgmtOffsetMinutesに格納します。

Print("Current GMT Offset (in minutes): ", gmtOffsetMinutes);

  • 最後に、GMTオフセットを分単位でコンソールに表示します。Print関数は、引用符で囲まれたテキストと、計算されたGMTオフセットを分単位で表示します。

このコードでは、まずTimeGMTOffset()を使用してGMTオフセットを秒単位で取得し、その値を60で割って分に変換します。最後に、GMTオフセットを分単位で表示します。このコードをMQL5スクリプトで実行すると、GMTオフセットが分単位で表示されます。

図4:MT5でコードを実行した後の結果

GMTオフセット-60は、現地時間がGMTより60分進んでいることを示します。

3.2.5.TimeToStruct

MQL5では、TimeToStruct()関数を使用してタイムスタンプ(1970年1月1日からの秒数で表される)を構造化形式に変換します。この構造化された形式は、MqlDateTime定義済み構造体によって表現され、年、月、日、時、分、秒の個別のメンバを含んでいます。

例:

void OnStart()
  {

// Declare an MqlDateTime variable
   MqlDateTime myTime;

// Convert the current timestamp to a structured format
   TimeToStruct(TimeCurrent(), myTime);

// Access individual components of the structured time
   Print("Current Year: ", myTime.year);
   Print("Current Month: ", myTime.mon);
   Print("Current Day: ", myTime.day);
   Print("Current Hour: ", myTime.hour);
   Print("Current Minute: ", myTime.min);
   Print("Current Second: ", myTime.sec);

  }

上の例では、TimeCurrent()は現在のタイムスタンプを返し、TimeToStructはそのタイムスタンプをMqlDateTime型変数myTimeに格納された構造化形式に変換します。変換後、myTime構造体のメンバーを使用して、時間の特定の構成要素(年、月、日など)にアクセスできます。

注:MqlDateTimeについては、この記事が進むにつれてさらに説明を続けます。

たとえ

TimeToStruct()のマジックをもう少し掘り下げてみましょう。1970年(コンピュータ計時における魔法のスタート地点のようなもの)に時を刻み始めた膨大な秒の貯蔵庫があるとしましょう。さて、これらの秒数は徐々に増えてきており、この大きな数字が何時間、何分、何日、さらには何年になるのかを知りたいとします。

ここでTimeToStruct()が登場し、膨大な秒数の山を、より人間にとって使いやすい形式に分解します。10万秒などという途方もない数字があっても、TimeToStruct()はそれが約27時間46分40秒だと教えてくれます。 これは、1970年という魔法のようなスタート地点からのすべてを考慮して、生の秒数を時間の詳細な内訳に変換する魔法の計算機を持っているようなものです。

MqlDateTimeという魔法のタイムカプセルがあると想像してください。それに特定の瞬間(現在時刻など)を入力すると、タイムカプセルが開いて、きちんと整理された詳細が表示されます。TimeToStruct()関数は、このタイムカプセルに魔法をかけるようなもので、1970年からの生の秒数を美しく整理された情報の集合に変えます。

そのため、秒数をカウントしている場合、TimeToStruct()が魔法の杖を振ると、突然、年、月、日、時、分、秒、曜日、年を明確に理解できるようになり、すべてがMqlDateTime構造体にきれいにまとまります。これは、謎めいたタイムコードを読みやすい日付と時刻の本に変えるようなもので、プログラムをより多機能で時間に精通したものにします。

例:

void OnStart()
  {

// Declare an MqlDateTime variable
   MqlDateTime myTime;

// Convert the number of seconds into a structured format
   TimeToStruct(100000, myTime);

// Now, myTime will tell us the breakdown since 1970
   Print("Years: ", myTime.year);
   Print("Months: ", myTime.mon);
   Print("Days: ", myTime.day);
   Print("Hours: ", myTime.hour);
   Print("Minutes: ", myTime.min);
   Print("Seconds: ", myTime.sec);

  }

説明

MqlDateTime myTime;

  • MqlDateTime構造体を使用して、myTimeという不思議な時計を宣言します。

TimeToStruct(100000, myTime);

  • ここでは、TimeToStructという呪文を唱えて、秒数(この場合は100,000)をmyTimeに格納されている構造化形式に変換します。これは、魔法の時計に特定の瞬間を解読するように言うようなものです。

Print("Years: ", myTime.year);

  • 次に、この魔法の時計に、year属性を使用して1970年以降の年数を表示させます。月、日、時間、分、秒についても同様です。

もっと簡単に言えば、ある一瞬(1970年からの10万秒)の時間を、魔法の時計に年、月、日などに分解してもらうようなものです。これは、時間をより詳細に、構造的に理解する方法です。なんて魅惑的なのでしょう。

コーディング愛好家の皆さん、MQL5で時間関数の複雑さをナビゲートする際には、すべての質問が理解の新たな領域を開く鍵であることを忘れないでください。この旅は、コードの魔法の森をさまようような、一歩一歩の探検なのです。考え込んでいる場合は、ためらわずに質問してください。質問は知識の領域へと私たちを導く灯火なのです。

注:今日のMqlDateTimeについての洞察は、ほんの始まりに過ぎません。定義済みの構造体をめぐる冒険は、次回の記事でさらに展開されます。


結論

この章を終えるにあたり、MQL5における構造体、クラス、そして時間の概念という興味深い領域を掘り下げてきました。学習はダイナミックな旅であり、質問は未知の領域を進むための羅針盤であることを忘れてはなりません。岐路に立たされたときは、ためらわずに質問してください。好奇心は進歩を促すエンジンです。次回は、MQL5のプログラミングの魔法をさらに紐解いていきますのでお楽しみに。質問は歓迎されるだけでなく、より深い理解のきっかけとなります。知識の探求を続けましょう。


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

データサイエンスと機械学習(第19回):AdaBoostでAIモデルをパワーアップ データサイエンスと機械学習(第19回):AdaBoostでAIモデルをパワーアップ
AdaBoostは、AIモデルのパフォーマンスを向上させるために設計された強力なブースティングアルゴリズムです。AdaBoostはAdaptive Boostingの略で、弱い学習機をシームレスに統合し、その集合的な予測力を強化する洗練されたアンサンブル学習技法です。
MQL5入門(第3部):MQL5のコア要素をマスターする MQL5入門(第3部):MQL5のコア要素をマスターする
この初心者向けの記事では、MQL5プログラミングの基本を解説します。配列、カスタム関数、プリプロセッサ、イベント処理など、すべてのコードをわかりやすく説明し、すべての行にアクセスできるようにします。すべてのステップで理解を深める独自のアプローチで、MQL5のパワーを引き出しましょう。この記事はMQL5をマスターするための基礎となるもので、各コード行の説明に重点を置き、明確で充実した学習体験を提供します。
データサイエンスと機械学習(第20回):アルゴリズム取引の洞察、MQL5でのLDAとPCAの対決 データサイエンスと機械学習(第20回):アルゴリズム取引の洞察、MQL5でのLDAとPCAの対決
MQL5取引環境での適用を解剖しながら、これらの強力な次元削減テクニックに隠された秘密を解き明かしていきます。線形判別分析(LDA)と主成分分析(PCA)のニュアンスを深く理解し、戦略開発と市場分析への影響を深く理解します。
MQL5入門(第2部):定義済み変数、共通関数、制御フロー文の操作 MQL5入門(第2部):定義済み変数、共通関数、制御フロー文の操作
連載第2部の光り輝く旅に出かけましょう。これらの記事は単なるチュートリアルではなく、プログラミング初心者と魔法使いが共に集う魔法の世界への入り口です。この旅を本当に魔法のようなものにしているのは何でしょうか。連載第2部は、複雑な概念を誰にでも理解できるようにした、さわやかなシンプルさが際立っています。読者の質問にお答えしながら、双方向的に私たちと関わることで、充実した個別学習体験をお約束します。MQL5を理解することが誰にとっても冒険となるようなコミュニティを作りましょう。魔法の世界へようこそ。