English

MQL5の書き方(for MQL4デザイナー)

 

 

ポジションエントリー(cTraderを使用した発注方法)

MQL5でコードを記述する際には、つまづきやすい点の一つに発注方法が挙げられます。
MQL4とは大きく異なる点として発注から約定までは「Order」として扱われ、約定したものは「Position」として扱われること、構造体を用いて値を渡すこと、ネッティング口座とヘッジ口座が存在することなどがあります。
OrderSend()関数
MQL5における「OrderSend()」関数は、指定された「MqlTradeRequest」構造体を渡し、結果が指定された「MqlTradeResult」構造体に返されるため、コーディングが複雑になることがあります。
さらに、業者によって渡す値が異なる場合があるため、別の処理を行う必要があります。

 

MQL4 MQL5
int OrderSend(
    string   symbol,        
    int      cmd,               
    double  volume,             
    double  price,             
    int      slippage,           
    double  stoploss,           
    double  takeprofit,        
    string   comment=NULL,       
    int      magic=0,           
    datetime expiration=0,       
    color  arrow_color=clrNONE);
                                    
bool  OrderSend(
  MqlTradeRequest&  request,  
  MqlTradeResult&   result);          
struct MqlTradeRequest{
  ENUM_TRADE_REQUEST_ACTIONS   action;         
  ulong      magic;          
  ulong      order;          
  string      symbol;          
  double     volume;          
  double     price;          
  double     stoplimit;      
  double     sl;              
  double     tp;              
  ulong      deviation;     
  ENUM_ORDER_TYPE            type;           
  ENUM_ORDER_TYPE_FILLING  type_filling;    
  ENUM_ORDER_TYPE_TIME     type_time;     
  datetime   expiration;      
  string      comment;        
  ulong      position;       
  ulong      position_by;};            
struct MqlTradeResult {
  uint       retcode;       
  ulong      deal;           
  ulong      order;         
  double     volume;         
  double     price;         
  double     bid;            
  double     ask;           
  string     comment;
  uint       request_id;      
  int        retcode_external; }; 
cTradeライブラリ

MQL5には多数の標準ライブラリが用意されており、その中には「cTrade」ライブラリも含まれています。
このライブラリを使用することで、MQL4に近い形で発注を行うことが可能となります。
特に、「cTrade」ライブラリの「PositionOpen()」関数は、MQL4よりもオプション数が少なく、簡潔なコードで発注を行うことができます。

MQL4 MQL5
int  OrderSend(
   string   symbol,        
   int      cmd,                
   double   volume,             
   double   price,             
   int      slippage,           
   double   stoploss,           
   double   takeprofit,        
   string   comment=NULL,       
   int      magic=0,           
   datetime expiration=0,       
   color    arrow_color=clrNONE);   
bool  PositionOpen(
  const string     symbol, 
  ENUM_ORDER_TYPE  order_type,   
  double           volume, 
  double           price,    
  double           sl,    
  double           tp,     
  const string     comment="" )    
使用例
#include 
CTrade Trade;
MqlTick Tick;
input int MAGIC = 5963;
input double LOT = 0.1;
input string COMMENT = "test";
void OnTick() {
    SymbolInfoTick(_Symbol, Tick);
    double SL = NormalizeDouble(Tick.bid - 1, _Digits);
    double TP = NormalizeDouble(Tick.bid + 1, _Digits);
    //発注 ※無限に発注します
    Trade.SetExpertMagicNumber(MAGIC);
    Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LOT, Tick.bid, 0, 0, COMMENT);
}
                    

 

解説)
#include
 cTradeのライブラリを呼び出します。

CTrade Trade;
MqlTick Tick;
 Trade , Tickの使用を宣言します。

SymbolInfoTick(_Symbol, Tick);
 宣言したTickに現在の値を入れます。今回はBidの値を使用します。
Bidの値はTick.bidに代入されます。

Trade.SetExpertMagicNumber(MAGIC);
 マジックナンバーを発注前に指定します。
※PositionOpen()関数にはマジックナンバーを入れるオプションがありません。

Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, LOT, Tick.bid, 0, 0, COMMENT);
宣言したTradeのPositionOpen()を使用して発注します。

戻り値は基本構造体のチェックが成功した場合は true、それ以外の場合は falseです。発注が成功したかどうかではありません。

「cTrade」ライブラリを使用することで、MQL4に近い感覚で発注を行うことが可能となります。
さらに、このライブラリを使用することで、業者間の差異を気にすることなく、簡単かつスムーズに発注を行うことができます。

執筆者
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。