MQL4 お金の健康

FX投資でプログラミングを活用したい!MT4で自動売買を始めよう!

こんにちは、ウチダです。

FX投資の自動売買プログラムで儲けられたら、嬉しいと思いませんか?

業者が販売しているFXツールってすごく高価ですよね。

自動売買って、すごく高価なシステムが必要と思っていたら

実は無料でダウンロードして作れるそうです。

しかもネットやYouTubeでやり方を検索したら、誰でも作れることがわかりました。

そこで今回はプログラミングを使って、FX投資の自動売買をする方法を紹介します。

FX投資の自動売買プログラムづくりにチャレンジしたきっかけ

FX投資の自動売買プログラムづくりにチャレンジしたきっかけ

私はトレーダーの方と一緒にFXの自動売買プログラムづくりにチャレンジしています。

トレーダーの方はプログラミングができる人を探しており、共通の知人経由で会うことになりました。

トレーダーは証券会社に自動売買プログラムを販売して、手数料を得たいと考えていました。

また、素人でもプログラムを使えば、簡単に資産運用できる時代も作りたいと言います。

最初に話を聞いた時、pythonのプログラミングしかやったことないし・・・

と悩んでいましたが、これも経験だと割り切り、一緒に作ることを決めました。

FX投資の自動売買プログラムは誰でも無料で作れる!

FX投資の自動売買プログラムは誰でも無料で作れる!

FX投資では海外取引所を使うのが当たり前だそうです。

トレーダーはXMTradingを使用していたので、ここのツールを使用することにしました。

FX投資の自動売買が作れるXMTradingのサイト

FX投資ではMT4というプラットフォームがよく使われるそうです。

  • MT4とはMetaTrader4の略称で、FX投資に広く利用されているシステムです。
  • 現在では世界中500以上の金融業者および銀行に ライセンス提供されています。
  • 取引のしやすさや、自動売買を簡単に利用できるため、個人投資家を中心に爆発的な人気を得ています。

また、デモ口座も教わりました。

  • デモ口座は架空の資金でFX投資をするための口座です。
  • 自分のお金が減ることはなく、リスク無しで自動売買プログラムを検証できます。

MT4をネットから無料でダウンロードして開きます。

FX投資ができるMT4の画面

次に自動売買を作るためのシステムを開きます。

画面上部の黄色い付箋みたいなやつを開きます。

FX投資の自動売買プログラムが作れるメタエディタ

これがMetaEditorと呼ばれ、ここで自動売買のプログラムを作成できます。

プログラミング言語はMQL4です。

MQL4は、MT4で自動売買したり独自の分析ツールとして使用するための言語です。

C言語に似ていると言われています。

私はC言語も書いたことないので、サンプルプログラムを真似することから始めました。

  • Expertsはエキスパートアドバイザの略称で、自動売買できるプログラムを意味します。
  • Indicators(インジケーター)はチャートに独自の分析を表示できるプログラムです。自動売買はしません。

画面左側のナビゲータからExpertsを開き、Moving Average.mq4を開きます。

//+------------------------------------------------------------------+
//|                                               Moving Average.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Average sample expert advisor"

#define MAGICMA  20131111
//--- Inputs
input double Lots          =0.1;
input double MaximumRisk   =0.02;
input double DecreaseFactor=3;
input int    MovingPeriod  =12;
input int    MovingShift   =6;
//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//--- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//--- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Error in history!");
            break;
           }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
            continue;
         //---
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double ma;
   int    res;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//--- sell conditions
   if(Open[1]>ma && Close[1]<ma)
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(Open[1]<ma && Close[1]>ma)
     {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double ma;
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Open[1]>ma && Close[1]<ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Open[1]<ma && Close[1]>ma)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//---
  }
//+------------------------------------------------------------------+

プログラムはMQL4で書きますが、実はMT4では.mq4ファイルを使用できません。

そこで、MT4で自動売買プログラムとして使える形式(.ex4)に変換します。

やり方は画面上部のコンパイルを押すだけです。

FX投資の自動売買プログラムをコンパイルした

エラーが表示されなければ、これで完了です。

次回はプログラムの中身を詳細に解説していきます。

もし自分で自動売買を学びたいと思ったら、こちらのサイトがおすすめです。

MQL4でEA自作しちゃお〜

異国の戦士のMT4関連情報ブログ

もっと体系的にまとまった資料がほしいなら、書籍がおすすめです。

セットもあります。

ここまで読んでくださりありがとうございました!

FX自動売買のコードの書き方はこちら

おすすめの投資先は金(ゴールド)!プログラミングで分析した話

-MQL4, お金の健康
-,