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自動売買のコードの書き方はこちら

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

1995年生まれ、佐賀県出身。 高専を卒業して大手化学メーカーの研究職に就職するが、投資で1200万円作ったので好きなことをやろうと決め、5年で退職する。 現在は保険代理店に勤めながらお金から自由になる仕組みづくりに挑戦している。 趣味は国内旅行。「コロナが明けたら旅行に行こう」が妻との合言葉。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA