いまからMT4で仮想通貨の自動売買をしてみたいという人はいるかい?
ちょっと前まではMT4やMT5で仮想通貨の自動売買をやろうとすると選択肢が少なかったですが、最近ではBybitやExnessでもトレードできるので仮想通貨の自動売買をMT4で作るのも有りだと思えてきました。
MT4は古くからあるツールなのでPythonで作るよりもインターネットの情報が探しやすい点で初心者におすすめです。
Table of Contents
MT4で自動売買EA(エキスパートアドバイザー)を自作する
毎度ですが先にゴールを決めてから作りはじめます。
今回のゴールは、「MAゴールデンクロスの自動売買ツールを完成させる」。
MT4のEA作成手順
自動化させるルール探します。
今回は移動平均線を使ったオーソドックスな手法を使います。
ゴールデンクロスで買い(エントリールール)
利確損切はパーセントで指定(決済ルール)
・エントリー
・決済
の2個のルールが必要
ネットでググるとほとんど情報がでてくるので、きっと作れます。
自動化させるロジックを確認
先にTradingViewでロジックを確認します。
5分足のBTCUSDT、25SMAと60SMAを表示させています。
エントリールールはゴールデンクロス、決済ルールはエントリー価格より上下5%です。
MAゴールデンクロス by hosono_p on TradingView.com
コードは以下のリンクから確認できます。
ブログの存続のため、TradingViewの有料アカウントを申し込むときは以下の紹介リンクから申し込みをお願いします。
MT4のインストール
仮想通貨の自動売買をしたいのでMT4はエクスネスのデモ口座を利用します。
エクスネスのMT4デモ口座の申請方法
お疲れ様でした。これでMT4の準備完了です。次はプログラミング用のエディタを表示させます。
MT4のプログラミングエディタ(メタエディタ)を起動
MQLのプログラムのコードはここに書いていきます。
エキスパートアドバイザーの新規作成
新規でEAを作ります。
テンプレコードの説明
いちおうテンプレの説明しておきます。飛ばしてもOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//+------------------------------------------------------------------+ //| MAゴールデンクロス.mq4 | //| Copyright 2022, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ |
上から9行目まではEAの説明文など
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| MAゴールデンクロス.mq4 | //| Copyright 2022, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict |
最後の property strict で日本語化されます。
他はEAの説明文に転載されます。
// ダブルスラッシュから始まるのはコメントアウトです。
int OnInit()はEA起動時に呼ばれる機能です。
1 2 3 4 5 6 7 8 9 10 |
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } |
int OnDeinit()はEA削除時に呼ばれる機能です。
1 2 3 4 5 6 7 8 |
//+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } |
void OnTick()は値動きがあった時に呼ばれる機能です。
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ |
テンプレには3つの機能がデフォルト搭載されている
・EAを開いたとき
・EAを終了させたとき
・値動き時
今回は値動き時のときだけプログラムのコードを実行させるので値動きだけでOK
OnTick関数は値動きがあったら呼ばれる機能です。
例えばBTCUSDの最小単位0.01が動けば実行されます。
20000.00→20000.01
ちなみにMT4では最小単位をPointと呼びます。
void 何も返さない
実行したときに呼び出し元に何も返さない。
対義としては何かを返す関数。
voidの他に、何かを返す関数はint,double,boolが使われる。
何も返さない場合は void を関数の先頭につける。
OnTickはMT4が実行させているので返却しなくてもいい。
移動平均線SMAを計算する
MT4には組み込み関数でテクニカル指標を計算してくれる機能があるので使います。
ネットで「移動平均線 MQL」と検索するとヒットします。なので説明は割愛します。
これで移動平均線が値動き毎に計算されます。
計算結果を変数に代入しています。
SMA25に移動平均線の計算結果をいれています。
ローソク足1個前の移動平均線と2個前の移動平均線を計算する
25SMA と60 SMAを計算する
エントリールールを計算する
エントリールールはMAのゴールデンクロスです。
チャート画面で確認すると、線がクロスした状態です。
線がクロスしたらBuyエントリーさせます。
このルールを言語化すると2個前の25移動平均線の方が小さい、1個前の25移動平均線の方が大きい
- 2個前のローソク足 SMA25 < SMA60 かつ
- 1個前のローソク足 SMA25 > SMA60
になります。
なので2個前の移動平均線の計算と1個前の移動平均線の計算が必要です。
これをプログラミングコードで翻訳すると、
SMA25_2 < SMA60_2 && SMA25_1 > SMA60_1
になります。
これでエントリールールが計算されました。
条件トリガーでエントリーさせる
条件分岐させます。
==で等しい場合です。 is_buyがtrue(真)の場合波かっこ{}の中が実行されます。
この中にエントリー関数をいれたらエントリーされるのですが、もうひとつの条件をいれます。
ポジション数が0の場合という条件をつける
11行目に追加。
ポジション数をカウントする機能を呼び出します。
しかし、MT4の組み込み関数にはポジション数をカウントする関数がありません。
なので自分で関数をつくります。
ネットで「ポジション数 mql」検索するとヒットしますので。説明は割愛します。
これであとはポジション数が0の場合にします。
プログラミングコードで翻訳すると、
position_count() == 0
です。
int posi = position_count();
で変数に代入にしているのでプログラミングコードは
if(is_buy==true && posi==0){}
になります。
BUY条件達成かつポジション数が0ならエントリー
エントリーも、ネットで「エントリー mql」検索するとヒットしますので。説明は割愛します。
これでエントリーが完成です。
決済ルールを計算する
エントリーしたらエントリーの価格情報を保存しておく必要があります。
色々な方法がありますが、今回はエントリーしたら価格をメモリへ保存します。
メモリの保存はOnTickの外側に変数を作れば可能です。
なので、OnTickの上に、double price;を加えておきます。
関数の外側を外部スコープと呼びます。
関数に属していないのをグローバルスコープと呼びます。
double price;
は関数に属していない、グローバルスコープの変数です。
グローバルスコープにおいてあると処理で変更をしない限りデータは変更されません。
保存しておきたい数字はグローバルスコープへ置くと保存されます。
また、関数に属している変数のことをローカルスコープの変数と呼びます。
ローカルスコープの変数はOnTickが実行されるとデータはリセットされます。
エントリーと同時にグローバルスコープの変数priceに価格を保存しておくようにします。
決済条件は上下5%で損切利確します。
なので、
リミットとストップを計算して、現在価格(終値)と比較します。
条件達成で決済させる
条件達成でoreder_close();させます。
MT4の決済はポジションを選択して、決済させますので、ポジションを選択するコードを挿入します。
これはposition_count()と中身が同じなのでコピペします。
あとは「決済 mql」とネットで検索するとでてきます。
EAが完成!
コード全文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#property strict double price=0.0; void OnTick() { double SMA25_1 = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,1); double SMA25_2 = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,2); double SMA60_1 = iMA(NULL,0,60,0,MODE_SMA,PRICE_CLOSE,1); double SMA60_2 = iMA(NULL,0,60,0,MODE_SMA,PRICE_CLOSE,2); bool is_buy = SMA25_2 < SMA60_2 && SMA25_1 > SMA60_1; int posi = position_count(); if(is_buy==true && posi==0){ OrderSend(NULL,OP_BUY,0.01,Ask,0,0,0,"",11111); price=iClose(NULL,0,0); } double limit = price * 1.05; double stop = price * 0.95; double current_price = iClose(NULL,0,0); bool is_close= limit < current_price || stop > current_price; if(is_close==true){ order_close(); } } int position_count(){ int count = 0; for(int i = OrdersTotal() - 1; i >= 0; i--){ OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY || OrderType() == OP_SELL){ count++; } } return count; } void order_close(){ for(int i = OrdersTotal() - 1; i >= 0; i--){ OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY || OrderType() == OP_SELL){ OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(),0, clrNONE); } } } |
あとは
この表示がでる。
これで完成です。
バックテストする
MT4の画面を開くとバックテストができます。
これで
レポートで右クリックすると
レポートの保存ができます。
レポートは以下のように表示されます。
実際に稼働させる
これでおわりです。
MT4のEAが完成!
お疲れ様でした。
全部がおわりです。
EAの入門からバックテスト、実稼働まで一通りやってみました。
そこまで難しくなかったでしょ?
わからないことはコメントに書き込みしてください。
まとめとおさらい
エントリーと決済ルールが必要。
・無料
・デモ口座が使える
・情報が豊富にある
・MT4の操作に癖があるので慣れるまでちょっとめんどくさい
・仮想通貨の対応している業者が少ない
このブログは広告で運営費を捻出しています。
なので広告収入がないとそのうち消滅します。
なので紹介リンクから口座開設の協力をお願いいたします。
あとAmazonで何か買い物をしてください。
夏はビールがうまい!
FXのEAを作ってみるのもありかも。
BybitがGoogleのIPアドレス規制をしているためです。国内のVPSなら使…
自分のbotで使ってるAPIキーを使用しているんですが、 You have br…
pybit 最新版にコードを変更しました。コードとrequirements.tx…
お返事ありがとうございます。はい。pybit==2.3.0になっております。
コードはあっていると思います。rewuirements.txtは「pybit==…