FX自動売買システム開発

【無料公開】FX自動売買ツールの開発用ソースコード【MT4で自作EA】

 

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

 

≫サンプルEAの使い方や改編方法は以下の記事を参照

≫MT4をお持ちでない方は以下の証券会社で入手可能です

 

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

 

 

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月動作確認済

 

・バックテスト結果

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

 

テスト条件

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

 

結果:100万円⇒210万円

 

HAZU
後半で紹介する拡張コードでさらに成績は伸ばせます。

 

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

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

 

 

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

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;
}

 

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

このサイトで独自定義している関数です。
外部の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.拡張ソースコード

メジャーからマイナーまで様々なロジックのソースコードを公開。
組み合わせ次第で戦えるEAが作れます。

 

以下がよく読まれているソースコードです。

 

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

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

続きを見る

 

4.テスト環境を構築

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

 

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

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

 

バックテストについてはMT4の機能で検証可能です。
一方でフォワードテストについては環境を整える必要があります。

 

・フォワードテストはVPS推奨

実際に自動売買する際はMT4を24時間起動する必要があります。
理由は色々ですが、おすすめはVPS(仮想PCサービス)です。
月2000円程度で理想環境が手に入ります。

 

✔ 常時起動はPCの故障原因に

筆者はFX以外に仮想通貨投資もしています。
訳あって半年間電源を入れっぱにした20万円のMacBookの末路がこちら。

バッテリが膨らみ完全に閉じることが出来なくなっただけでなく、
底板が変形し近くで見ると中の基盤が露出しています。
最悪発火の可能性もあるのでPCごと買い替える羽目に。

 

✔ MT4の動作確認が取れている業者がおすすめ

筆者が契約中のサービスは『お名前.com』です。
正直以下で紹介する業者ならどれでも変わらない印象。

 

MT4対応のVPS

お名前.comデスクトップクラウド for MT4
・リモートデスクトップ込みの明朗な料金プラン
・主要な国内業者のMT4がプリインストール済み

ConoHa for Windows Server
・初心者でも扱いやすい設定画面
・時間単位、1日単位での料金請求

さくらのVPS for Windows Server
・業界最安レベルの利用料金
・設定画面は多少分かり辛い(PC中級者向け)

 

以下の記事で詳しく紹介しています。

【MT4】EA開発者おすすめのVPS3選【お名前.com、さくら、ConoHa】

続きを見る

 

5.記事を読んで難しいと感じた場合

EA開発に必要なのはトレードスキルとプログラミングスキルです。
どちらが欠けていても良いEAは作れません。
以下に知識やスキル不足を補うツールを紹介します。

 

コスパが良いおすすめサービス

FX投資マスターガイド【無料】
FX手法解説本、基本戦略はこれ読めばOK

FXメタトレーダー入門【約2千円】
EA開発者のバイブル、初心者から上級者まで

EAつくーる【約3万円】
プログラミング無しでEA開発、お試し版あり

EAプログラミングセミナー【約4万円】
講師からの指導を受けつつEA開発の基礎を学べます

 

・FX投資マスターガイド【無料】

FXの基本戦略はこれ読めばOKです。
特に図解が分かり易いのでロジックを考える上で参考になります。
メールアドレス登録だけなので忘れず貰いましょう。

FX投資マスターガイド

>>FX投資マスターガイドのダウンロード

 

・FXメタトレーダー入門【約2千円】

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

 

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

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

AMAZON 楽天

 

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

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

AMAZON 楽天

 

・EAつくーる【約3万円】

自作が難しいと感じたらEAつくーるを使うのも選択肢です。
1度購入すればノーコード(プログラミング無し)でEAが作れます。

 

2ステップで作るオリジナルEA

①EAつくーるでベースを作成
②つくーるの機能で実装できない自作ロジックを追記

 

今ならお試し用の1ヶ月版が2980円で使えます。
割高なので”使える”と思ったら買い切り版に切り替えましょう。

 

 

 

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

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

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

 

・EAプログラミングセミナー【約4万円】

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

 

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

 

6.よくある質問

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

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

【FX自動売買】MT4対応の国内証券会社を紹介

続きを見る

 

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

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

【無料講座】お金をかけずに作るFX自動売買ツール【MT4で自作EA】

続きを見る

 

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

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

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

続きを見る

 

7.まとめ

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

 

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

 

  • この記事を書いた人

HAZU

静岡の一部上場企業で働くサラリーマン。 投資7年目で20代からコツコツ資産形成中。 ブログでFXの始め方から自動化までを解説。 特に初心者向けFX自動売買ツールの自作記事が好評です。

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

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