FX自動売買システム開発

MT4でFX自動売買ツール(EA)を自作できるソースコードを無料公開!

 

自作EAのベースとして使っていただけるサンプルを公開しています。
対象はドル円の15分足、ダウ理論に基づくトレンドフォロー型です。
MT4からメタエディタを起動して全文コピペすれば動きます。

 

HAZU
自分であれこれいじってみると理解が深まるかと思います。
分からないことがあれば都度この記事に戻ってきてください。

 

サンプルEAの動かし方や改編方法は以下の記事を参照下さい。

【無料講座】FX自動売買ツールの作り方を解説【MT4で自作EA】

続きを見る

MT4をお持ちでない方は以下の国内FX業者からダウンロードできます。

【MT4対応】国内FX会社のオススメを紹介【徹底比較】

続きを見る

 

 

1.サンプルソースコード

本ブログで公開しているソースコードは学習用のサンプルです。
リアル口座で稼働させる場合は自己責任で行ってください。

 

1:ソースコード全文(コピペ推奨)

 command
//------------------------------------------------------------------+
// jisakuEA.mq4
// Copyright 2019, Hazu
//------------------------------------------------------------------+
#property copyright "Copyright 2019, Hazu" // 作成者名
#property link "https://hazu-hobby.net/" // Webサイトリンク
#property version "4.0" // バージョン
#property strict // 厳格なコンパイルモード
#property description "自作EA" // EA説明文
#define MAGICMA 20191007 // EA識別用マジックナンバー
#define DEBUG //バックテスト用
#ifdef DEBUG
int prevsec;
int BScnt = 0;
bool ForBackTest(int Timerseconds)
{
if (Seconds() != prevsec)
BScnt ++;
prevsec = Seconds();
if (BScnt >= Timerseconds){
BScnt = 0;
return(true);
}
return(false);
}
#endif
// OnInit(初期化)イベント
int OnInit() {
EventSetTimer(60);
return(INIT_SUCCEEDED);
}
// OnDeinit(アンロード)イベント
void OnDeinit(const int reason) {
EventKillTimer();
}
//バックテスト用
void OnTick(){
#ifdef DEBUG
if (ForBackTest(60))
OnTimer();
#endif
}
// OnTick(tick受信)イベント
void OnTimer(){
if ( IsTradeAllowed() == false ) {
return;
}
main(); //Main logic
}
//------------------------------------------------------------------------------------
// 0. main : メインロジック
//------------------------------------------------------------------------------------
input int Ma1 = 1; // MA1(now)
input int Ma2 = 7; // MA2(short)
input int Ma3 = 25; // MA3(mid)
input int time = 15; // time
input string rcur = "USDJPY";
double M0[5],M1[5],U1[5],L1[5],M2[5],M3[5];
int result;
bool goflg;
void main(){
getprm();
check();
position();
return;
}
//------------------------------------------------------------------------------------
// 1. getprm : パラメータ取得
//------------------------------------------------------------------------------------
void getprm(){
for(int i=4; i>=0; i=i-1){
M0[i] = iMA(rcur,time, Ma1, 0, 0, 0, i);
M1[i] = iMA(rcur,time, Ma2, 0, 0, 0, i);
U1[i] = iBands(rcur,time,Ma2,1.5,0,PRICE_CLOSE,1,i);
L1[i] = iBands(rcur,time,Ma2,1.5,0,PRICE_CLOSE,2,i);
M2[i] = iMA(rcur,time,Ma3, 0, 0, 0, i);
M3[i] = iMA(rcur,time,50, 0, 0, 0, i);
}
}
//------------------------------------------------------------------------------------
// 2. check : 取引条件確認
//------------------------------------------------------------------------------------
void check(){
//条件処理
for(int i=4; i>=0; i=i-1){
if(M1[i]<=M2[i]){
result = -1;
if(M0[i]>=U1[i])
goflg = true;
else
goflg = false;
}
else if(M1[i]>=M2[i]){
result = 1;
if(M0[i]<=L1[i])
goflg = true;
else
goflg = false;
}
else{
result = 0;
goflg = false;
}
}
}
//------------------------------------------------------------------------------------
// 3. position : ポジション管理
//------------------------------------------------------------------------------------
void position(){
//ポジション数取得
int res;
int tpoji = 0;
int pojilim = 1;
int torder = OrdersTotal();
//ポジション数カウント
for(int i = torder-1; i >= 0; i--){
res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1)))
tpoji += 1;
}
//ポジション構築
if(tpoji<pojilim&&result!=0&&goflg)
ordersend();
}
//------------------------------------------------------------------------------------
// 4. ordersend : ポジション構築
//------------------------------------------------------------------------------------
void ordersend(){
int res = 0;
double BID = MarketInfo(rcur,MODE_BID);
double ASK = MarketInfo(rcur,MODE_ASK);
double PIP = MarketInfo(rcur,MODE_SPREAD);
//売り指示
if(result==-1&&PIP<=100){
res = OrderSend(rcur,OP_SELL,0.5,BID,100,ASK+0.2,ASK-0.4,"Short",MAGICMA,0,clrRed);
Sleep(3000);
}
//買い指示
else if(result==1&&PIP<=100){
res = OrderSend(rcur,OP_BUY,0.5,ASK,100,BID-0.2,BID+0.4,"Long",MAGICMA,0,clrRed);
Sleep(3000);
}
}

※2020年5月動作確認済

 

2:バックテスト結果

シンプルなロジックですが、しっかりプラス収支です。

通貨ペア:ドル円
時間足:M15
モデル:全ティック
スプレッド: 5
期間:20014/4/1-2020/4/22

結果:100万円⇒210万円

 

HAZU
さらに成績を伸ばすには、後半で紹介する拡張コードが必要です。

 

2.サンプルソースコード解説

上記ソースコードはいくつかの関数で構成されています。
プログラムがすっきりするだけでなく、修正も最小限で済みます。

 

3:メイン関数(必須プログラム)

EAを動かすために必要な条件が記載されています。

 

✔ 初期宣言 OnInit()、OnDeinit()、OnTick() など

EAを起動した際に行う処理などを記載しています。

 

 command
//------------------------------------------------------------------+
// jisakuEA.mq4
// Copyright 2019, Hazu
//------------------------------------------------------------------+
#property copyright "Copyright 2019, Hazu" // 作成者名
#property link "https://hazu-hobby.net/" // Webサイトリンク
#property version "4.0" // バージョン
#property strict // 厳格なコンパイルモード
#property description "自作EA" // EA説明文
#define MAGICMA 20191007 // EA識別用マジックナンバー
#define DEBUG //バックテスト用
#ifdef DEBUG
int prevsec;
int BScnt = 0;
bool ForBackTest(int Timerseconds)
{
if (Seconds() != prevsec)
BScnt ++;
prevsec = Seconds();
if (BScnt >= Timerseconds){
BScnt = 0;
return(true);
}
return(false);
}
#endif
// OnInit(初期化)イベント
int OnInit() {
EventSetTimer(60);
return(INIT_SUCCEEDED);
}
// OnDeinit(アンロード)イベント
void OnDeinit(const int reason) {
EventKillTimer();
}
//バックテスト用
void OnTick(){
#ifdef DEBUG
if (ForBackTest(60))
OnTimer();
#endif
}
// OnTick(tick受信)イベント
void OnTimer(){
if ( IsTradeAllowed() == false ) {
return;
}
main(); //Main logic
}

 

✔ メイン関数 main()

グローバル変数(プログラム全体で使う変数)の定義やサブ関数の呼び出しなどをここで管理します。

 

 command
//------------------------------------------------------------------------------------
// 0. main : メインロジック
//------------------------------------------------------------------------------------
input int Ma1 = 1;                    // 現在値
input int Ma2 = 7;                    // 7区間移動平均
input int Ma3 = 25;                  // 25区間移動平均
input int time = 15;                  // 時間足指定
input string rcur = "USDJPY";   //通貨ペア指定
//グローバル変数
double M0[5],M1[5],U1[5],L1[5],M2[5],M3[5];
int result;
bool goflg;
//メイン関数
void main(){
getprm();
check();
position();
return;
}

 

4:サブ関数(追加プログラム)

このサイトで独自定義している関数です。
外部のEAと組み合わせる場合は定義などが被っていないか確認して下さい。

 

✔ パラメータ取得 getprm()

チャート5本分のデータを1本ずつ行列に格納します。
これにより「少し前の時間足でも条件が成立しているか」を条件とすることが可能です。

 

 command
//------------------------------------------------------------------------------------
// 1. getprm : パラメータ取得
//------------------------------------------------------------------------------------
void getprm(){
//for関数で必要本数分のデータ保存
for(int i=4; i>=0; i=i-1){
M0[i] = iMA(rcur,time, Ma1, 0, 0, 0, i);
M1[i] = iMA(rcur,time, Ma2, 0, 0, 0, i);
U1[i] = iBands(rcur,time,Ma2,1.5,0,PRICE_CLOSE,1,i);
L1[i] = iBands(rcur,time,Ma2,1.5,0,PRICE_CLOSE,2,i);
M2[i] = iMA(rcur,time,Ma3, 0, 0, 0, i);
M3[i] = iMA(rcur,time,50, 0, 0, 0, i);
}
}

 

 取引条件確認 check()

getprm() で取得したパラメータを利用して取引条件を満たしているか確認します。
自作EA開発講座で紹介しているように取引条件の変更はここで行います。
グローバル変数 goflg が True になった場合に発注を行います。

 

 command
//------------------------------------------------------------------------------------
// 2. check : 取引条件確認
//------------------------------------------------------------------------------------
void check(){
//条件処理
for(int i=4; i>=0; i=i-1){
if(M1[i]<=M2[i]){
result = -1;                   //売り判定
if(M0[i]>=U1[i])
goflg = true;                //売買指示
else
goflg = false;
}
else if(M1[i]>=M2[i]){
result = 1;                    //買い判定
if(M0[i]<=L1[i])
goflg = true;                //売買指示
else
goflg = false;
}
else{
result = 0;
goflg = false;
}
}
}

 

 ポジション管理  position()

保有するポジションを管理します。
例えば『ポジションは同時に3個まで』といった条件付けが可能です。

 

 command
//------------------------------------------------------------------------------------
// 3. position : ポジション管理
//------------------------------------------------------------------------------------
void position(){
//ポジション数取得
int res;
int tpoji = 0;
int pojilim = 1;
int torder = OrdersTotal();
//ポジション数カウント
for(int i = torder-1; i >= 0; i--){
res = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==rcur&&((OrderType()==0&&result==1)||(OrderType()==1&&result==-1)))
tpoji += 1;
}
//ポジション構築
if(tpoji<pojilim&&result!=0&&goflg)
ordersend();
}

 

✔ ポジション構築 ordersend()

check(), position() の条件を満たしていたらいよいよ発注になります。
グローバル変数 result の値に従い発注を行います。

 

 command
//------------------------------------------------------------------------------------
// 4. ordersend : ポジション構築
//------------------------------------------------------------------------------------
void ordersend(){
int res = 0;
double BID = MarketInfo(rcur,MODE_BID);
double ASK = MarketInfo(rcur,MODE_ASK);
double PIP = MarketInfo(rcur,MODE_SPREAD);
//売り指示
if(result==-1&&PIP<=100){
res = OrderSend(rcur,OP_SELL,0.5,BID,100,ASK+0.2,ASK-0.4,"Short",MAGICMA,0,clrRed);
Sleep(3000);
}
//買い指示
else if(result==1&&PIP<=100){
res = OrderSend(rcur,OP_BUY,0.5,ASK,100,BID-0.2,BID+0.4,"Long",MAGICMA,0,clrRed);
Sleep(3000);
}
}

 

3.拡張ソースコード

本記事のコードは別記事の拡張コードと組み合わせて使うことができます。
HAZUの主力EAに実装しているロジックから思い付きで実装したものまで。
不定期に追加していきます。

 

5:自作EAのヒント集

メジャーからマイナーまで様々なロジックのソースコードを公開中。
以下で例を紹介します。

 

≫トレーリングストップを実現する方法

≫ナンピン買いをする方法

≫ボリンジャーバンドを使った逆張り手法

≫保有ポジションを全決済、分割決済する方法

 

その他のコードについては以下参照下さい。

自作EAで困った際のヒント集【MT4でFX自動売買】

続きを見る

 

4.推奨テスト環境

EAの評価手法は一般的に以下の2種類があります。
どちらかで十分ということはなく、合わせて評価が必要です。

①過去の相場データから評価する『バックテスト』

②実稼働で成績を確認する『フォワードテスト』

 

6:フォワードテストはVPSを推奨

自宅PCを24時間稼働させるのは不便です。
EA開発者の多くはフォワードテストをVPSで行っています。

 

HAZU
VPSとは『仮想PCのレンタルサービス』です。
自宅のPCやスマホから利用することができます。

 

以下の記事で筆者が実際に使用しているサービスを紹介しています。

【MT4】VPSのオススメ!EA開発者が徹底比較【お名前.com、さくら、ConoHa】

続きを見る

 

5.難しいと感じた場合の解決策

EA開発を進める上でおすすめの書籍やサービスを紹介します。
勉強代と思える方はご検討下さい。

 

 

7:書籍で勉強【約2千円】

EA開発者を目指すなら以下のシリーズは押さえておきたいです。
筆者は書籍版を持っていますが、なぜか電子版が半額で売られています。
これから購入される方は電子版をお勧めします。

 

✔ FXメタトレーダー入門【初心者向け】

MT4の使い方を1から紹介してくれます。
これからEAを自作しようという方にはちょっと物足りないかも。
とは言え持っておいて損はない1冊です。

AMAZON 楽天

 

✔ FXメタトレーダー実践プログラミング【中~上級者向け】

MT4の使い方はOK!と言う方はこちらからで大丈夫。
辞書的な使い方もできるのでお金に余裕があれば紙媒体もおすすめです。

AMAZON 楽天

 

8:有料ツールでEA開発【約2万円】

お金が出せるならゴゴジャンのEAつくーるが選択肢に入ります。
1度購入すれば以降はノーコード(プログラミング無し)でEAが作れます。
EAつくーるでベースを作成、細かい修正を自分で入れることも可能です。

 

お試しなら1ヶ月版が1980円で使えます。
割高なので長期的に取り組むなら買い切りがおすすめです。

 

MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる! | GogoJungle

 

>>EAつくーるの概要はこちら

>>1ヶ月版の販売ページはこちら

 

9:有料セミナーを活用【約4万円】

がっつり取り組みたいのであればEAプログラミングセミナーもおすすめです。
難易度別に3つの講座が提供されているので、レベルに合わせて選択しましょう。

 

>>スタンダード講座
>>実践講座
>>裏口座

 

✔ プログラミング自体に苦しむようなら

TechAcademyの無料体験を受けておくと良いでしょう。
言語は違いますが、プロからプログラミングの考え方を学ぶことができます。

>>Techacademyの無料体験はこちら

 

6.よくある質問

Q. MT4はどこから入手できますか

A. MT4は以下の国内FX業者からダウンロードできます

【MT4対応】国内FX会社のオススメを紹介【徹底比較】

続きを見る

 

Q. ソースコードの使い方が分かりません

A. サンプルEAの動かし方や改編方法は以下の記事を参照下さい

【無料講座】FX自動売買ツールの作り方を解説【MT4で自作EA】

続きを見る

 

Q. 作成済のEAをいただくことはできますか。

A. EA自体の配布は現在行っていません。販売サイトで有料EAを購入して下さい。
MT4に限らず自動化できればいいなら以下のサービスも選択肢です。

手軽に始められるFX自動売買を徹底解説【トラリピ、ループイフダン】

続きを見る

 

7.まとめ

本記事では自作EAのベースとして使えるソースコードを紹介しました。
一度動かしてみることで理解が進むかと思います。

 

以上、参考になれば幸いです。

 

  • この記事を書いた人

HAZU

静岡の一部上場企業で働く兼業投資家、投資を初めて6年が経ちました。30代のセミリタイアを目指して20代からコツコツと資産形成中。趣味はキャンプとプログラミング。ブログでは主に【FXの始め方から自動化】までを扱っています。

-FX自動売買システム開発

© 2021 HAZUの資産形成ラボ Powered by AFFINGER5