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; }; |
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="" ) |
#includeCTrade 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株式会社代表取締役、株式会社トリロジー他で役員を兼任。