EAの開発初心者の方で、以下のような悩みを持っていないでしょうか。
- MT4のEAを作成の基本は分かったけど、全くアイデアが湧かない
- EAを作ってみたいけど、何から作っていいかわからない
そんな時に先人が書いたEAのソースコードがあったらわかりやすいかと思います。今回はいくつかソースを紹介していきますので、開発の一歩を踏み出しましょう。
サンプルソース
まずは、MT4に最初から付属しているサンプルソースが参考になります。MACD Sample.mq4というソースがあると思いますので、これを開いて参考にすることができます。まずはこのソースコードが理解できるようになることが最初の一歩になります。
このソースが理解できるようになってからネットでソースコードを探してみましょう。
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100)
{
Print("bars less than 100");
return;
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
total=OrdersTotal();
if(total<1)
{
//--- no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- check for long position (BUY) possibility
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibility
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" block
return;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is opened
if(OrderType()==OP_BUY)
{
//--- should it be closed?
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else // go to short position
{
//--- should it be closed?
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
MT4でEA自作しちゃお~

このサイトはMQLのリファレンスとサンプルソースを提供しており、EA開発に必要な基本的なソースコードを参照することができます。EA開発において一番重要なのは、使用したい関数やサンプルコードを理解することです。このサイトでは、ほぼすべての基本的な関数やサンプルコードが掲載されているため、EA開発において非常に役立ちます。ぜひブックマークしておきましょう。
MQL5

MQL5はEA等に関する世界最大級のサイトで、EAのソースコードも公開されています。
英語なので翻訳すると理解しにくい部分がありますが、中には参考になるソースが眠っていますので基本的なコードが理解できるようになったら、こちらのサイトで探してみる価値はあります。
ソースコードが公開されているのはMQL5のコードベースというところです。
書籍で学ぶ
「FXメタトレーダー4 MQLプログラミング 堅牢なEA構築のための総合ガイド」という書籍ですが、こちらの本はEA作成をするにあたり、考慮しなければいけないことをサンプルソースとともに解説してくれている書籍です。
ストップレベル、ポイントを考慮ができているか?等、その他、基本的に使う機能の解説などしてくれています。
EAつくーるを使う
EAつくーるを使えば自分が作りたい条件でソースコードを自動生成してくれます。自動生成したソースコードを参考にすれば勉強にもなりますし、コードをそのまま使ってもいいし、ちょっといじって改良してEAにしても良いです。使い方は様々なので、勉強始めたてでソースコードが書ききれない人はEAつくーるを使うのも手です。
GitHub

GitHubはソースのバージョン管理をするサービスですが、MQLのソースも存在しています。ほとんど英語なのでハードルは高いですが、基本が理解できたらGitHubにあるソースも確認してみるといいでしょう。
https://github.com/topics/mt4-ea
まとめ
この記事では、MT4 EAソースコードの入手先や学習リソースを紹介しています。
サンプルソースやMT4でEA自作しちゃお~のウェブサイト、MQL5、書籍「FXメタトレーダー4 MQLプログラミング 堅牢なEA構築のための総合ガイド」、EAつくーるの利用方法、そしてGitHubでのソースコード検索方法が紹介されています。
これらのリソースを使ってEA開発の基本を学び、自分のアイデアを実現しましょう。