【MQL4プログラミング】自動売買の作り方!FXで使えるテンプレートあり

【上級編】自動売買の作り方
朝日奈りさ
朝日奈りさ

FXで自動売買を使いたい。でも売っているものは怪しい。という方に自動売買の作り方を解説します!
さらに、FXで使えるテンプレートを無料配布します!

はじめに

この記事は、MQLプログラミング基礎を理解している方向けに作成しております。

もしMQLプログラミングがわからないという方は、先に以下の記事を読んでおくことをオススメします。

カテゴリー:MQLプログラミング基礎

 

また、FX自動売買を作成している過程で、エントリー・決済してしまう可能性がございます。

作成する際には、十分に注意しながらプログラミングしてください。

 

FX自動売買とは

FX(Forex eXchange)は、自動売買を使うことができます。

自動売買とは、エントリー・決済のタイミングを自動で判断してくれるものです。

実際にエントリー・決済を実行しますので、何もしなくてもトレードを行ってくれます。

そのため自動売買は、忙しい方やチャートを見れない方に最適な方法です。

 

今回は、FXで使える自動売買を自作する方法について解説していきます。

リアル口座で使えるテンプレートもありますので、ぜひ内容を理解して、使いこなせるようにがんばりましょう!

 

もしこちらの記事を読んでいない方は、先にFX自動売買の危険性について理解すると良いでしょう。

 

FX自動売買を作るための準備

MT4またはMT5をインストールしましょう。

MT4/MT5は、FXトレードができるソフトです。

ここではMT4を使っていきます。

 

MT4はFXトレードができるだけでなく、自動売買の実行・作成・テストをすることができます。

そのため、FX自動売買を作ったり、動かしたりする場合は、MT4がなければなりません。

もしMT4をインストールしていない方は、この機会にインストールしてしまいましょう。

 

FX会社によっては、MT4を提供していない場合がありますので、その場合はMT4を提供しているFX会社に乗り換えましょう。

当サイトは IS6FXの口座で動作確認をしておりますので、もしMT4口座を持っていない場合は、こちらが良いでしょう。

 

FX自動売買の作り方

それでは、FX自動売買の具体的な作り方を見ていきましょう。

作る順番としては以下の通りです。

注意して欲しいのは、OrderSend関数などの注文を出す関数は、一番最後にプログラミングしましょう。

テスト中にエントリーされたら困るからですね。

  1. 口座凍結の対策する
  2. 決済ロジックをプログラムする
  3. エントリーロジックをプログラムする
  4. 注文関数(OrderSend関数など)をプログラムする

 

上から順番にプログラミングすることで、スムーズに自動売買を作れると思います。

 

口座凍結の対策をする

FX自動売買で重要なのは、しっかりとしたロジックを考えることです。

しかし、ロジックを考えることより重要なのが、口座凍結にならないようにプログラミングすることです。

口座凍結になったら元も子もありません。

そのため、一番初めに口座凍結にならないためのプログラミングをしていきましょう。

 

まずは口座凍結になる原因について確認します。

FX会社によって異なりますが、大抵は以下のことに気をつけると良いでしょう。

  • 超スキャルピングトレードにならないこと
  • 注文が失敗したときに、連続で注文しないこと
  • ロット数を設定できること
  • 最大ロット数を超えないこと
  • 最大ポジション数を超えないこと
  • 損切りと利確を入れられること

 

なぜダメなのかは、自動売買の危険性について理解を深めましょう。

 

プログラムテンプレートを作る

それでは、口座凍結の原因を対策したプログラムテンプレートを作成します。

一つずつ見ていきます。

 

 

「超スキャルピングトレードにならないこと
 注文が失敗したときに、連続で注文しないこと」

まずはこちらの2項目の対策をしていきます。

対策の考え方ですが、「エントリーした後、一定時間エントリーしない」という考え方で対策します。

いろいろやり方はあるのですが、ここでは時間足に注目します。

「一定時間」を「次のティックが出るまで」に置き換えてみましょう。

すると「エントリーした後、次のティックが出るまでエントリーしない」という考え方が出来上がるので、これでプログラムを作っていきましょう。

//連続でエントリーしないためのフラグ(大域変数)
datetime time = Time[0];

//初期関数(価格が動くごとに実行)
void OnTick()
  {
  //---

  //連続でエントリーしないようにする
  //time変数が、現在の時間ではない場合に実行する
     if(time != Time[0])
       {
     
        //time変数に、現在の時間を代入
        time = Time[0];

        //ここにエントリー注文などのプログラムを書く

       }
  }

 

大域変数(グローバル変数)として、datetime型のtimeという変数を作ります。

そして「time変数が、現在の時間ではない場合」というif文を追加し、そのif文の中で、time変数に現在の時間を代入します。

 

このように書くことで、超スキャルピングトレードを防ぐことができます。

実行させたときの動きを追ってみると、以下のようになります。

新しいティックが出ると、順番が増えるというイメージで見てください。

順番time変数の中身time != Time[0]実行可否
1Time[0]false
2Time[1]true
2.1Time[0]false
3Time[1]true
3.1Time[0]false

 

このように、新しいティックが出たときに、1回だけ実行されます。

次に実行されるのは、また新しいティックが出たときです。

 

 

「ロット数を設定できること 最大ロット数を超えないこと 最大ポジション数を超えないこと」

次はこの3項目をプログラムしていきます。

これらの設定は外部入力ができると便利なので、以下のようにプログラミングします。

//外部入力(大域変数)
input double LOT = 0.01; //ロット数の設定
input double MAXLOT = 1; //最大ロット数の設定
input double MAXPOSITION = 200; //最大ポジション数

//初期関数(価格が動くごとに実行)
void OnTick()
  {
//---

//現在のポジション数を代入する変数
   int positionNum = 0;

//ここに現在のポジション数を更新するプログラムを書く

//最大ロット数のチェック
   if(LOT > MAXLOT)
      return;

//最大ポジション数のチェック
   if(positionNum > MAXPOSITION)
      return;

//ここにLOTを考慮した、エントリーのプログラムを書く

  }

 

それぞれの項目をチェックして、異常があれば何もしないというプログラムです。

あとはLOTを考慮したエントリープログラムを書いたらOKです。

 

 

「損切りと利確を入れられること」

損切りと利確も、外部から入力できるようにしてしまいましょう。

以下のように書きます。

//外部入力(大域変数)
input double TAKEPROFIT_WIDTH = 100; //利確幅(単位point)
input double STOPLOSS_WIDTH = 100; //損切り幅(単位point)

 

これらの項目も、エントリーするタイミングで使うようにプログラムしましょう。

 

 

口座凍結対策をしたプログラムの全体像

以下のプログラムは、口座凍結対策をしたプログラムのまとめです。

このプログラムに、ロジックやエントリー注文のプログラムを追加することで、比較的安全な自動売買を作ることができます。

//+------------------------------------------------------------------+
//|                                   SampleMQL_Program_Template.mq4 |
//|                                   Copyright 2021, Risa FX Vtuber |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Risa FX Vtuber"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property description "ダウンロードありがとうございます!"
#property description "RisaFXチャンネルです^^"
#property description "投資は自己責任です。余剰資金で行うようにしましょう。"

#property strict

//連続でエントリーしないためのフラグ
datetime time = Time[0];

//外部入力
input double LOT = 0.01; //ロット数の設定
input double MAXLOT = 1; //最大ロット数の設定
input double MAXPOSITION = 200; //最大ポジション数
input double TAKEPROFIT_WIDTH = 100; //利確幅(単位point)
input double STOPLOSS_WIDTH = 100; //損切り幅(単位point)

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

//現在のポジション数を代入する変数
   int positionNum = 0;

//ここに現在のポジション数を更新するプログラムを書く

//最大ロット数のチェック
   if(LOT > MAXLOT)
      return;

//最大ポジション数のチェック
   if(positionNum > MAXPOSITION)
      return;

//連続でエントリーしないようにする
//time変数が、現在の時間ではない場合に実行する
   if(time != Time[0])
     {

      //time変数に、現在の時間を代入
      time = Time[0];

      //ここにロジックやエントリー注文を書く
      //エントリーサンプル(実行しないでください!!)
      //int buy = OrderSend(Symbol(), OP_BUY, LOT, Ask, 30, Ask-STOPLOSS_WIDTH, Ask+TAKEPROFIT_WIDTH, "自動売買を作ろう!", 9999, clrNONE);
     }
  }
//+------------------------------------------------------------------+

 

 

 

決済ロジックをプログラミングする

口座凍結の対策はできましたので、次は決済のロジックをプログラミングしていきます。

決済のやり方ですが、以下の順番で実行させます。

  1. ポジションを選択
  2. 決済のロジックに当てはまっているか判定
  3. 実際に決済

 

上記の流れをプログラムします。

 

プログラムテンプレートを作る

一つずつ見ていくと、まとまらないので、一気に見ていきます。

以下のように書くと良いでしょう。

void OnTick()
  {
//---

//現在のポジション数を代入する変数
   int positionNum = 0;

//ポジションチェック
   for(int i = 0; i < OrdersTotal(); i++)
     {
      //ポジションを選択
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         //ポジションの通貨ペアとEAの通貨ペアが一致しているか
         if(OrderSymbol() == Symbol())
           {
            //マジックナンバーが一致しているか
            if(OrderMagicNumber() == MAGICNUMBER)
              {
               //買いポジションの場合
               if(OrderType() == OP_BUY)
                 {
                  positionNum++;
                  //ここに決済ロジックを書く(if文)
                  //bool close = OrderClose(OrderTicket(), OrderLots(), OrderOpenPrice(), SLIPPAGE);
                 }
               //売りポジションの場合
               if(OrderType() == OP_SELL)
                 {
                  positionNum++;
                  //ここに決済ロジックを書く(if文)
                  //bool close = OrderClose(OrderTicket(), OrderLots(), OrderOpenPrice(), SLIPPAGE);
                 }
              }
           }
        }
     }
  }

 

このように書くことで、ポジションを選択、決済ロジック、実際に決済するところまで書きました。

OrderClose関数以外にも、いろいろな関数を使っています。

便利な関数なので、この機会に全て覚えてしまいましょう。

 

 

エントリーロジックをプログラミングする

エントリーロジックは、自由に作成してください。

移動平均線を使うロジックならiMA関数、RSIを使うロジックならiRSI関数と言ったように、便利な関数が用意されていますので、利用すると良いでしょう。

ここでは、具体的にプログラミングはしません。

MQLプログラミングでは、エントリーロジックを考えるところが一番楽しいところなので、楽しみながら作成してください!

 

【追記】iMA関数を利用したゴールデンクロス・デッドクロスのサンプルプログラムを作成しておりますので、書き方はこちらを参考にしてください。

 

実際に注文を出す関数をプログラミングする

それでは実際に注文を出してみましょう。

注文はOrder○○○関数を使います。

主に使うのは、OrderSend関数OrderClose関数です。

これらの注文関数は、実際にエントリーをしてしまうので、取り扱いには十分注意しましょう。

 

それでは先程のプログラムに追記してみましょう。

//+------------------------------------------------------------------+
//|                                   SampleMQL_Program_Template.mq4 |
//|                                   Copyright 2021, Risa FX Vtuber |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, Risa FX Vtuber"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property description "ダウンロードありがとうございます!"
#property description "RisaFXチャンネルです^^"
#property description "投資は自己責任です。余剰資金で行うようにしましょう。"

#property strict

//連続でエントリーしないためのフラグ
datetime time = Time[0];

//外部入力
input double LOT = 0.01; //ロット数の設定
input double MAXLOT = 1; //最大ロット数の設定
input double MAXPOSITION = 200; //最大ポジション数
input double TAKEPROFIT_WIDTH = 100; //利確幅(単位point)
input double STOPLOSS_WIDTH = 100; //損切り幅(単位point)

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

//現在のポジション数を代入する変数
   int positionNum = 0;

//ポジションチェック
   for(int i = 0; i < OrdersTotal(); i++)
     {
      //ポジションを選択
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         //ポジションの通貨ペアとEAの通貨ペアが一致しているか
         if(OrderSymbol() == Symbol())
           {
            //マジックナンバーが一致しているか
            if(OrderMagicNumber() == 9999)
              {
               //買いポジションの場合
               if(OrderType() == OP_BUY)
                 {
                  positionNum++;
                  //ここに決済ロジックを書く(if文)
                  //bool close = OrderClose(OrderTicket(), OrderLots(), OrderOpenPrice(), SLIPPAGE);
                 }
               //売りポジションの場合
               if(OrderType() == OP_SELL)
                 {
                  positionNum++;
                  //ここに決済ロジックを書く(if文)
                  //bool close = OrderClose(OrderTicket(), OrderLots(), OrderOpenPrice(), SLIPPAGE);
                 }
              }
           }
        }
     }

//最大ロット数のチェック
   if(LOT > MAXLOT)
      return;

//最大ポジション数のチェック
   if(positionNum > MAXPOSITION)
      return;

//連続でエントリーしないようにする
//time変数が、現在の時間ではない場合に実行する
   if(time != Time[0])
     {

      //time変数に、現在の時間を代入
      time = Time[0];

      //ここにロジックやエントリー注文を書く
      //エントリーサンプル(実行しないでください!!)
      //int buy = OrderSend(Symbol(), OP_BUY, LOT, Ask, 30, Ask-STOPLOSS_WIDTH, Ask+TAKEPROFIT_WIDTH, "自動売買を作ろう!", 9999, clrNONE);
     }
  }
//+------------------------------------------------------------------+

 

非常に長いですが、こちらがプログラムテンプレートの完成版になります。

ロジックの部分は作っておりませんので、考えてみてください。

逆にいえば、ロジックの部分さえ作れれば、自動売買を作ることができますので、頑張ってみてください!

 

 

【補足】コンパイル

プログラミング用語で、コンパイルという言葉があります。

これはプログラムを変換し、パソコンが実行できるようにする処理のことです。

そのため、プログラムを書いた後は、必ずコンパイルをしてください。

プログラムを書いただけでは、実行できませんのでご注意ください。

MT4の標準機能として、コンパイルも搭載されているので、ワンクリックで終わります。

 

FX自動売買の作り方のまとめ

ここまで、FX自動売買を作成するために、プログラムのテンプレートを解説しました。

口座凍結対策からエントリー注文を出すところまで、サンプルプログラムを用意しましたので、ダウンロードして使っていただけると嬉しいです。

あとは、ロジックを追加するだけです。

ロジックを追加するのは、かなり難易度が高いです。

しかし、このテンプレートを使うだけで、ロジック以外の部分は完成しておりますので、勉強がんばりましょう!

 

 

FX自動売買を24時間稼働

FX自動売買のメリットとして、24時間動かすことが挙げられます。

上記の通り、自動売買はプログラムなので、パソコンを起動することができれば、24時間動かせます。

ですが、パソコンをつけっぱなしにするのは、なかなか難しいです。

そこでVPSを利用しましょう!

VPSとは、パソコンを24時間起動してくれるサービスです。

そのため、自動売買ととても相性が良いので、この機会に調べてみるのも良いでしょう。

 

まとめ

今回はFX自動売買の作り方から、プログラムテンプレートまで解説しました。

自動売買の基本となる口座凍結対策などをプログラムしました。

ロジックの部分は、考えるのが一番楽しいところなので、詳しく解説はしておりませんが、他の部分は完璧にできているので、使ってみてください。

また、自動売買を作成したあとは、VPSを使って24時間動かしてみましょう。

自動売買で稼げるだけでなく、朝起きるのが楽しみになると思います!