オセアニア時間帯の窓開け埋めを利用したEA作成中

投稿者: | 4月 3, 2020

オセアニア時間帯の窓開けの埋め


一日の市場開始であるオセアニア市場時間帯は市場の規模が小さいので、東京市場時間帯までは荒れやすく、東京市場開始時点で前日の終値からの乖離大きくなることがあります。発生した乖離は東京市場が開始されると前日の終値に近くなる傾向があります。
そこで、オセアニア市場時間帯の前日終値からの窓開けの穴埋めを狙ったEAを作成中です。

検証結果


検証中ですので肌感での結果ですが、ポンド円の様に、値動きが荒い通貨ベアだと、オセアニア市場時間帯の前日から差異が大きく発生し戻りも良いようです。ドル円の通貨ペアの成果はいまいちにです。

現時点のソース


まだ検証中ですが、サンプルソースは下記の通りです。おいおいソースも奇麗にして、解説もしていこうと思います。

#include <stdlib.mqh>


extern string ポジションオープン = "==========================================================";
input double wBigPoint_Symbol = 100;   //Symbolオープン幅
input double wBigPoint_USDJPY = 100;   //USDJPYオープン幅
input double wBigPoint_GBPJPY = 325;   //GBPJPYオープン幅

extern string TP幅 = "==========================================================";
input double wTp = 10;


extern string ロット数管理 = "==========================================================";
extern double tradeLots = 0; //トレードロット
extern double tradeLotsterm = 100000; //1ロット金額
extern double tradeMaxLots = 5; //マックスロット数
extern double tradeMinLots = 1; //ミニマムロット数



input int MAGIC = 20190629;
input int Slippage = 5;
int nowbar = -1;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   int ret = 0;
   int type = 0;
   double sl = 0;
   double tp = 0;
   double price = 0;
   string SymbolPaire = Symbol();

   string commentMsg = "";

//openOrderTralingEvenIf();

//---------------------------------------------------------
// 同一バー内での重複取引を禁止
//---------------------------------------------------------
   if(nowbar == Bars)
     {
      return;
     }
   nowbar = Bars;

//-----------------------------------------------------------------------------
// ロット調整
//-----------------------------------------------------------------------------
   double lots = 0;
   if(tradeLots != 0)
     {
      lots = MarketInfo(SymbolPaire, MODE_MINLOT)*tradeLots;  // ロットの最小値
     }
   else
     {
      lots = MarketInfo(SymbolPaire, MODE_MINLOT)
             * MathMin(MathMax(MathFloor(AccountFreeMargin()/tradeLotsterm),tradeMinLots),tradeMaxLots);
     }


//---------------------------------------------------------
// トレード開始
//---------------------------------------------------------
   OnTickSymbolPaire(Symbol(),wBigPoint_Symbol,lots);

  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTickSymbolPaire(string SymbolPaire,double wBigPoint,double lots)
  {

   int ret = 0;
   int type = 0;
   double sl = 0;
   double tp = 0;
   double price = 0;

   string commentMsg = "";

//---------------------------------------------------------
// ローソク足情報取得
//---------------------------------------------------------
   ENUM_TIMEFRAMES period = 0;

   MqlRates rates[];
   int count = ArrayCopyRates(rates, SymbolPaire, period);

//---------------------------------------------------------
// 東京市場 09:00(2:00 3:00) 開始
//---------------------------------------------------------
   if(TimeHour(rates[0].time) == 2)
     {
      //printf(TimeToStr(rates[0].time, TIME_DATE | TIME_MINUTES));
      if(MathAbs(rates[0].open - rates[3].close) > wBigPoint * MarketInfo(SymbolPaire, MODE_POINT))
        {

         printf("オセアニア窓開け "
                + "窓開け幅:" + DoubleToStr(MathAbs(rates[0].open - rates[3].close), (int)MarketInfo(SymbolPaire, MODE_DIGITS))
                + "開始時間:" + TimeToStr(rates[0].time, TIME_DATE | TIME_MINUTES) + "OPEN"
                + "始値:" + DoubleToStr(rates[0].open, (int)MarketInfo(SymbolPaire, MODE_DIGITS))
                + "終了時間:" + TimeToStr(rates[3].time, TIME_DATE | TIME_MINUTES) + "CLOSE"
                + "終値:" + DoubleToStr(rates[3].close, (int)MarketInfo(SymbolPaire, MODE_DIGITS))
               );
        }
      else
        {
         //printf("オセアニア窓開け無し");
         return;
        }

      //---------------------------------------------------------
      // オセアニア市場 00:00(6:00 6:00) 開始
      //---------------------------------------------------------
     }
   else
      if(TimeHour(rates[0].time) == 0)
        {

         for(int i = 0; i < OrdersTotal(); i++)
           {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
              {
               ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage);
              }
           }
         return;

        }
      else
        {
         //printf(TimeToStr(rates[0].time, TIME_DATE | TIME_MINUTES));
         return;
        }

//---------------------------------------------------------
// 買いポジション
//---------------------------------------------------------
   if(rates[0].open < rates[3].close)
     {
      printf("買いポジションチェック");

      // 設定値
      type = OP_BUY;
      price = MarketInfo(SymbolPaire, MODE_ASK);

      //sl = MarketInfo(SymbolPaire, MODE_ASK) - 1000 * MarketInfo(SymbolPaire, MODE_POINT);
      //sl = MarketInfo(SymbolPaire, MODE_ASK) -MathAbs(rates[0].open - rates[3].close);
      sl = 0;
      tp = rates[3].close - wTp * MarketInfo(SymbolPaire, MODE_POINT);

      //注文送信
      ret = OrderSend(SymbolPaire,
                      type, lots, price, Slippage,
                      sl, tp,
                      commentMsg,
                      MAGIC,
                      0,
                      clrBlue);
     }

//---------------------------------------------------------
// 売りポジション
//---------------------------------------------------------
   if(rates[0].open > rates[3].close)
     {
      printf("売りポジションチェック");
      // 設定値
      type = OP_SELL;
      price = MarketInfo(SymbolPaire, MODE_BID);

      //sl = MarketInfo(SymbolPaire, MODE_BID) + 1000 * MarketInfo(SymbolPaire, MODE_POINT);
      //sl = MarketInfo(SymbolPaire, MODE_BID) + MarketInfo(SymbolPaire, MODE_ASK) -MathAbs(rates[0].open - rates[3].close);
      //sl = 0;
      tp = rates[3].close + wTp * MarketInfo(SymbolPaire, MODE_POINT);

      //注文送信
      ret = OrderSend(SymbolPaire,
                      type, lots, price, Slippage,
                      sl, tp,
                      commentMsg,
                      MAGIC,
                      0,
                      clrBlue);
     }


//----------------------------------------------------------
// エラー時ログ出力
//----------------------------------------------------------
   int    errorcode;
   if(ret == -1)                   // 注文変更拒否
     {
      //   Sleep(300);                         // 300msec待ち
      errorcode = GetLastError();        // エラーコード取得
      printf("ポジション保持エラー。エラーコード:%d , 詳細:%s "
             , errorcode,  ErrorDescription(errorcode));
     }

  }


/*------------------------------------------------------
関数名  openOrderTraling

内容    トレーリング

引数    なし

戻り値   なし

-------------------------------------------------------*/

extern double TrailingStopS = 50;//トレーリングスタート
extern double TrailingStopW = 25;//トレーリング幅

extern double lossLimit = 5;//買値上損切りの儲けpoint
extern double lossLimitdiff = 40;//買値上損切り幅point

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void openOrderTralingEvenIf()
  {

   string msg = "";
   int    errorcode;

   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {

         // sl値変更
         bool modify_ret = false;

         //----------------------------------------------------------
         //買い トレーリングストップ イーブンイフ
         //----------------------------------------------------------
         if(OrderType() == OP_BUY)
           {

            //トレーリングストップ
            if(MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice() > TrailingStopS * MarketInfo(OrderSymbol(), MODE_POINT)
               && OrderStopLoss() < MarketInfo(OrderSymbol(), MODE_BID) - TrailingStopW * MarketInfo(OrderSymbol(), MODE_POINT))
              {
               modify_ret = OrderModify(OrderTicket(), OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_BID) - MarketInfo(OrderSymbol(), MODE_POINT) * TrailingStopW, OrderTakeProfit(), 0, Green);
              }

            //イーブンイフ
            else
               if(MarketInfo(OrderSymbol(), MODE_BID) > OrderOpenPrice() + (lossLimit + lossLimitdiff) * MarketInfo(OrderSymbol(), MODE_POINT)
                  && OrderStopLoss() != 0
                  //&& OrderStopLoss() < OrderOpenPrice()+lossLimit*MarketInfo(OrderSymbol(), MODE_POINT)
                 )
                 {
                  modify_ret = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() + lossLimit * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), 0, Green);
                  printf("買いイーブンイフ");
                 }
           }

         //----------------------------------------------------------
         //売り トレーリングストップ イーブンイフ
         //----------------------------------------------------------
         if(OrderType() == OP_SELL)
           {

            //トレーリングストップ
            if((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK)) > TrailingStopS * MarketInfo(OrderSymbol(), MODE_POINT)
               &&
               (
                  OrderStopLoss() > (MarketInfo(OrderSymbol(), MODE_ASK) + TrailingStopW * MarketInfo(OrderSymbol(), MODE_POINT))
                  || OrderStopLoss() == 0
               )

              )
              {
               modify_ret = OrderModify(OrderTicket(), OrderOpenPrice(), MarketInfo(OrderSymbol(), MODE_ASK) + MarketInfo(OrderSymbol(), MODE_POINT) * TrailingStopW, OrderTakeProfit(), 0, Orange);
              }
            //イーブンイフ
            else
               if(MarketInfo(OrderSymbol(), MODE_ASK) < (OrderOpenPrice() - (lossLimit + lossLimitdiff) * MarketInfo(OrderSymbol(), MODE_POINT))
                  && OrderStopLoss() != 0
                  /*
                  && (
                      OrderStopLoss() > (OrderOpenPrice()-lossLimit*MarketInfo(OrderSymbol(), MODE_POINT))
                      || OrderStopLoss()==0
                     )
                  */
                 )
                 {
                  modify_ret = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice() - lossLimit * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), 0, Orange);
                  printf("売りイーブンイフ");
                 }
           }

         //----------------------------------------------------------
         //トレーリングストップ イーブンイフ エラー時ログ出力
         //----------------------------------------------------------
         if(modify_ret != false)                   // 注文変更拒否
           {
            //   Sleep(300);                         // 300msec待ち
            errorcode = GetLastError();        // エラーコード取得
            printf("注文変更拒否。エラーコード:%d , 詳細:%s "
                   , errorcode,  ErrorDescription(errorcode));
           }
        }

     }
  }
//+------------------------------------------------------------------+

参考図書


今回開発中のEAは下記図書の「シドニー市場のギャップトレード」をベースにしています。

FXプロの定石


カテゴリー: FX MT4