初心者が30分で作る「ドル円ゴトー日」無料EA

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

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

初心者むけです。

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

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

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

MT4の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の有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。

MT4のインストール

仮想通貨の自動売買をしたいのでMT4はエクスネスのデモ口座を利用します。

Exness公式サイト(紹介リンク)

エクスネスのMT4デモ口座の申請方法

マイアカウント
新規口座開設
デモ口座をためす

パスワードを入力して口座開設
口座パスワードはMT4ログイン時に使うので控えておく
デモ口座の完成
取引を押す
口座IDが表示される
Windowsのターミナルをインストール
exeを起動
実行
セットアップ
次へを押す
完了
完了を押すと勝手にMT4が起動する
ファイル>ログイン
デモ口座のアカウント情報を入力
MT4のインストール、デモ口座の準備が完了
通貨ペアから仮想通貨の通貨を表示させる
表示>通貨ペアリスト
USDJPYmを表示させる
通貨ペアに表示された
右クリックでチャート表示させる
チャートが表示された
ほその

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

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

メニューから新規注文の右にあるメモ帳を押す
メタエディタの起動が完了

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

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

新規でEAを作ります。

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

テンプレコードの説明

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

上から9行目までは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の現在の日本時間を取得する

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

市販の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日からの経過秒

int型
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を追加して修正

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

変更前

変更後

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以内

これで決済も完成です。

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を右クリック
5分足を選択
ナビゲーターを開く、チャートに表示させる
自動売買を許可する
自動売買を押下する
☺で自動売買がON

これでおわりです。

MT4のEAが完成!

お疲れ様でした。

全部がおわりです。

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

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

まとめとおさらい

手法をEA化させるには?

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

MT4のメリット

・無料

・デモ口座が使える

・情報が豊富にある

MT4のデメリット

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

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

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

なので紹介リンクから口座開設よろしくお願いします。

Amazonで何か買い物をしたい場合は以下のリンクからお買い物してください。

Exness公式サイト(紹介リンク)

夏はビールがうまい!

FXのEAを作ってみるのもありかも。

質問と回答

Q
エントリーや決済の時間を変更したいという場合は、どこを書き換えれば良いのでしょうか?
A

is_buy_time()を変更してください。

このコードの説明を省いていたので、改めて説明します。

for文の中の、

for(int i=2; i < 9; i++) 

翻訳すると

「2から始まり、9未満」の数字が繰り返し入ります。

i=2,
i=3,
i=4,
i=5,
i=6,
i=7,
i=8

その下の条件分岐は

hourはPCの現在時刻の時間を取得していますので、

i は「2~8」

hour は「現在のPCの時間の時間の単位」

なので現在時刻が

7時30分なら、

hourは「7」です。

ということで、時間を変更する場合は、

int i=2; i < 9を変更してください。

Q
このコードでは任意のロット設定の部分がありませんが、書き加えるとしたらどのように書き加えれば良いのでしょうか?
A

この部分に以下の文を追加します。

input double lots = 0.1;

そのあと、オーダーコマンドを改変します。

変更前

OrderSend(Symbol(),0,0.1,Ask,10,0,0,"",magic_number,0,clrGreen); 

変更後

OrderSend(Symbol(),0,lots,Ask,10,0,0,"",magic_number,0,clrGreen); 

参考サイト

Q
返信遅くなり申し訳ありません。丁寧な解説をいただきありがとうございます。
エントリ―、決済時間についてですが、例えばBUYポジションを3時30分から10時までの間に保持、ということであれば、
bool is_buy_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
if(hour == 3 && 30 <= minute) {
return true;
}
for(int i=4; i < 10; i++) {
if(hour == i) {
return true;
}
}
return false;
これで良いと思うのですが、これを9時55分まで、としたい場合(つまり、3時30分から9時50分まで)としたい場合には、どのように記述すべきなのか答えが見つからず悩んでおります。
同様にショートも10時エントリー、14時半決済であれば
bool is_sell_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
for(int i=10; i < 14; i++) {
if(hour == i) {
return true;
}
}
if(hour==14 && minute <= 30) {
return true;
}
return false;
}
で良いと思うのですが、10時05分~14:30、という設定をする場合の記載も、うまく設定ができません。
アドバイスいただければ幸いです。
※後ほど、お礼にビール送らせていただきます!
A

return true;」 に注目してみるといいかもしれません。

関数の波かっこ{ }の中でのみ使えるのが

return true;

です。

おそらくこれがあやふやになっているから、記載方法がわからなくなったのではと思いましたのので、まずは return true;について説明します。

return true;は日本語で翻訳すると、

真で戻る」 です。

もっと詳細に説明すると、

is_buy_time() を呼び出すと、 「真または、偽」 が返却return)されます。

真または、偽とは、プログラミングでしか使わない日本語です。

一般的には「bool」を正誤○×と思っていただいて大丈夫です。

is_buy_time() の文の先頭に「bool」(真偽値)とつけています。

bool is_buy_time()

これを日本語で翻訳すると、

正誤返却する装置」 です。

なので bool is_buy_time()の役目は、BUYエントリー時間なら ”正” 返却することです。

そして、大事なのが、

返却した時点で役目が完了します。

これを踏まえて、

変更前

変更後(3時30分から9時54分)

ショートの部分(10:05~14:30という設定)

return は自由に追加ができます。

ちなみにvoid場合は、 return;と書けばその時点で処理が終了して、何もデータを返却しません。

こちらで説明は大丈夫でしょうか?

ご厚意いただきありがとうございます😀

ほしいものリストです。

  • -
    コピー

この記事を書いた人

最近のコメント

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

人気記事