FX自動売買基礎と応用

朝スキャEAの作成方法を実際のコードを用いて解説【コピペで使用可能】


朝スキャとは?

朝スキャとは、比較的値動きの緩やかな日本時間早朝の時間を狙ってスキャルピングを行う手法のことです。
「値動きが緩やか」→「レンジ相場になりやすい」→「買われすぎ売られすぎの反発を狙って逆張り」という流れでエントリーを行います。
では本当に日本時間早朝は値動きが緩やかなのでしょうか?
下の画像で確認してみましょう。

30分足のUSDJPYのチャートです。
サブウィンドウには出来高を表示しています。
MT4における出来高は「ティックの更新頻度」のことです。
つまり「30分間に何回レートが更新されたか」を表しています。
このように山と谷が連続して発生しており、極端に出来高が小さいポイントと大きいポイントがあることが分かります。
この出来高が小さいポイントが日本時間早朝にあたり、相場も緩やかになる傾向にあるというわけです。

仕様

まずは作成するEAの仕様をまとめましょう。

エントリー

時間が日本時間早朝かつRSIが売られすぎラインを下回ったら、買いエントリー
時間が日本時間早朝かつRSIが買われすぎラインを上回ったら、売りエントリー

決済

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

その他

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

EAを作成する

プログラムは前回の「4.RSIを使ったEAを作ってみよう」に時間による制限のフィルターをかけます。
今回は変更点のみ記述していきます。

フィールド


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=6;                                // 期間
input   ENUM_APPLIED_PRICE  RSIAppliedPrice = PRICE_CLOSE;      // 適用価格
input int                   UpLine = 85;                                // 上の線
input int                   DownLine = 25;                             // 下の線
input int                   TradeTime = 0;                             // トレードを行う時間

double dSpread;

前回のプログラムに「トレードを行う時間」というパラメータを追加しています。
ここで指定した時間(0時台)の場合のみエントリーを許すようにします。
OANDAのMT4はサーバー時間GMT+3、冬時間+2を採用しており、GMT+9の日本時間とは時差があります。
この時差を考慮すると、日本時間の早朝(6時~7時)はMT4では0時となるので、今回は「トレードを行う時間」の値を0に設定します。

CheckForOpen関数


void CheckForOpen()
{
   int res;
   double RSI = iRSI(Symbol(), 0, RSIPeriod, RSIAppliedPrice, 1);
   if(TradeTime == TimeHour(Time[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);//
      }
   }
}

エントリー条件に、現在の時間がパラメータで指定した時間かどうかを判定するif分を追加しています。
TimeHour関数はdatetime型の変数を引数に取り、その引数の時間(0~23)を返してくれる関数です。

バックテスト

今回のEAをバックテストした結果です。

通貨ペア:GBPUSD
時間足:5分足
期間:2018年1月1日~2023年1月1日の5年間
スプレッド:15固定

このように時間制限とRSIだけで十分優位な結果を得られました。
このロジックにさらに指標やトレーリングストップなどを追加することで、より良いEAを開発ができるようになるでしょう。

注意点

今回のバックテストは、スプレッド固定で行っています。
日本時間早朝の相場が緩やかになる時間帯は、スプレッドが広がりやすいという特徴があります。
実運用を行うにはスプレッド制限をかけるなど十分にスプレッドに十分注意しましょう。

プログラム全文


#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=6;                                // 期間
input   ENUM_APPLIED_PRICE  RSIAppliedPrice = PRICE_CLOSE;              // 適用価格
input int                   UpLine = 85;                                // 上の線
input int                   DownLine = 25;                              // 下の線
input int                   TradeTime = 0;                              // トレードを行う時間
  
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(TradeTime == TimeHour(Time[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);
      }
   }
}

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;
}      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
      {
      positions++;
      }
   }
   return positions;
}

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

EA運用の注意点

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


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

この記事をシェアする

ホーム » FX自動売買基礎と応用 » 朝スキャEAの作成方法を実際のコードを用いて解説【コピペで使用可能】