【MQL5】すぐに使える、ライブラリーの利用方法

EA制作お役立ち記事

※【おススメのMT5MQL5対応のFX業者】

MQL5にて開発した、MT5EAを実運用するにあたり、

当サイトでは以下のFX業者をおススメいたします。

外為ファイネスト

アヴァトレードジャパン

フィリップ証券

スポンサーリンク
スポンサーリンク

ライブラリーとは?

MQL5におけるライブラリーとは

他のプログラムにも、再利用できる汎用性の高い関数をひとまとめにしたファイル

のことを指します。

ライブラリーを利用することによって、

  • 毎回書いているような記述の手間を省くことができる。
  • 毎回使いまわしているものなので、記述ミスの可能性を減らせる。
  • メインプログラムのコードをシンプルでスリムにできる。

といったメリットがあります。

また、EAに利用中のライブラリファイルにマイナーチェンジがあった場合でも、(関数のパラメータ自体が変わってしまう等のケースを除けば)、利用先のEAをリコンパイルする必要がありません

上記に挙げたようなメリットはインクルードファイル(.mqh)にも当てはまるのですが、

いくつか違う点があります。

インクルードファイルについての詳細を知りたい方は↓の記事をご覧ください。

ライブラリーとインクルードの相違点

まず文法的な面でいえば、メインプログラムでの呼び出し方法が異なります。

インクルードファイルの場合

1: #include命令 <ファイル名>

のようにインクルード命令の後にファイル名を記述して両端をアングルブラケット(<>)で挟む

あるいは

2: #include命令 ”ファイル名”

のようにインクルード命令の後にファイル名を記述して両端をダブルクォーテーション(“)で挟む

という記述をします。

一方でライブラリーの方ですが、インポートする(=ライブラリーを利用する側)本プログラム側と、エクスポートする(ライブラリーファイル側)両方に、必要な記載があります。まずインポートする側では、

関数をインポートする本プログラム

#import “実行ファイル名”

インポートする関数

#import

と#import命令 をサンドイッチする形になるような記述をします。↓こんな感じです。

続いてエクスポートする側であるライブラリーファイルに必要な記述は

#property library

というライブラリー利用命令と、下図のように

このように、エクスポートする関数名の後にexportコマンドを付け加える必要があります。

ライブラリファイル内に複数のエクスポートしたい関数がある場合、export コマンドはそれら全ての関数に付与する必要があります。

ちょっとややこしく感じるかもしれませんが、順を追ってライブラリー利用プログラムを作っていきましょう。

またもう一つ上げられるインクルードファイルとライブラリーファイルの相違点として、

ライブラリーファイルは他のユーザーにソースコードを明示しない状態で、利用してもらうことが可能

という点が挙げられます。

自作した関数群をほかの人にも使ってもらいたい一方で、ソースコードをさらすことはしたくない、というときにはライブラリーファイルを利用するのが有用です。

ライブラリーを利用したEA制作のロードマップ

以下の手順でコードを記述していきます

  • メインプログラムのグローバル領域にライブラリー内の関数を利用する宣言を記述
  • OnTick関数内に売買に関する命令を記述
  • メインプログラムにエクスポートする関数の記述を行う

メインプログラムのグローバル領域にライブラリー関数を利用する宣言を記述

記述規則は最初に説明したように、#importでサンドイッチする形で、その中にインポートする関数を宣言していきます。今回は

GetProfitCurrencyPair()と

OpenBuyStop()

という関数をインポートします。

・・・と言っても、まだライブラリーファイルを作っていないので、現時点では定義がされていない関数群です。この時点でコンパイルしてもエラーがでてしまいます。

ライブラリーファイルの作成、インポートする関数の定義は後ほど行います。

//ライブラリーから関数をインポート
#import "OriginalLibrary.ex5"

double GetProfitCurrencyPair();
void OpenBuyStop();

#import

OnTick内に売買に関する命令を記述

売買に関する命令、と言っても今回は、細かい内容は全てライブラリーファイルの関数にやってもらうので、かなりシンプルになっているのがお分かりいただけるかと思います。

void OnTick()
  {
      //ノーポジならインポートした関数に従った買い注文を出す
      if(OrdersTotal()==0)OpenBuyStop();
     
    //インポートした関数が出力する値を格納する変数を宣言 
    double profit=GetProfitCurrencyPair();
    
    //インポートした関数が出力する値のコメント表示
    Comment("損益:  ",profit);
  
  }//void OnTick()

メインプログラムにエクスポートする関数の記述を行う

主に以下のことをライブラリーファイルに記述しています。

かなり長くなってしまいましたね。

メインプログラムと同じファイルに記述していくと、混乱しかねないのがお分かりいただけたのではないかと思います。

//ライブラリー利用宣言
#property library

//標準ライブラリーのトレードファイルを使えるようにする
#include <Trade\Trade.mqh>

// CTradeクラスのオブジェクトを宣言
CTrade trade;


//損益を計算する関数のエクスポート
double GetProfitCurrencyPair()export
{
   //利益を格納する変数を宣言
   double profitThisCurrencyPair=0;
   
   //ポジションプールを古いほうから直近に向かってチェック
   for(int icounter=PositionsTotal()-1;icounter>=0;icounter--)
   {  
      //各ポジションの通貨ペア情報を変数に格納
      string CurrencyPair=PositionGetSymbol(icounter);
      
      //チャートの通貨ペア情報がポジションの通貨ペアと一致していたら
      if(_Symbol==CurrencyPair)
      {
         //各ポジションの損益情報を変数に格納
         double positionProfit=PositionGetDouble(POSITION_PROFIT);
         //各ポジションのスワップ情報を変数に格納
         double positionSwap=PositionGetDouble(POSITION_SWAP);
         
         //ポジション毎の損益とスワップを合計し、積算していく
         profitThisCurrencyPair+=positionProfit +positionSwap;
      }//if(_Symbol==CurrencyPair)
      
   }//for(int icounter=PositionsTotal()-1;icounter>=0;i--)
   
   //正規化
   profitThisCurrencyPair=NormalizeDouble(profitThisCurrencyPair,2);
   
   //損益を戻り値として返す
   return profitThisCurrencyPair;
   
   
}//double GetProfitCurrencyPair()export


//+------------------------------------------------------------------+
//ストップオーダー関数のエクスポート
void OpenBuyStop() export
{
   //現在値(買い)情報の取得と正規化
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   //残高情報を取得
   double balance=AccountInfoDouble(ACCOUNT_BALANCE);
   
   //有効証拠金情報を取得
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);
   
   if(equity==balance)//残高と有効証拠金が同じなら
   {
      trade.BuyStop(0.01,Ask+100*_Point,NULL,Ask-200*_Point,Ask+200*_Point,ORDER_TIME_GTC);
   }//if(equity==balance)
   

}//void OpenBuyStop() export
//+------------------------------------------------------------------+

★注意:↑のソースコードには発注回路が含まれています。

ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座お試しいただくようお願いします。


AccountInfoDouble関数
については↓をご覧ください。

全体のプログラムコード

全体のプログラムコードは以下のようになります。

メインプログラム↓

#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property strict 
//+-----------------------------

//ライブラリーから関数をインポート
#import "OriginalLibrary.ex5"

double GetProfitCurrencyPair();
void OpenBuyStop();

#import


void OnTick()
  {
      //ノーポジならインポートした関数に従った買い注文を出す
      if(OrdersTotal()==0)OpenBuyStop();
     
    //インポートした関数が出力する値を格納する変数を宣言 
    double profit=GetProfitCurrencyPair();
    
    //インポートした関数が出力する値のコメント表示
    Comment("損益:  ",profit);
  
  }//void OnTick()
//+------------------------------------------------------------------+

ライブラリーファイル↓

//+------------------------------------------------------------------+
//|                                              OriginalLibrary.mq5 |
//|                                                         MQL5ssei |
//|                                    https://mqlinvestmentlab.com/ |
//+------------------------------------------------------------------+
#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property version   "1.00"

//ライブラリー利用宣言
#property library

//標準ライブラリーのトレードファイルを使えるようにする
#include <Trade\Trade.mqh>

// CTradeクラスのオブジェクトを宣言
CTrade trade;


//損益を計算する関数のエクスポート
double GetProfitCurrencyPair()export
{
   //利益を格納する変数を宣言
   double profitThisCurrencyPair=0;
   
   //ポジションプールを古いほうから直近に向かってチェック
   for(int icounter=PositionsTotal()-1;icounter>=0;icounter--)
   {  
      //各ポジションの通貨ペア情報を変数に格納
      string CurrencyPair=PositionGetSymbol(icounter);
      
      //チャートの通貨ペア情報がポジションの通貨ペアと一致していたら
      if(_Symbol==CurrencyPair)
      {
         //各ポジションの損益情報を変数に格納
         double positionProfit=PositionGetDouble(POSITION_PROFIT);
         //各ポジションのスワップ情報を変数に格納
         double positionSwap=PositionGetDouble(POSITION_SWAP);
         
         //ポジション毎の損益とスワップを合計し、積算していく
         profitThisCurrencyPair+=positionProfit +positionSwap;
      }//if(_Symbol==CurrencyPair)
      
   }//for(int icounter=PositionsTotal()-1;icounter>=0;i--)
   
   //正規化
   profitThisCurrencyPair=NormalizeDouble(profitThisCurrencyPair,2);
   
   //損益を戻り値として返す
   return profitThisCurrencyPair;
   
   
}//double GetProfitCurrencyPair()export


//+------------------------------------------------------------------+
//ストップオーダー関数のエクスポート
void OpenBuyStop() export
{
   //現在値(買い)情報の取得と正規化
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   //残高情報を取得
   double balance=AccountInfoDouble(ACCOUNT_BALANCE);
   
   //有効証拠金情報を取得
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);
   
   if(equity==balance)//残高と有効証拠金が同じなら
   {
      trade.BuyStop(0.01,Ask+100*_Point,NULL,Ask-200*_Point,Ask+200*_Point,ORDER_TIME_GTC);
   }//if(equity==balance)
   

}//void OpenBuyStop() export
//+------------------------------------------------------------------+

プログラムの挙動は以下のようになります。

最後までお読みいただきありがとうございました<(_ _)>

★注意再掲:ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、

デモ口座でお試しいただくようお願いします。コード内に発注記述が入っています

リアル口座に導入するといきなりポジションを持ってしまいます。ソースコードを利用されたことによって金銭的被害を被られたとしても当方では責任を負うことができません。

詳しくは免責事項をご確認ください。

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

———————————————————————————-

※【おススメのMT5MQL5対応のFX業者】

外為ファイネストに関する記事は↓をご覧ください。

アヴァトレードジャパンに関する記事は↓をご覧ください。

フィリップ証券に関する記事は↓をご覧ください。

コメント

タイトルとURLをコピーしました