MT5EA作り方入門30分で「ドル円ゴトー日」EAを作る

ゴトー日を運用を始めたくてEAを作ってみました。

わりと簡単に作れました😀

初心者むけです。

MT5で自動売買EA(エキスパートアドバイザー)を自作する

毎度ですが先にゴールを決めてから作りはじめます。

今回のゴールは、「ドル円ゴトー日EAを完成」です。

MT5のEAの作り方は、

自動化ロジックを探す

日本時間の2時にドル円をロング、9時55分に決済。

日本時間の9時55分にドル円をショート、15時に決済。

手法をEA化させるには?

・エントリー

・決済

の2個のルールが必要です。

実装する

ネットでググるとほとんど情報がでてくるので、きっと作れます。

自動化させるロジックを確認

先にTradingViewでロジックを確認します。

ロングエントリールールは2時00分~9時54分に滞在、決済ルールは9時55分に到達。

ショートエントリールールは9時55分~14時59分に滞在、決済ルールは15時00分に到達。

Gotobi Teriyaki by hosono_p on TradingView.com

コードは以下のリンクから確認できます。

ブログの存続のため、TradingViewの有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。

MT5のインストール

ゆくゆくは仮想通貨の自動売買もしたいのでMT5はFXGTの口座を利用します。

FXGTのMT5デモ口座の申請方法

MT5口座
デモ
追加口座

デモ口座を押す
Miniを選択
円口座を選択
レバレッジは1000
進める
MT5のログインパスワードをつくる
進める
デモ口座の準備が完成です。
MT5のダウンロード
もちろん、WindowsのMT5
クリックしてインストール
実行
次へでインストール開始
インストール完了
トップから
口座番号
パスワードをコピー
MT5のファイルから
ログイン
ログイン出来たら口座の残高を確認する
残高が表示されてたらログイン成功
銘柄
BTCUSDmを追加
ほその

お疲れ様でした。これでMT5の準備完了です。次はプログラミング用のエディタを表示させます。

MT5のプログラミングエディタ(メタエディタ)を起動

MQL5のプログラムのコードはここに書いていきます。

エキスパートアドバイザーの新規作成

新規でEAを作ります。

新規作成
エキスパートアドバイザ(テンプレート)
名前を入力
デフォルトでOK
デフォルトでおk
テンプレ入りのコードが作成された

テンプレコードの説明

いちおうテンプレの説明しておきます。飛ばしてもOKです。※MAゴールデンクロスの転用です。

上から8行目まではEAの説明文など

最後の property strict で日本語化されます。

他はEAの説明文に転載されます。

// ダブルスラッシュから始まるのはコメントアウトです。

int OnInit()はEA起動時に呼ばれる機能です。

int OnDeinit()はEA削除時に呼ばれる機能です。

void OnTick()は値動きがあった時に呼ばれる機能です。

使わない機能がある場合は?

テンプレには3つの機能がデフォルト搭載されている

・EAを開いたとき

・EAを終了させたとき

・値動き時

今回は値動き時のときだけプログラムのコードを実行させるので値動きだけでOK

OnTick()とは何者なのか?

OnTick関数は値動きがあったら呼ばれる機能です。

例えばBTCUSDの最小単位0.01が動けば実行されます。

20000.00→20000.01

ちなみにMT4では最小単位をPointと呼びます。

ところで void って何?

void 何も返さない

実行したときに呼び出し元に何も返さない。

対義としては何かを返す関数。

voidの他に、何かを返す関数はint,double,boolが使われる。

何も返さない場合は void を関数の先頭につける。

OnTickはMT4が実行させているので返却しなくてもいい。

TimeLocal()でPCの現在の日本時間を取得する

MT5はパソコンの時間とズレて表示されているのでMT5の時刻を参照してゴトー日を計算するとズレます。

市販のEAは、夏時間冬時間を計算してEAに組み込むのですが、今回は簡単に作りたいので、Windowsの現在時刻を取得して時間判別に使います。

使う関数は、

TimeLocal()

です。

TimeLocal()の動作を確認します。

コンパイル
実行ボタン
ターミナル
アルゴリズムを許可
ツールボックス
エキスパート
メッセージ

Print()

Print()でエキスパートのログに出力させることができます。

値動き毎にPrint(TimeLocal()); でパソコンの現在の時間がdatetime型の形でプリントアウトされています。

datetime型とは?

datetimeは日付です。またはintの属性をもっています。

なので、int(整数型)にすると1970年1月1日からの経過時間秒で表示させることもできます。

int timeに代入してみると、

変数に代入

TimeLocal()の結果を int time 変数に代入しています。

1970年1月1日からの経過秒

datetime型

5のつく日、10のつく日を計算する

現在の時間から日付を取得して5のつく日10のつく日を計算します。

MQL ゴトー日」でネット検索すると参考コードがでてきますので参考にしてTimeLocal()版に書き換えていきます。

まずは関数を作成します。

現在のパソコンの時間を変数に保存します。

datetime pc_time = TimeLocal();

日付を取得するTimeDay()関数を使います。今日の日付を int day に代入します

int day = TimeDay(pc_time);

余りを計算するMathMod()関数を使います。日付÷5の余りの数をdouble amari に代入します

double amari = MathMod(day,5);

amariの数が0の場合は5の倍数の日付、つまりゴトー日です。

is_gotobi()関数の動作確認します。

今日は16日なのでfalseが表示された。

土日が5のつく日、10のつく日の場合は金曜日に繰り下げられるのでその計算を組み込みます。

曜日を計算するTimeDayOfWeek()で今日の曜日をint youbi に代入します

int youbi = TimeDayOfWeek(pc_time);

金曜日かつamariが3(3のつく日)かamariが4(4のつく日)ならゴトー日です。

ゴトー日の判別関数が完成

次は現在の時間を計算する

ゴトー日の2時から9時54分まではBUY判定

日付を計算するのと似たような関数なので説明は割愛します。

時間を判定する関数追加

分を判定する関数を追加

ゴトー日の9時55分から14時59分まではSELL判定

日付を計算するのと似たような関数なので説明は割愛します。

月曜日から金曜日までを判定

TradingViewで先に作ったら間違って土曜日の2時からロングされちゃったので、MT4でもしっかりと平日判定をいれます。

平日ならtrue

BUY条件トリガーでロングエントリーさせる

BUY条件は、

1.ゴトー日

2.2時から9時54分に滞在

3.平日

なので、プログラミングコードで翻訳すると、

if(is_gotobi() && is_buy_time() && is_weekday()){}

になります。

ポジション数が0の場合という条件をつける

ロングポジションを持っている条件を加えないと無限ループで買い続けてしまうのでポジション数が0の場合だけエントリーします。

「ポジション数 mql」でネット検索すると参考コードが見つかります。

ロングポジション数の取得関数を作成

条件式は

buy_posi_count() == 0

です。

MagicNumber(マジックナンバー)をつけてEAでのポジションを識別させる

EAのポジションとほかでエントリーしたポジションを判別できるようにマジックナンバーをつけます。

定数(変数)でmagic_numberを宣言しておきます。

関数の外側は数値、データがリセットされないグローバルスコープ

関数の外側を外部スコープと呼びます。

関数に属していないのをグローバルスコープと呼びます。

int magic_number = 510;

は関数に属していない、グローバルスコープの変数です。

グローバルスコープにおいてあると処理で変更をしない限りデータは変更されません。

保存しておきたい数字はグローバルスコープへ置くと保存されます。

また、関数に属している変数のことをローカルスコープの変数と呼びます。

ローカルスコープの変数はOnTickが実行されるとデータはリセットされます。

ポジション数の取得関数をMagicNumberを追加して修正

ポジション取得に識別するマジックナンバーを加えます。

変更前

変更後

いつものセット置いとくよ

MT4からMT5に移行するときの”いつものやつ”をコピペでどこかに置いときます。

BUY条件達成かつポジション数が0ならエントリー

1.ゴトー日

2.2時から9時54分に滞在

3.平日

4.ロングポジション数が0

スプレッド拡大していたら損をするので対策する

スプが広がる可能性もあるのでスプレッド拡大防止のためのコードを追加します。

スプレッドはAsk-Bidで計算できます。

1.ゴトー日

2.2時から9時54分に滞在

3.平日

4.ロングポジション数が0

5.スプレッドが0.25以内

以上でエントリーのプログラミングは完成です。

次は決済つくります。

決済ルールを計算する

決済は時間外のときです。

is_buy_timeで判定しているので、

is_buy_time() == false

なら決済になります。

is_buy_time() == falseは

!is_buy_time()とも表現できるので、

あとはポジション数が0ではないなら決済します。

決済判定式

決済関数をつくる

決済させるには

ポジションを識別→決済

させる必要があるので、決済の関数をべつでつくります。

使いやすいように引数追加してBUY決済とSELL決済ができるようにしておきます。

引数って何?

引き渡すデータを引数と呼びます。

(string side) が引数です。

今回は引数を1個渡しています。

引数は呼ぶときに呼び出し元で記述します。

position_close(“buy_close”); ならBUYポジションを決済します。

position_close(“sell_close”); ならSELLポジションを決済します。

条件で決済させる

時間外かつロングポジションを持っているなら決済します。

1.時間外

2.EAのポジション数が0ではない

3.スプレッドが0.25以内

これで決済も完成です。

OnTick()にSetSymbol();を追加する

OnTick()内部にSetSymbol()を追加。これでBid、Askが値動き毎に取得可能になる。
SetSymbol()関数

MT5にBidやAskというのが使えなくなってしまったので、自分で用意する必要があります。

MT4とMT5に互換性がない

最初は戸惑うと思いますが、MT4にあった関数や機能がMT5では存在しない場合があります。

なので互換性を持たせるために、少し工夫をする必要があります。

EAが完成!

コード全文

あとは

この表示がでる。

これで完成です。

バックテストは出来ない

Windowsの時刻をつかうので、バックテストは出来ないです。

代わりにTradingViewでのバックテストをのせておきます。

ロングエントリールールは2時00分~9時54分に滞在、決済ルールは9時55分に到達。

ショートエントリールールは9時55分~14時59分に滞在、決済ルールは15時00分に到達。

Gotobi Teriyaki by hosono_p on TradingView.com

コードは以下のリンクから確認できます。

ブログの存続のため、TradingViewの有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。

実際に稼働させる

通貨ペア
USDJPYmをダブルクリック
USDJPYmを右クリックでチャートウインドウをクリック
ナビゲーターを開く、対象EAを右クリックしてチャートに追加
アルゴリズムを許可する
アルゴリズム取引を押下する
学帽が青くなったら自動売買がON

これでおわりです。

MT5のEAが完成!

お疲れ様でした。

全部がおわりです。

ゴトー日のEAは勝てるEAだと思っているので実運用しています。

内容でわからないことはコメントに書き込みしてください。

まとめとおさらい

手法をEA化させるには?

エントリーと決済ルールが必要。

MT5のメリット

・無料

・デモ口座が使える

・UIが綺麗

・新しい

MT5のデメリット

・MT5の操作に癖があるので慣れるまでちょっとめんどくさい

・MT4よりもプログラミング難易度が高い

このブログは広告で運営費を捻出しています。

なので広告収入がないとそのうち消滅します。

なので紹介リンクから口座開設の協力をお願いいたします。

ゆくゆくは仮想通貨の自動売買もしたいのでMT5はFXGTの口座を利用します。

あとAmazonで何か買い物をしてください。

ワンピースおもしろい!

ほしい。

いま読んでます。

ゴトー日のアノマリー解説本。

  • -
    コピー

この記事を書いた人

最近のコメント

  1. アバター
  2. アバター
  3. アバター
  4. アバター
  5. アバター

人気記事