MT4が動作するパソコンさえあれば、誰でも無償でMQLを使って自動取引ツールを自作することができます。
MQLとは「Meta Quotes Language」の略で、MT4で使用できるプログラミング言語のことです。C言語をベースにしており、インジケーターや自動取引する動作を作成することが出来ます。Excelのマクロのようなイメージですね!
MT4にはMQLエディタとコンパイラが標準で搭載されており、もちろん無料で利用することが出来ます。また、実際に作成したプログラムをテストする環境も用意されています。
ここでは代表的なコードについて紹介したいと思います。詳細については別途書きたいと思っていますので、ここではかなり説明不足な内容です…。
新規に注文する
手動で新規に注文するときにもタイプ(”買い”なのか”売り”なのか)や数量、損切り、利確、スリッページなど様々な情報が必要になりますが、プログラムで実行するのも同じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
bool MyOrderSend(int type,double lots,double price,int slippage,double sl,double tp,string comment,int magic) { price=NormalizeDouble(price,Digits); sl = NormalizeDouble(sl, Digits); tp = NormalizeDouble(tp, Digits); int starttime=GetTickCount(); while(true) { if(GetTickCount()-starttime>MyOrderWaitingTime*1000) { Alert("OrderSend timeout. Check the experts log."); return(false); } if(IsTradeAllowed()==true) { RefreshRates(); if(OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magic, 0, ArrowColor[type]) != -1) return(true); int err=GetLastError(); Print("[OrderSendError] : ",err," ",ErrorDescription(err)); if(err = ERR_INVALID_PRICE) break; if(err = ERR_INVALID_STOPS) break; } Sleep(100); } return(false); } |
ポジションを決済する
保持しているポジションを決済する場合は、OrderCloseという関数を呼ぶだけですが、手動と違うのは複数ポジションを持っている場合に「どのポジションを決済するのか」という判断が必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
bool MyOrderClose(int slippage,int magic) { int ticket=0; int type = 0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS)==false) break; if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue; type=OrderType(); if(type==OP_BUY || type==OP_SELL) { ticket=OrderTicket(); break; } } if(ticket == 0) return(false); int starttime=GetTickCount(); while(true) { if(GetTickCount()-starttime>MyOrderWaitingTime*1000) { Alert("OrderClose timeout. Check the experts log."); return(false); } if(IsTradeAllowed()==true) { RefreshRates(); if(OrderClose(ticket, OrderLots(), OrderClosePrice(), slippage, ArrowColor[type]) == true) return(true); int err=GetLastError(); Print("[OrderCloseError] : ",err," ",ErrorDescription(err)); if(err==ERR_INVALID_PRICE) break; } Sleep(100); } return(false); } |
チャートが動くたび、動作させる
為替相場は常に変動していますが、値が変更されるたびに「OnTick()」という関数が呼び出されます。ざっくり言えば、この関数の中に「判断し」「注文して」場合によっては「決済する」プログラムを書けば自動取引ツールの完成です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
void OnTick() { int sig_entry = 0; // トレード可否:最初のTickだけ、ただしトレールは行う if( Volume[0] > 1 || IsTradeAllowed() == false ){ // トレール TrailingStop_Normal(Magic, SLpips); return; } // シグナル確認(買うべき相場か判断する) sig_entry=EntrySignal_SMA(Magic, 14, 21); sig_entry = FilterSignal(sig_entry); // 買うべき if(sig_entry>0) { //MyOrderClose(Slippage, Magic); MyOrderSend(OP_BUY,Lots,Ask,Slippage,SLpips,TPpips,COMMENT,Magic); } // 売るべき if(sig_entry<0) { //MyOrderClose(Slippage, Magic); MyOrderSend(OP_SELL,Lots,Bid,Slippage,SLpips,TPpips,COMMENT,Magic); } } |
上の例ではシグナルとして移動平均線(SMA)を使用して判断する関数を別に作成して呼び出しています。移動平均線を14と21で引き、ゴールデンクロスで「買うべき」、デッドクロスで「売るべき」と判断しています。OnTick()ごとに呼び出すと正しい判断ができないため、ローソクが完成したときに判断するようにしています。ただし、トレールについてはTickごとに更新したいので、関数を呼び出してOnTickを終了しています。
実際にはもっと複雑なシグナル確認があったり、例えば「買うべき」と判断されても今持っているポジションの数や含み損益を加味するなど、作りこむ必要があります。
作ったプログラムは過去の数値を使用してMT4上でテストすることができます(バックテスト)。まずはバックテストでよい結果を残せるようになってから実際の相場で稼働させてテスト(フォワードテスト)させるのが一般的です。
MT4はFX取引ツールのデファクトスタンダードと呼べるものですが、そこで使用されるMQLも標準的なツールと言っても過言ではありません。コミュニティも活発で書籍も多く発売されているため、誰でも簡単に始めることができます。
MT4で使用するMQLを「MQL4」、MT5で使用するMQLを「MQL5」と区別しますが、バージョンの違いで使用できる関数などが変わってくるので注意が必要です。MT5はまだまだ普及していないため、MT4をターゲットに作るのが良いかも知れません。
MQL全般の情報としては以下のコミュニティサイトが非常に役立ちます。タイトルはMQL5となっていますが、MQL4(MT4)の情報も充実しています。
MQL5: MetaTraderを使った自動FXトレーディング、ストラテジーテスターとカスタムインディケーター
https://www.mql5.com/ja
[amazonjs asin=”B00DWV91A4″ locale=”JP” title=”FXメタトレーダー4 MQLプログラミング 現代の錬金術師シリーズ”]
[amazonjs asin=”477599090X” locale=”JP” title=”FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)”]
[amazonjs asin=”4863541236″ locale=”JP” title=”MetaTrader 4で始める FX自動売買システム作成の教科書”]