FX自動売買を始めた人:
証券会社のサービスでは物足りなくなってきた。
でも有料の自動売買ツールやアプリは値段が…
お金をかけずに解決する方法はないかな?
✔ 本記事の内容
無料ソフト”MT4”を使用した自動売買ツール(EA)の自作方法を解説。
プログラミング初心者でも挑戦可能な構成を意識しています。
- 無料ソフト”MT4”を使用。入手方法から使い方まで解説!
- EA開発に使えるソースコードを公開!
- 最終的にオリジナルEAが作れる段階までサポート!
✔ 以下の悩みを解決
・自分のトレード手法を自動化したい
・証券会社のサービスや市販EAに満足できない
・必要最低限の金額でEA開発環境を整えたい
✔ 記事の信頼性
筆者はプログラミング経験ゼロからツール開発を初めて7年。
最近は自身の相場分析をTwitterで発信しています。
本記事も検索上位を獲得しており多くの方がEA開発を始めるきっかけになっています。
1章、2章は基礎知識や開発環境に関する内容です。
不要な方は3章 からお読みください。
1.EA開発の基礎知識
まずは前提から説明していきます。
特にメリットデメリットはよく理解しておきましょう。
・MT4とは?EAとは?
MT4とはMetaQuotes社が提供するFX用ソフト「MetaTrader4」の略称です。
無料ソフトながらチャート分析や自動売買まで可能です。
世界中に愛用者おり有志が作成したプログラムを使うことができます。
本ブログで扱うEAとはMT4で使える自動売買ツールを指します。
✔ EA開発ができるのはPC版のみ
MT4はスマホアプリも展開していますがEA開発が出来るのはPC版のみ。
開発したEAをスマホ経由で動かすことは可能です。
✔ 開発はMT4付属のメタエディタを使用
開発用のプログラミング言語は”MQL4”という独自言語です。
メジャーな言語だとJAVAが近いかと思います。
✔ 後継のMT5は時期尚早
開発元のMetaTrader社から後継のMetaTrader5がリリースされていますが、
対応している証券会社が少ないのが現状です。
今のところはネット上の情報が多いMT4をおすすめしています。
以下の記事でMT4を使った自動売買の始め方を解説しています。
-
【EA開発者が解説】無料ソフトMT4を使ったFX自動売買の始め方
続きを見る
・自作EAのメリット、デメリット
自作する最大のメリットは「柔軟性があること」です。
それ以外のメリット、デメリットは以下の通り。
メリット
デメリット
・自分でロジックを考える必要がある
・開発、検証に時間がかかる(1~3ヶ月)
・意図しない挙動(=バグ)で損失を被る可能性がある
✔ EA開発は根気強さが必要
実用に足るEAが出来るにはそれなりに時間がかかります。
証券会社のサービスを使ったことが無ければまずはそちらを試しましょう。
足りないと感じた部分を自作EAで補うのがおすすめです。
2.EA開発環境を構築
EA開発に必要な環境を紹介します。
開発用PC
最低スペックでOK
Windowsでないと動作しないので注意
MT4
証券会社から無料ダウンロード可能
EA開発ができるのはPC版のみ
VPS(月2千円~)
EAを24時間稼働させるための仮想PCを提供
スマホアプリから操作可能
PCは手持ちのものでOK、開発に必要なMT4は無料で入手可能です。
VPSは開発時は不要ですが、後の動作確認で必要になります。
料理でも何でも自作はコスパが良いです。
・開発用PC(必須)
MT4を配布している証券会社によれば、動作環境は以下の通り。
最低限のスペックで構いませんがWindowsで無いと動作しないので注意。
取引業者 | CPU | メモリ |
外為ファイネスト | 1.2GHz以上 推奨:2GHz以上 |
1GB以上 推奨:2GB以上 |
OANDA Japan | 1GHz以上 推奨:2GHz以上 |
512MB以上 推奨:1GB以上 |
参考情報
アマゾンの格安ノートPCでも問題なく動作します。
手持ちのPCがこれ以上のスペックであれば基本困ることはないです。
・MT4(必須)
1章で説明している通りMT4は証券会社の口座開設後に入手可能です。
ハイレバで勝負したいなどの理由が無い限り国内業者が安定。
海外業者は入出金などでトラブルが発生した際の対応に不安があります。
✔ 自動売買に適した証券会社を選ぶ
軽視されがちですがEAの成績に直結する部分です。
MT4自体は各社同じですが取引時の約定率やスプレッドに差があります。
適当に選ぶと後で口座開設し直す必要が出てきます。
自動売買と相性の良い証券会社
筆者はメインでFXTF、サブで外為ファイネストを使っています。
EAとの相性があるので使い分けができるとベストです。
以下の記事でMT4が使える国内業者をまとめています。
-
MT4でFX自動売買できる国内証券会社おすすめ。EA開発者が徹底比較
続きを見る
・VPS(後で必要)
実際に自動売買する際はMT4を24時間起動する必要があります。
月2000円ほどで使えるVPS(仮想PCサービス)がおすすめ。
筆者はお名前.comを2年以上利用しています。
スマホからアクセスできるので出先でちょっとした調整も可能です。
以下の記事で主要なVPS業者をまとめています。
-
【MT4/MT5】FX自動売買用VPSの比較!EA開発者がおすすめを紹介
続きを見る
3.EA開発の流れを学ぶ
本ブログで推奨するEAの作り方は基本的に以下の3ステップです。
何回か繰り返すうちに要領が掴めるかと思います。
・サンプルEAを用意
まずは無料公開されているEAを利用します。
EAの入手方法は2つあります。
① 製作者側でコンパイルしたファイルを入手
② ソースコードを入手してコンパイル
①は修正不可なため、有償EAはこの形で販売しています。
記事内ではブログで公開しているソースコードで解説します。
使いたいコードがあればそれを使用してもOKです。
EAの作成にはMT4付属の「メタエディター」を使用します。
新規作成⇒プログラミング⇒コンパイルが通常の工程です。
今回はプログラミングをコピペで飛ばします。
✔ 導入手順
コピペ前提であれば名前だけ設定すればOKです。
以下に従ってコンパイルまで進めてください。
①MT4を起動して「ツール」から「メタエディター」を選択
②「新規作成」から「エキスパートアドバイザ(テンプレート)」を選んで次へ
③ 名前を決め(画像の場合はtest)、次へをクリック
④特に変更せずに「完了」をクリック
⑤ プログラミング画面が開いたら以下のソースコードを全文コピペ
※2020年5月動作確認済
※ソースコードの中身は詳細解説へ
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月動作確認済
⑥「コンパイル」を押してエラーが出なければ完了
これで作成したEAがMT4側で使えるようになります。
・サンプルEAを評価
EA稼働前には過去の相場データを用いたチェックが必要です。
これをバックテストと言います。
STEP1 で準備したサンプルEAのバックテストをしましょう!
✔ バックテストによりEAの実力を確認
①MT4の左上「表示」から「ストラテジーテスター」を選択
②タブからエキスパートアドバイザを選択
③ STEP1で作成したEA、通貨ペアにドル円、期間にM15を選択
④ モデルに全ティック、スプレッドに 5 を設定
⑤ 期間は3年以上推奨(例では20014/4/1-2020/4/22)
⑥「スタート」をクリック
⑦以下のようなチャートが出てくれば成功
(失敗した場合はページ下部のヒストリカルデータの確認を実施)
結果:100万円⇒210万円
約5年で資産が約2倍まで増えています。
実開発では資産増加率だけでなく勝率も考慮する必要があります。
✔ ヒストリカルデータ確認方法
バックテストに失敗した場合は内部データ破損の可能性があります。
以下の手順を試してみて下さい。
①MT4起動
②「ツール」から「ヒストリーセンター」を選択
③ データを取得する通貨ペアと時間足を指定して「ダウンロード」を押す
(画像の場合はUSD/JPYの1分足データを入手)
終わったら青枠の部分でデータが入手できているか確認して下さい。
時間足は使用する足以下のものを全てダウンロードして下さい。
✔ パラメータ設定によりEAの動きを最適化
①ストラテジーテスターの「エキスパート設定」をクリック
②「パラメータの入力」に移動してMA2の値を 7 ⇒14 に変更し「OK」をクリック
③変更後は「スタート」を押して再び結果を出力
結果:100万円⇒190万円
収益が悪化しましたが、この結果は必ずしも悪いとは言えません。
変更前の結果と比べると2018年以降の結果が改善しています。
ネット上の無料EAにもお宝があるかもしれません。
・サンプルEAを改良
いよいよ自分でコードを変更してみましょう。
プログラミング経験がなくても大丈夫です。
✔ 変更⇒バックテストの繰り返しでロジックを強化
徐々に改変できる範囲を増やしてオリジナルのEAを作りましょう!
変更準備
①MT4を起動して「ツール」から「メタエディター」を選択
②「開く」で ①EAを用意する で作成したEAを開く
変更箇所
サンプルEAの場合、取引条件を決めるのは以下の check() 関数です。
goflg = true で売買指示を出すため、今回はその条件を少し厳しくします。
該当箇所を以下のように修正
売り条件、買い条件にあらかじめ用意した変数 M3[i] を追加します。
(どこで用意したかは 解説 を参照ください。)
難しい場合は丸ごとコピペしてもOKです。
command //------------------------------------------------------------------------------------ // 2. check : 取引条件確認 //------------------------------------------------------------------------------------ void check(){//条件処理 for(int i=4; i>=0; i=i-1){ if(M1[i]<=M2[i]&&M2[i]<=M3[i]){ result = -1; if(M0[i]>=U1[i]) goflg = true; else goflg = false; } else if(M1[i]>=M2[i]&&M2[i]>=M3[i]){ result = 1; if(M0[i]<=L1[i]) goflg = true; else goflg = false; } else{ result = 0; goflg = false; } } }
変更結果
変更を保存した上で再度バックテストを実行しましょう。
結果:100万円⇒300万円
取引回数が減っていますが、その分安定性が増しています。
M3[i] の追加で長期的な動きが条件として加わったためです。
4.オリジナルEAを開発
サンプルEAを編集したり、サンプル同士を組み合わせて開発していきます。
バックテストだけでなく、デモ口座で実相場での成績を確認することも必要です。
ここまで辿り着くのに1ヶ月ほどかかりました。
・開発に使える拡張ソースコード
以下で色々なトレード手法をコード付きで紹介しています。
条件を変更したり、変数を追加していろいろ試してみて下さい。
-
EA開発で使える拡張ソースコードまとめ【MT4でFX自動売買】
続きを見る
・EA開発で注意すべきこと
以下で筆者が過去に失敗した体験談をまとめています。
勝てない原因を学ぶことで、勝てるEAの開発に生かすことができます。
-
自作EAで避けるべき「勝てない」ロジック【MT4でFX自動売買】
続きを見る
5.EA開発を副業にする
自作EAを販売したり、受託開発することで利益を得ることができます。
トレードはEAに任せて自身は副業に取り組めば資産形成が加速します。
✔ 金融商品取引業の認可済サイトを利用
EAは金融商品に該当するため個人販売はできません。
ゴゴジャンのような認可済みサイトを活用するのが一般的です。
・開発したEAを販売
大体1万円~2万円、人気のもので3万円が相場です。
後で紹介するEAつくーるで作成したEAも販売可能です。
人気ランキングに載るようなEAなら数百万円の収入も狙えます。
・EA開発を代行する
ゴゴジャンのスキルシェアルームで依頼を受けることができます。
人気なクリエイターほど値段が高いのはEA販売と同じです。
初めは5000円くらいで実績を増やしていくのが良いと思います。
以下の記事でEA開発を副業にする方法をまとめています。
-
EA開発を副業にする方法。売り上げアップの秘訣も公開!
続きを見る
6.開発に詰まったらインプット
EA開発を進める上でおすすめの書籍やサービスを紹介します。
価格帯別に紹介しているので、お財布と相談で。
FXメタトレーダー入門(約2千円)
EA開発者のバイブル、初心者から上級者まで
EAつくーる(月3千円)
プログラミング無しでEA開発、1ヶ月版が2980円で使用可能
EA開発セミナー(約4万円)
講師からの指導を受けつつEA開発の基礎を学べます
・FXメタトレーダー入門
EA開発者を目指すなら以下のシリーズは押さえておきたいです。
筆者は書籍版を持っていますが、半額の電子版がおすすめ。
・EAつくーる
プログラミング初心者におすすめしたいのがEAつくーるです。
これを使えばノーコード(プログラミング無し)でEA開発が可能。
お試しなら1ヶ月版(2980円)で十分です。
やる気があれば初めから1年版(29800円)がおすすめ。
これがあれば学習期間含め100時間くらい短縮できます。
以下の記事で詳しく説明しています。
-
【MT4/MT5】EAつくーるとは?プログラミング無しでオリジナルEA開発
続きを見る
・EA開発セミナー
講師の支援を受けながらEA開発を学ぶプログラミングセミナーです。
3講座ありますが、個人的には実践講座or裏講座がおすすめ。
本記事でスタンダード講座はスキップできます。
7.まとめ
本記事ではFX自動売買システムの自作方法を紹介しました。
初めは上手く行かないことも多いと思いますが、
分からないことがあれば都度この記事に戻ってきて下さい。
今回説明した内容で一番時間がかかるのが証券口座の開設です。
MT4対応口座を1つも持っていなければ申請しておきましょう。
-
MT4でFX自動売買できる国内証券会社おすすめ。EA開発者が徹底比較
続きを見る
以上、参考になれば幸いです。