English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
MQL5 クックブック:異なるプリントモードの使用

MQL5 クックブック:異なるプリントモードの使用

MetaTrader 5 | 7 12月 2015, 08:03
639 0
Anatoli Kazharski
Anatoli Kazharski

はじめに

本稿は MQL5 クックブックシリーズの始まりです。プログラミングの最初の一歩を踏み出そうとしている方が徐々に新しい言語の知識を得ることができるようにシンプルな例を使って始めます。私自身、とても困難だったと言える最初にトレードシステムを設計しプログラムする上での努力を覚えています。それが私の人生で最初のプログラム言語だったという事実があります。そのときまで私はプログラミングに向いていないし、理解することはほとんど無理だろうと考えたものでした。

それでも思ったより簡単であることが判り、かなり複雑なプログラムを作成できるまで数か月しかかかりませんでした。それについては記事Y"Limitless Opportunities with MetaTrader 5 and MQL5"で詳細を知ることができます。

ここではExpert Advisors の初心者開発者wをプログラム手順、シンプルなものから複雑なものへ作り上げていくよう導いていこうと思います。MetaEditor 5 メニューの「ヘルプ」にある情報をコピーするつもりはありませんのでF1を頻繁に押すつもりでいてください。同時に本シリーズは数多くの例、すぐに使える関数、そのままでまたはカスタマイズしてみなさんの開発に利用できるスキームを提供します。

では始めましょう。本稿ではさまざまなモードでいくつかのシンボルプロパティをプリントするシンプルなスクリプトを作成します。プログラム開発時特に学習過程の初期ではプログラムが期待どおり応答しないということがよくあります。そのような場合計算に使われる特定の変数値を確認する必要があります。われわれの場合、関数 Print()、 Comment()、Alert()を使用する3種類の方法を細かく見ていきます。そしてのちにご自身でどのメソッドがみなさんにとって便利か判断することができるでしょう。


MQL5 ウィザード

私はスクリプトで MQL5 の学習を始めました。ひじょうに簡単で迅速です。スクリプトがロードされるとき、作成した関数を実行しチャートから削除されます。これによりオンザゴーの実験をし、進むべき方向がわかります。

MetaTrader 5 トレードターミナルをまだインストールしていないなら、いますぐインストールできます。インストールしたらターミナルを起動し、F4を押して MetaEditor 5 を開きます。このボタンは MetaTrader 5 トレードターミナルと MetaEditor 5間ですばやく切り替えをするのに使うことができます。またターミナルのツールバーで適切なボタンをクリックして MetaEditor 5 を起動することもできます。かならずトレードターミナルと MetaEditor 5 の「ヘルプ」(F1)を利用してプログラムインターフェースをじっくりと学習してください。というのも特定の項目については軽く触れるだけになるだろうからです。

MetaEditor 5 を起動し、Ctrl+N または MetaEditorパネルのメインメニュー の下にある新規 ボタンを押します。MQL5 ウィザードウィンドウが開き、そこで作成したいプログラムタイプを選択することができます。われわれの場合、スクリプトを選び次へを押します。

図1 MQL5 ウィザード-スクリプト

図1 MQL5 ウィザード-スクリプト

それからスクリプト名(ファイル名)を入力します。デフォルトではスクリプトは Metatrader 5\MQL5\Scripts\file_name.mq5に作成されています。そのディレクトリ内で目的に応じてファイルをグループ化する別のフォルダを作成することもできます。

図2 MQL5 ウィザード-ファイル名

図2 MQL5 ウィザード-ファイル名

この時点で必要に応じて入力パラメータを追加することもできます。すべてが設定され準備ができたら 終了をクリックします。テンプレートを用いて新規ドキュメントが作成され、スクリプトを進めることができます。

//+------------------------------------------------------------------+
//|                                                   PrintModes.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    
  }
//+------------------------------------------------------------------+


コードの書き込み

ダブルスラッシュに続く部分はすべてコメントでプログラム実行に影響は与えません。コードに詳しいコメントを付けるのはつねにお薦めです。それによりとくに長い間が空いた後プログラムロジックを理解するのがかなり簡単になるからです。

上記コードの最初の3行の#property後にくるものはすべてプログラムのプロパティに関連します。各関数についてのより詳しい情報とプロパティはMQL5 参考資料にあります。任意の関数の説明を簡単に閲覧するにはその関数をダブルクリックして選択しF1を押します。「ヘルプ」ウィンドウが開き、選択した関数の説明が表示されます。

それに続くのはメインのスクリプト関数-OnStart()で、それはその他の関数と計算を含むものです。

プログラム実行前に必要な情報をプリントする方法を選択する機能を入れる必要があります。それはドロップダウンリストから必要なモードを選択することができる外部パラメータを持つということです。またプログラム実行前にスクリプトの外部パラメータを持つウィンドウを開く別のプロパティ(#property)を指定する必要があります。このプロパティはscript_show_inputsです。それをコードにすでにあるその他プロパティの一番下に追加します。

#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
//---

外部パラメータにドロップダウンリストを持つためにすべてのモード一覧を作成する必要があります。このコードをプログラムのプロパティの後に入れます。

// ENUMERATION
enum ENUM_PRINT_MODE
  {
   PRINT   = 0,
   COMMENT = 1,
   ALERT   = 2
  };
//---

このあとにはスクリプトの外部パラメータであるPrintModeだけがきます。

// INPUT PARAMETERS
input ENUM_PRINT_MODE printMode=PRINT; // Print mode

入力パラメータはプログラムの冒頭にあるルールで変数タイプの目に入れられる外部パラメータを決定する input 修飾子を伴います。今スクリプトを実行するなら、プログラムウィンドウが開きPrint Mode パラメータのドロップダウンリストからプリントモードを選択することができます。

図3 スクリプトパラメータのウィンドウ

図3 スクリプトパラメータのウィンドウ

変数を作成しそれになんらかの値(われわれの場合、シンボルデータをプリントします)を割り当てのちに外部パラメータでユーザーが指定するモードを用いてプリントします。このためにメイン関数OnStart() で呼ばれる別のユーザー関数PrintSymbolProperties() を作成します。

関数作成にはただ以下のコードを挿入するだけです。

//+------------------------------------------------------------------+
//| PRINTING SYMBOL PROPERTIES                                       |
//+------------------------------------------------------------------+
void PrintSymbolProperties()
  {
    
  }

返される値タイプは関数名の前に指定する必要があります。あるいはわれわれの場合のように関数がなにも返さなければ voidを入れます。そして PrintSymbolProperties() 関数の本文、カッコの中に残りのコードを書きます。まず変数を作成します。

string symb_symbol    = "";  // Symbol
int    symb_digits    = 0;   // Number of decimal places

int    symb_spread    = 0;   // Difference between the ask price and bid price (spread)
int    symb_stoplevel = 0;   // Stop levels
double symb_ask       = 0.0; // Ask price
double symb_bid       = 0.0; // Bid price

変数の型はそれがわりあてられるデータの種類によって異なる。さて、これらの変数に数値を代入してみよう。シンボルプロパティーを得るために、MQL5は日々のデータの種類に対して特別な機能を提供している。

symb_symbol    =Symbol();
symb_digits    =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
symb_spread    =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
symb_ask       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
symb_bid       =SymbolInfoDouble(_Symbol,SYMBOL_BID);
//---

テーマを確実に十分学習するためMQL5 参考資料を利用してすべての関数とそれらが渡すパラメータをひとつずつ調べます。そこのすべてのシンボルプロパティは頻繁に参照する表に表示されます。

変数が割り当てられた値を得たので、ここでは各プリントモードに適切なコードを書くだけです。以下がその記述です。

//---
// If it says to print to the journal
   if(printMode==PRINT)
     {
      Print("Symbol: ",symb_symbol,"\n",
            "Digits: ",symb_digits,"\n",
            "Spread: ",symb_spread,"\n",
            "Stops Level: ",symb_stoplevel,"\n",
            "Ask: ",symb_ask,"\n",
            "Bid: ",symb_bid
            );
     }
//---
// If it says to print to the chart
   if(printMode==COMMENT)
     {
      int mb_res=-1; // Variable with the option selected in the dialog box
      //---
      Comment("Symbol: ",symb_symbol,"\n",
              "Digits: ",symb_digits,"\n",
              "Spread: ",symb_spread,"\n",
              "Stops Level: ",symb_stoplevel,"\n",
              "Ask: ",symb_ask,"\n",
              "Bid: ",symb_bid
              );
      //---
      // Open a dialog box
      mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION);
      //---
      // If "Yes" is clicked, remove the comments from the chart 
      if(mb_res==IDYES) { Comment(""); }
      //---
      return;
     }
//---
// If it says to print to the alert window
   if(printMode==ALERT)
     {
      Alert("Symbol: "+symb_symbol+"\n",
            "Digits: "+IntegerToString(symb_digits)+"\n",
            "Spread: "+IntegerToString(symb_spread)+"\n",
            "Stops Level: "+IntegerToString(symb_stoplevel)+"\n",
            "Ask: "+DoubleToString(symb_ask,_Digits)+"\n",
            "Bid: "+DoubleToString(symb_bid,_Digits)
            );
     }
//---

Expert Advisorの外部パラメータに PRINT を選択した場合、情報は Expert Advisorsのジャーナル(ツールボックスエキスパートタブ)にプロントされます。

図4 ツールボックス - エキスパートタブ

図4 ツールボックス - エキスパートタブ

COMMENTを選択すると、情報はチャートの左上角に表示されます。チャートに情報が表示されるとMessageBox() 関数がチャートからコメントを削除するよう指示するダイアログボックスを開きます。

図5 チャートの左上角のコメント

図5 チャートの左上角のコメント

ALERTを選択すると、スクリプト実行後依頼情報または単なるユーザーメッセージを示す警告ウィンドウが表示されます。この場合、PRINT オプションの場合同様、情報はジャーナルにもプリントされますが追加で音声通知も行われます。

図6 警告ウィンドウ

図6 警告ウィンドウ

以下は完全なスクリプトコードです。

//+------------------------------------------------------------------+
//|                                                   PrintModes.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2012, MetaQuotes Software Corp."
#property link        "http://tol64.blogspot.com"
#property description "email: hello.tol64@gmail.com"
#property version     "1.00"
#property script_show_inputs
//---
//--- ENUMERATION
enum ENUM_PRINT_MODE
  {
   PRINT   = 0,
   COMMENT = 1,
   ALERT   = 2
  };
//---
// INPUT PARAMETERS
input ENUM_PRINT_MODE printMode=PRINT; // Print mode
//---
//+------------------------------------------------------------------+
//| MAIN FUNCTION                                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   PrintSymbolProperties();
  }
//+------------------------------------------------------------------+
//| PRINTING SYMBOL PROPERTIES                                       |
//+------------------------------------------------------------------+
void PrintSymbolProperties()
  {
   string symb_symbol    = "";  // Symbol
   int    symb_digits    = 0;   // Number of decimal places
   int    symb_spread    = 0;   // Difference between the ask price and bid price (spread)
   int    symb_stoplevel = 0;   // Stop levels
   double symb_ask       = 0.0; // Ask price
   double symb_bid       = 0.0; // Bid price
//---
   symb_symbol    =Symbol();
   symb_digits    =(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   symb_spread    =(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   symb_stoplevel =(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   symb_ask       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   symb_bid       =SymbolInfoDouble(_Symbol,SYMBOL_BID);
//---
// If it says to print to the journal
   if(printMode==PRINT)
     {
      Print("Symbol: ",symb_symbol,"\n",
            "Digits: ",symb_digits,"\n",
            "Spread: ",symb_spread,"\n",
            "Stops Level: ",symb_stoplevel,"\n",
            "Ask: ",symb_ask,"\n",
            "Bid: ",symb_bid
            );
     }
//---
// If it says to print to the chart
   if(printMode==COMMENT)
     {
      int mb_res=-1; // Variable with the option selected in the dialog box
      //---
      Comment("Symbol: ",symb_symbol,"\n",
              "Digits: ",symb_digits,"\n",
              "Spread: ",symb_spread,"\n",
              "Stops Level: ",symb_stoplevel,"\n",
              "Ask: ",symb_ask,"\n",
              "Bid: ",symb_bid
              );
      //---
      // Open a dialog box
      mb_res=MessageBox("Do you want to delete comments from the chart?",NULL,MB_YESNO|MB_ICONQUESTION);
      //---
      // If "Yes" is clicked, remove the comments from the chart  
      if(mb_res==IDYES) { Comment(""); }
      //---
      return;
     }
//---
// If it says to print to the alert window
   if(printMode==ALERT)
     {
      Alert("Symbol: "+symb_symbol+"\n",
            "Digits: "+IntegerToString(symb_digits)+"\n",
            "Spread: "+IntegerToString(symb_spread)+"\n",
            "Stops Level: "+IntegerToString(symb_stoplevel)+"\n",
            "Ask: "+DoubleToString(symb_ask,_Digits)+"\n",
            "Bid: "+DoubleToString(symb_bid,_Digits)
            );
     }
  }

//+------------------------------------------------------------------+


おわりに

ここで本稿はおしまいです。前述の方法に追加してファイルにデータを書き込むこともできます。通常のテキストファイルや CSS を用いてきれいにフォーマットされた HTML レポートが可能です。しかしそれは初心者には複雑すぎます。最初は本稿で述べた方法で十分でしょう。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/638

添付されたファイル |
printmodes.mq5 (3.54 KB)
外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析 外部指標のためのアラートとコメント:外部スキャンに基づく多通貨分析
多通貨の分析と複数時間軸での分析のためのアラートこの記事では、チャートにドラッグ&ドロップしなくて、外部指標にある状態を分析する方法について説明しています。いわゆる「外部スキャニング」です。
MQL5クラウドネットワーク:まだ計算しているのですか? MQL5クラウドネットワーク:まだ計算しているのですか?
MQL5クラウドネットワークのサービスが開始してから、一年と半年ほど経過しました。この先進的な出来事はアルゴリズムによるトレーディングの新しい時代を開きました。今では、クリック数回で、トレーディング戦略の最適化のために自由に何千ものCPUを使用することができます。
行列代数ライブラリ『LibMatrix』(第一部) 行列代数ライブラリ『LibMatrix』(第一部)
著者は読者に簡単な行列代数ライブラリを紹介します。主要な機能とその特徴を見ていきます。
MQL5 Market 一周年 MQL5 Market 一周年
MQL5 Marketがサービスを開始して、1年が経過しました。新しいサービスをMetaTrader5プラットフォームにおけるテクニカルインジケーターやトレーディングシステムの巨大ストアに変える困難な一年でした。