FX自動売買基礎と応用

RSIを使ったEA(自動売買)の作成方法を実際のコードを用いて解説


RSIとは?

RSIとは「Relative Strength Index」の略語で、直訳すると「相対力指数」です。
計算式は「一定期間における値上がり幅の合計」を「一定期間における値上がりおよび値下がり幅の合計」で割った値で、相場の買われすぎや売られすぎを判断ができます。

RSIの大まかな動きは、チャートの動きに追従

チャートの形とRSIの形を見ると分かるように、RSIの大まかな動きは、チャートの動きに追従します。
RSIはチャートの情報を元に計算しているので、チャートが動いてからRSIも動きます。
決して未来予測を行うものではないので注意してください。
RSIが優れている点は、チャートの値動きを0~100の間で表現ができる点です。
値が0~100に収まっているので、「RSIが20以下だと売られすぎ」「RSIが80以上だと買われすぎ」といった判断がしやすく、プログラミングにも落とし込みやすい指標なのです。

RSIの詳細については、以下の記事をご参考下さい。
>RSIの基本的な見方、使い方、トレーディングアイデアを紹介

仕様

まずは作成するEAの仕様をまとめましょう。
ここで仕様を整理することで、プログラムのクオリティのアップにつながります。

エントリー条件

RSIが売られすぎラインを下回ったら、買いエントリー
RSIが買われすぎラインを上回ったら、売りエントリー

決済条件

利確価格と損切り価格による決済

その他の条件

著作権を「OANDA」に設定
スリッページ、スプレッドによってエントリーを制限する
ポジションは同時に1つのみ保有するようにする
マジックナンバーとロット数を変更できるようにする

EAを作成する

プログラムは前回の「3.MAを使ったEAを作ってみよう」の記事と同様に、「プリプロセッサ」「フィールド」「関数(OnInit)」「関数(OnInit以外)」の順番に記述していきます。
なお、同記事で解説した内容は、随時省略していきます。

「プリプロセッサ」「フィールド」「関数(OnInit)」「関数(OnInit以外)」の順番に記述

プリプロセッサ


#property copyright " Copyright(C) 2023, OANDA "
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

デフォルトのプリプロセッサから、copyrightの部分を「Copyright(C) 2023, OANDA」に変更しました。
こうすることで、ユーザーがEAをチャートに適用した際に著作権の保持者が誰なのかが明確に分かります。

デフォルトのプリプロセッサから、copyrightの部分を「Copyright(C) 2023, OANDA」に変更するとユーザーがEAをチャートに適用した際に著作権の保持者が誰なのかが明確に分かります

    TIPS 著作権

    コピーライトを書く理由は、著作権の保持者が誰なのかを明確にするという理由の他に、「著作物発行年を明確にする」という目的もあります。
    ちなみに正しいコピーライトマークは「©」ですが、MT4は環境上「©」を正確に表示できないので、「Copyright(c)」で代用しています。

フィールド


input int                   MAGICMA = 23498721;                       // マジックナンバー
input double                Lots =0.01;                                  // 1ロット十万通貨単位
input int                   Slippage = 4;                                 // エントリー見送りスリッページ
input double                MaxSpread = 5;                              // エントリー見送りスプレッド
input double                TakeProfit = 10.0;                           // 利益確定幅(pips)
input double                LossCut = 20.0;                             // 損切確定幅(pips)
input int                   RSIPeriod=14;                               // 期間
input   ENUM_APPLIED_PRICE  RSIAppliedPrice = PRICE_CLOSE;      // 適用価格
input int                   UpLine = 70;                                // 上の線
input int                   DownLine = 30;                             // 下の線

double dSpread;

今回はRSI用のパラメータ「期間」「適用価格」「上の線」「下の線」を用意しています。
RSIが「上の線」で設定した値を上回れば売りエントリー、「下の線」で設定した値を下回れば買いエントリーが行われます。
また、利確と損切り用のパラメータ「TakeProfit」と「LossCut」を追加しました。
単位については、よりユーザーが分かりやすいようにpipsで指定できるようにします。

OnInit関数


int OnInit()
{
   return(INIT_SUCCEEDED);
}

OnInit関数は前回と同様に、追記することはありません。

OnTick関数


void OnTick()
{
   dSpread = (Ask - Bid) / (Point * 10);
   if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen(); 
}

OnTick関数も、前回と全く同じです。
CalculateCurrentOrders関数で現在保有中のポジション数を計算し、ポジション数が0でかつスプレッドがパラメータで指定したスプレッド未満の場合、CheckForOpen関数が呼ばれてエントリーが行われます。
このように「ポジション数を計算する関数」「エントリーを行う関数」と機能ごとに関数を作成して使うことで、より時間を節約して見やすいコードを記述できます。

CheckForOpen関数


void CheckForOpen()
{
   int res;
   double RSI = iRSI(Symbol(), 0, RSIPeriod, RSIAppliedPrice, 1);
   
   if(RSI < DownLine)
   {
      res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid - LossCut * Point * 10, Ask + TakeProfit * Point * 10,"", MAGICMA, 0, Red);
   }
   if(RSI > UpLine)
   {
      res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask + LossCut * Point * 10,  Bid - TakeProfit * Point * 10, "", MAGICMA, 0, Blue);//
   }
}

CheckForOpen関数では、RSIの値がパラメータで設定した「下のライン」を下回っていれば買いエントリー、「上のライン」を上回っていれば売りエントリーを行います。
まずはdouble型の変数RSIにiRSI関数の結果を格納します。
その後if文で買われすぎと売られすぎを判定して逆張りのエントリーを行います。
OrderSend関数の第6引数と第7引数は、それぞれ利確価格と損切り価格を指定できます。
MT4のオーダー発注画面に置き換えたものが以下です。

MT4のオーダー発注画面に置き換えたもの

プログラム全文


#property copyright "Copyright(C) 2023, OANDA"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int                   MAGICMA = 23498721;                         // マジックナンバー
input double                Lots =0.01;                                 // 1ロット十万通貨単位
input int                   Slippage = 4;                               // エントリー見送りスリッページ
input double                MaxSpread = 5;                              // エントリー見送りスプレッド
input double                TakeProfit = 10.0;                          // 利益確定幅(pips)
input double                LossCut = 20.0;                             // 損切確定幅(pips)
input int                   RSIPeriod=14;                               // 期間
input   ENUM_APPLIED_PRICE  RSIAppliedPrice = PRICE_CLOSE;              // 適用価格
input int                   UpLine = 70;                                // 上の線
input int                   DownLine = 30;                              // 下の線

double dSpread;

int OnInit()
{
   return(INIT_SUCCEEDED);
}
void OnTick()
{
   dSpread = (Ask - Bid) / (Point * 10);
   if(CalculateCurrentOrders()==0 && dSpread < MaxSpread) CheckForOpen();//ポジションを持っていなければポジションを得る   

}
void CheckForOpen()
{
   int res;
   double RSI = iRSI(Symbol(), 0, RSIPeriod, RSIAppliedPrice, 1);
   
   if(RSI < DownLine)
   {
      res=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid - LossCut * dPoint, Ask + TakeProfit * dPoint,"", MAGICMA, 0, Red);
   }
   if(RSI > UpLine)
   {
      res=OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, Ask + LossCut * dPoint,  Bid - TakeProfit * dPoint, "", MAGICMA, 0, Blue);
   }
}

int CalculateCurrentOrders()
{
   int positions = 0;
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
      {
      positions++;
      }
   }
   return positions;
}

EA(自動売買)を学びたい方へオススメコンテンツ

EA運用の注意点

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。


本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。

この記事をシェアする

ホーム » FX自動売買基礎と応用 » RSIを使ったEA(自動売買)の作成方法を実際のコードを用いて解説