Gotobi Freeは口座縛りなし・無料で使えるゴトー仲値EAです。本来は開発者さんのブログにて無料公開されていたGotobi Teriyaki(無料版・0.01ロット固定)を筆者が個人的にカスタマイズしています。
無料かつ口座縛りなしのゴトー日EAであることから「Gotobi Free」と名づけています。
Gotobi Freeの特徴はこちら。
- 口座縛りなしで無料で使える(メタエディターでのコンパイルは必要)
- 単一ポジションEAなのでグリッドEAより破綻リスクが低い
- 資金決済需要に基づくため、勝率・期待利得・リスクリワードが高い
Gotobi FreeはソースコードをMT4のメタエディターにコピペしてコンパイルすれば無料で使えます。市販EAと違って口座縛りもないため、複数のブローカー・口座で分散運用することもできます。
複利運用やストップロスなどが設定されていないため、有料のゴトー仲値EAよりは収益性・リスク耐性で劣りますが、一般的な逆張りEA・グリッドEAよりは利益が安定しやすいです。
仲値EAの価格相場は2万円以上と高額です。まずは無料で使えるGotobi Freeをお試し運用して、慣れてきたら複利運用・損切りのあるGotobi Teriyaki(有料版)に切り替えましょう。
バックテスト成績・フォワード運用成績については、トレードロジックが似ているGogoJungleのゴトー仲値EA「GTX」を参考にしてください。(GTXのフォワード成績)
Gotobi Freeのトレードロジック
無料EAを使うにしても基本的なトレードロジックは把握しておきましょう。
Gotobi Freeのトレードロジックの概要はこちら。
- ゴトー日だけドル円の仲値トレード(ゴトー日が土日なら前の金曜日に)
- 買いポジションは日本時間0時から9時55分まで(オリジナル版は2時から)
- 売りポジションは9時55分から13時まで(オリジナル版は15時まで)
ゴトー日とは5・10のつく日のことで、5日・10日・15日・20日・25日・30日を指します。これらの日は日本企業の資金決済需要のため、仲値前はドル円が上がりやすく、仲値後は下がりやすくなります、
仲値前のドル円ロングについては、日本時間の深夜0時からポジションを持っておきます。深夜0時にする理由は、0時より前だと夜間の経済指標の影響を受けやすくなり、0時以降だとポジションの保有期間が短くなり獲得ピップスが少なくなるからです。
仲値後のドル円ショートについては、9時55分から13時までの3時間ほどで切り上げます。仲値後のドル円下落はあまり長続きせず、14時から15時以降になると急落後のリバウンドで獲得ピップスが少なくなるからです。
上記のトレードロジックはゴトー仲値EA「GTX」を参考にしています。2023年1月での販売価格は35,000円と高めですが、ゴトー日の資金決済需要に忠実なトレードをしており収益性は優れています。
Gotobi Freeのソースコード
それではお待ちかね、Gotobi Freeのソースコードはこちら。右上のクリップボードボタンをクリックすればソースコードをコピーできます。(データ引用元)
#property strict
input int magic_number = 510;
input double lots = 0.1;
void OnTick() {
if(is_gotobi() && is_buy_time() && is_weekday() && buy_posi_count()==0 && DayOfWeek() != 1) {
if((Ask - Bid) < 0.25) {
OrderSend(Symbol(),0,lots,Ask,10,0,0,"",magic_number,0,clrGreen);
}
}
if(!is_buy_time() && buy_posi_count()!=0) {
if((Ask - Bid) < 0.25) {
position_close("buy_close");
}
}
if(is_gotobi() && is_sell_time() && is_weekday() && sell_posi_count()==0) {
if((Ask - Bid) < 0.25) {
OrderSend(Symbol(),1,lots,Bid,10,0,0,"",magic_number,0,clrRed);
}
}
if(!is_sell_time() && sell_posi_count()!=0) {
if((Ask - Bid) < 0.25) {
position_close("sell_close");
}
}
}
bool is_gotobi() {
datetime pc_time = TimeLocal();
int day = TimeDay(pc_time);
double amari = MathMod(day,5);
if(amari==0) {
return true;
}
int youbi = TimeDayOfWeek(pc_time);
if(youbi==FRIDAY && amari==3) {
return true;
}
if(youbi==FRIDAY && amari==4) {
return true;
}
return false;
}
bool is_buy_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
for(int i=0; i < 9; i++) {
if(hour == i) {
return true;
}
}
if(hour==9 && minute <= 54) {
return true;
}
return false;
}
bool is_sell_time() {
datetime pc_time = TimeLocal();
int hour = TimeHour(pc_time);
int minute = TimeMinute(pc_time);
if(hour == 9 && 55 <= minute) {
return true;
}
for(int i=10; i < 13; i++) {
if(hour == i) {
return true;
}
}
return false;
}
bool is_weekday() {
datetime pc_time = TimeLocal();
int youbi = TimeDayOfWeek(pc_time);
if(youbi==MONDAY) {
return true;
}
if(youbi==TUESDAY) {
return true;
}
if(youbi==WEDNESDAY) {
return true;
}
if(youbi==THURSDAY) {
return true;
}
if(youbi==FRIDAY) {
return true;
}
return false;
}
int buy_posi_count() {
int count = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY) {
if(OrderSymbol()==Symbol()) {
if(OrderMagicNumber()==magic_number) {
count++;
}
}
}
}
return count;
}
int sell_posi_count() {
int count = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_SELL) {
if(OrderSymbol()==Symbol()) {
if(OrderMagicNumber()==magic_number) {
count++;
}
}
}
}
return count;
}
void position_close(string side) {
if(side=="buy_close") {
for(int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_BUY) {
if(OrderSymbol()==Symbol()) {
if(OrderMagicNumber()==magic_number) {
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue);
}
}
}
}
}
if(side=="sell_close") {
for(int i = OrdersTotal() - 1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() == OP_SELL) {
if(OrderSymbol()==Symbol()) {
if(OrderMagicNumber()==magic_number) {
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrBlue);
}
}
}
}
}
}
収益性を高めるためオリジナル版に以下のカスタマイズを施しています。
- 運用ロット・マジックナンバーの外部パラメーターを追加
- 買いポジションのエントリー時間を「2時→0時」に変更
- 売りポジションのクローズ時間を「15時→13時」に変更
- 月曜日ゴトーで買いポジションを持たないよう設定
EAをすぐに使ってみたいなら、デスクトップ版MT4からメタエディターを起動し、EAテンプレートにコピペしてコンパイルしましょう。
Gotobi Freeの使い方・設定方法
MT4口座を開設する
EA自動売買を始めるには、MT4口座とデスクトップ版MT4が必要です。ブローカー・運用口座については取引コストの低さ・使いやすさ・信頼性の高さなどからAXIORYを推奨しています。
まずはAXIORYでMT4ナノ口座を開設しましょう。(口座開設ページへ)
MT4をダウンロードする(できればVPS内部で)
MT4口座を開設したら、次はデスクトップ版MT4をダウンロードします。
お手持ちのパソコン、あるいはVPSからデスクトップ版MT4を起動しましょう。
VPSはオンラインでレンタルできるパソコン環境(WindowsOS)のことで、24時間EAを稼働し続けるなら必須のサービスとなります。
口座ログインする
デスクトップ版MT4を起動したら、MT4の口座番号・ログインパスワード・サーバー名などを入力してログインします。(口座番号・パスワードはブローカーからのメールで確認する)
MT4メタエディターを開く
MT4口座にログインできたら、MT4の上部メニューにある「黄色い冊子アイコン」をクリックし、メタエディターを開きます。
この手順でメタエディターを開いておくことで、コンパイルしたEAがMT4の「ナビゲーター」ウィンドウに表示されるようになります。
メタエディターを起動したら、メニュー上部の「新規作成」ボタンをクリックし、EAテンプレートを作成します。
ウィザードが表示されますが、EAの名称を入力したら残りは空欄・デフォルトのままで進んでOKです。
EAテンプレートが作成できたら、以下のようなソースコードが表示されます。
既存のソースコードをすべて削除し、Gotobi Freeのソースコードをペーストします。
後はメニュー上部にある「コンパイル」ボタンをクリックすれば、EAが完成します。
コンパイルしたEAは、デスクトップ版MT4左側の「ナビゲーター」ウインドウに表示されます。ナビゲーターでEAを確認したら、USDJPYチャートにドラッグしてEAを設定します。
EAを適用した後、チャートの画面右上に「ニコちゃんマーク」が表示されていれば正常に稼働していることになります。
これでGotobi Freeの設定は完了です。ただ野良EAは動作が保障されていないので、正常に動作するかバックテストしておきましょう。
バックテストを行う(任意)
EAのバックテストはデスクトップ版MT4の「ストラテジーテスター」から行います。
検証するEA・通貨ペア・スプレッド・検証期間などを設定してバックテストを始めましょう。
Gotobi Freeはパソコン時間を参照するため、バックテストも同じように日本時間0時から9時55分まで買い注文、9時55分から13時まで売り注文ができていればOKです。
ただバックテストではパソコン時間(GMT+9)とサーバー時間(GMT+2/3)にズレが生じているため、仲値トレードが正常に行われずEAの収益性は正確に反映されません。
バックテストは取引時間を確認する手段と割り切ってください。(有料版のGotobi Teriyakiなら正確なバックテストが可能)
バックテスト・リアルフォワード成績が知りたい方は、GogoJungleのゴトー仲値EA「GTX」を参照しましょう。トレードロジックが似ているので参考になります。
なおGotobi Freeの運用口座にはAXIORY ナノ口座を推奨しています。最初のうちはデモ口座で試し、そのあとはリアル口座で0.1ロット→1.0ロット→2.0ロットと取引量を増やしていきましょう。
MQL4用語解説
EA開発に興味があるなら、MQL4の基本的なデータ型や関数を頭に入れておきましょう。Gotobi Freeをカスタマイズしたり、他の商用EAを開発したりするときに役立つかもしれません。
Gotobi Freeで使われている関数・データ型はこちら。
- #property strict:厳密なコンパイルモードにすること
- input:グローバル変数(プログラム全体で使える変数)を宣言すること
- int:整数を宣言するときのデータ型
- =:代入演算子の1つ。例えばA=BならBをAに代入する
- ;(セミコロン):1つの処理の終わりを意味する
- double:浮動小数点定数(0.1や1.5など)を宣言するときのデータ型(実数型とも言う)
- void:関数が戻り値を返さない・引数が不要な場合に使う
- OnTick:ローソク足が動いた時に使うイベント関数(特定の条件で呼ばれる関数)
- {}(中括弧):重文処理。関数の中に別の処理を書くときに使う
- &&:AND論理演算子。すべての条件がtrueならtrueになる
- !=:関係演算子(比較演算子)の1つ。両者が等しくなければtrueとなる
- ==:関係演算子の1つ。両者が等しければtrueとなる。
- Ask:買値のレート。スプレッドをプラスした分になる
- Bid:売値のレート。現在レートと同じ
- OrderSend:新規注文を行う関数。11種類の引数(内部パラメーター)を設定する(使い方)
- Symbol:現在チャートの通貨ペア名を返す
- clrGreen:カラー定数のこと。矢印・ラインの色を決める
- !(感嘆符):論理否定。bool関数がオフになる条件を決める
- bool:true/falseのみを返すブーリアン型。関数がオン・オフになる条件を決める
- datetime:日付時刻型。時刻を変数宣言するときに使われる
- TimeLocal:パソコンのローカル時間を返す関数
- TimeDay:指定した日付のデータを返す関数
- MathMod:割り算の余りを返す。MathMod(31,5)なら「31/5の余り=1」になる
- return:関数を終了させる処理(true/falseなどで返すことも)
- TimeDayOfWeek:指定した日付の曜日データを返す
- TimeHour:指定した日付の時を返す(0時〜24時まで)
- TimeMinute:指定した日付の分を返す(0分〜59分まで)
- for:ループ処理を行う。「初期値→ループ終了条件→繰り返し処理」の順で書く
- ++:インクリメント。算術演算子の1つ。ループ終了まで「+1」を繰り返す
- OrdersTotal:保有ポジションと待機注文の合計数を返す
- OrderSelect:注文データを選択する。3種類の引数を設定する(使い方)
- OrderType:選択した注文の注文タイプを返す
- OP_BUY:買いの成行注文。OrderSendで使用する
- OrderSymbol:選択中の通貨ペア名を返す
- OrderMagicNumber:選択中の注文のマジックナンバーを返す
- –:デクリメント。算術演算子の1つ。ループ終了まで「-1」を繰り返す
- OP_SELL:売りの成行注文
- OrderClose:決済注文をする関数。引数は5種類(使い方)
- OrderTicket:選択中の注文のチケット番号を返す関数
- OrderLots:選択中の注文のロット数を返す関数
- OrderClosePrice:選択中の注文の決済価格を返す関数
MQL4のソースコードは難しそうに見えますが、そのほとんどはデータ型と関数なので使い方は決まっています。
そしてゴトー日など特定の条件でトレードをする時のみ、複数の関数を組み合わせて独自の関数を作っていく感じですね。関数の意味が分かればソースコードの概要は把握しやすくなります。
EAを開発したり関数を調べたりするなら、EA開発情報サイト「MT4でEA自作しちゃお〜」が参考になります。
Gotobi Freeの改善案
Gotobi Freeは開発者さんが短時間で作ったものを筆者が軽く改造しただけなので、性能面では荒削りです。収益性を高めるための施策を以下にまとめました。
- 月曜日ゴトーの買い注文をしないようにする
- クリスマス・正月はトレードを停止させる(12/25から1/4まで)
- 複利運用の実装(100万円あたり1.0ロット前後)
- サマータイムの実装(MT4バックテストの精度が上がる)
1番優先度が高いのは、期待値が低い月曜日ゴトーの買い注文だけしないようにすること。月曜日は日本時間6時〜7時からFX市場が始まるため、決済までのポジション保有時間が3時間〜4時間と短く獲得ピップスが少なくなります。
また仲値EAは月曜日の市場開始時間と同時にポジションを保有するため、チャートの上窓が開いた状態でポジションを持つと高値掴みになってしまいます。
さらに普段の買いポジションだと得られるスワップポイントも、月曜日ゴトーだと得られなくなります。トレードの期待値が1.0pipsほど落ちてしまうので、月曜日ゴトーの買い注文は避けたいです。(現在は月曜日ゴトーだけ制限できるようにしています。)
2つ目はクリスマスとお正月のトレード停止。12月25日から1月4日までは通貨の流動性が低下してスプレッド・スリッページが広がりやすくなるため、EAを停止させるのが一般的です。
EAの停止は手動で行えば済む話ですが、例えば12月21日に停止させて23日の金曜日ゴトーで収益チャンスを逃してしまうケースもあります。EAの手動運用は判断ミス・操作ミスのリスクが高いためできるだけ控えたいです。
3つ目は複利運用の実装。有効証拠金が増えるにつれて運用ロットも増えるようにします。
目安としては資金100万円あたり1.0ロット前後の運用で調整します。運用ロットも手動で変更できますが、前述の通りEAの手動設定はミスを誘発しやすいためロット調整も自動化しておきたいです。
4つ目はサマータイムの実装。サマータイムではFX市場の開始時間・終了時間が1時間早くなるため、EAによっては取引時間を調整する必要があります。
Gotobi Freeはバックテストでパソコンの日本時間(GMT+9)を参照しますが、エントリー・決済時間はサーバー時間(GMT+2/3)を参照するため収益性が正確に反映されません。ただバックテストはEAの収益に貢献しないため優先度は低めです。
複利運用・サマータイム調整はすでに有料版Gotobi Teriyakiで実装されています。EAの開発時間を節約したいなら有料版を買うのが手っ取り早いです。