見出し画像

ゴトー日EA MT4&MT5ソースコード付き

お知らせ

6/10 フォワードテストで気付いた点を更新

10/22微修正しました。


ゴトー日のEAです。






有料部分
MT4ソースコード
MT5ソースコード
MT4EAファイル
MT5EAファイル

微修正版です


最新版MT4ソースコード


//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

#property strict

bool input_sell_on = true;
bool input_friday_on = true;

enum use_times {
   GMT9, //WindowsPCの時間を使って計算する
   GMT9_BACKTEST, // EAで計算された時間を使う(バックテスト用)
   GMT_KOTEI// サーバータイムがGMT+0で固定されている(バックテスト用)
};

input use_times set_time = GMT9;//時間取得方法
input int natu = 6;//夏加算時間(バックテスト用)
input int huyu = 7;//冬加算時間(バックテスト用)
datetime calculate_time() {

   if(set_time == GMT9) {
      return TimeGMT() + 60 * 60 * 9;
   }
   if(set_time == GMT9_BACKTEST) {
      return getJapanTime();
   }
   if(set_time == GMT_KOTEI) {
      return TimeCurrent() + 60 * 60 * 9;
   }

   return 0;

}

input int MagicNumber =1115111;//マジックナンバー
input int Slippage = 10;//スリッページ
input int Spread = 10;//スプレッド制限
input double input_lot = 0.1;//ロットサイズ
input bool hukuri_on = true;//複利を適応する

bool buy_entry_on = true;
bool sell_entry_on = true;
void OnTick() {

   static datetime prev_time = iTime(NULL,1440,0);
   if(TimeHour(calculate_time())==23)
      if(prev_time != iTime(NULL,1440,0)) {
         prev_time = iTime(NULL,1440,0);
         buy_entry_on = true;
         sell_entry_on = true;
      }

   if(is_buy() && is_spread_ok()&&position_count(0) < 1 && buy_entry_on && !is_nenmatu_nensi()) {
      position_entry(0);
   }

   if(input_sell_on) {
      if(is_sell() && is_spread_ok()&&position_count(1) < 1 && sell_entry_on && !is_nenmatu_nensi()) {
         position_entry(1);
         
      }
   }

   if(!is_buy() && is_spread_ok()&&position_count(0) > 0) {
      position_close(0);
   }
   if(!is_sell() && is_spread_ok()&&position_count(1) > 0) {
      position_close(1);
   }
   
   
   if(position_count(0) > 0){buy_entry_on=false;}
   if(position_count(1) > 0){sell_entry_on=false;}

}

bool is_nenmatu_nensi() {
   bool nenmatu = TimeMonth(calculate_time()) == 12 && (TimeDay(calculate_time()) == 25|| TimeDay(calculate_time()) == 26|| TimeDay(calculate_time()) == 27|| TimeDay(calculate_time()) == 28|| TimeDay(calculate_time()) == 29||TimeDay(calculate_time()) == 30|| TimeDay(calculate_time()) == 31) ;
   bool nensi = TimeMonth(calculate_time()) == 1 && (TimeDay(calculate_time()) == 1|| TimeDay(calculate_time()) == 2|| TimeDay(calculate_time()) == 3|| TimeDay(calculate_time()) == 4||TimeDay(calculate_time()) == 5|| TimeDay(calculate_time()) == 6) ;

   return nenmatu || nensi;
}


bool is_spread_ok() {

   return Ask - Bid < Spread * _Point;
}
void position_entry(int side) {

   int ticket=0;

   double qty = input_lot;
   if(hukuri_on) {
      qty = lot_optimize();
   }

   if(qty > 49) {
      qty=49;
   }
   if(side==0) {
      ticket= OrderSend(NULL,side,qty,Ask,Slippage,0,0,"ゴトー日",MagicNumber,0,clrGreen);
      if(ticket > 0) {
         buy_entry_on  =false;
      }
   }
   if(side==1) {
      ticket= OrderSend(NULL,side,qty,Bid,Slippage,0,0,"ゴトー日",MagicNumber,0,clrRed);
      if(ticket > 0) {
         sell_entry_on  =false;
      }
   }



}
bool is_buy() {
   if(is_gotobi() && is_buy_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_buy_time() && is_weekday()) {

         return true;
      }


   }
   return false;
}
bool is_sell() {

int day = TimeDay(calculate_time());


   if(is_gotobi() && is_sell_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_sell_time() && is_weekday()) {

         return true;
      }

   }

   return false;
}
bool is_gotobi() {
   datetime pc_time = calculate_time();
   int day = TimeDay(pc_time);
   double amari = MathMod(day,5);
   if(amari==0) {
      return true;
   }

   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==FRIDAY && amari==3) {
      return true;
   }
   if(youbi==FRIDAY && amari==4) {
      return true;
   }

   return false;
}

bool is_friday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);
   if(youbi==FRIDAY) {
      return true;
   }


   return false;
}
bool is_buy_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);
   
   if(TimeDayOfWeek(pc_time)==THURSDAY){return false;}

   if(hour==4 && minute > 24) {
      return true;
   }

   for(int i=5; i < 9; i++) {
      if(hour == i) {
         return true;
      }
   }

   if(hour==9 && minute <= 54) {
      return true;
   }
   return false;
}
bool is_sell_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);

   if(hour==10 && minute <= 25) {
      return true;
   }

   if(hour==9 && minute >= 55) {
      return true;
   }
   return false;
}


bool is_weekday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==MONDAY) {
      return true;
   }
   if(youbi==TUESDAY) {
      return true;
   }
   if(youbi==WEDNESDAY) {
      return true;
   }
   if(youbi==THURSDAY) {
      return true;
   }
   if(youbi==FRIDAY) {
      return true;
   }
   return false;
}





double lot_optimize() {
   if(AccountInfoString(ACCOUNT_CURRENCY)=="JPY") {
      return NormalizeDouble(AccountBalance() * 0.01 * 0.01 * 0.04,2);
   }
   return NormalizeDouble(AccountBalance() * 0.01 * 0.04,2);

}

int position_count(int side) {

   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderType() == side) {
            if(OrderSymbol()==Symbol()) {
               if(OrderMagicNumber()==MagicNumber) {
                  count++;
               }
            }
         }
      }
   }
   return count;
}
void position_close(int side) {

   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderType() == side) {
            if(OrderSymbol()==Symbol()) {
               if(OrderMagicNumber()==MagicNumber) {
                  bool res= OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrAliceBlue);
               }
            }
         }
      }
   }
}
// 日本時間の取得
datetime getJapanTime() {
   datetime now = TimeCurrent();
   datetime summer = now + 60 * 60 * natu;
   datetime winter = now + 60 * 60 * huyu;

   if(is_summer()) {
      return summer;
   }
   return winter;
}


// サマータイムなら真を返す関数
bool is_summer() {
   datetime now = TimeCurrent();
   int year = TimeYear(now);
   int month = TimeMonth(now);
   int day = TimeDay(now);
   int dayOfWeek = TimeDayOfWeek(now);
   int hours = TimeHour(now);

   if (month < 3 || month > 11) {
      return false;
   }
   if (month > 3 && month < 11) {
      return true;
   }

   // アメリカのサマータイムは3月の第2日曜日から11月の第1日曜日まで
   if (month == 3) {
      int dstStart = 14 - dayOfWeek;
      if (day >= dstStart) {
         return true;
      } else {
         return false;
      }
   }

   if (month == 11) {
      int dstEnd = 7 - dayOfWeek;
      if (day < dstEnd) {
         return true;
      } else {
         return false;
      }
   }
   return false;
}
//+------------------------------------------------------------------+

旧式MT4 ソースコード

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

#property strict

bool input_sell_on = true;
bool input_friday_on = true;

enum use_times {
   GMT9, //WindowsPCの時間を使って計算する
   GMT9_BACKTEST, // EAで計算された時間を使う(バックテスト用)
   GMT_KOTEI// サーバータイムがGMT+0で固定されている(バックテスト用)
};

input use_times set_time = GMT9;//時間取得方法
input int natu = 6;//夏加算時間(バックテスト用)
input int huyu = 7;//冬加算時間(バックテスト用)
datetime calculate_time() {

   if(set_time == GMT9) {
      return TimeGMT() + 60 * 60 * 9;
   }
   if(set_time == GMT9_BACKTEST) {
      return getJapanTime();
   }
   if(set_time == GMT_KOTEI) {
      return TimeCurrent() + 60 * 60 * 9;
   }

   return 0;

}

input int MagicNumber =1115111;//マジックナンバー
input int Slippage = 10;//スリッページ
input int Spread = 80;//スプレッド制限
input double input_lot = 0.01;//ロットサイズ
input bool hukuri_on = false;//複利を適応する

bool buy_entry_on = true;
bool sell_entry_on = true;
void OnTick() {

   static datetime prev_time = iTime(NULL,1440,0);
   if(TimeHour(calculate_time())==23)
      if(prev_time != iTime(NULL,1440,0)) {
         prev_time = iTime(NULL,1440,0);
         buy_entry_on = true;
         sell_entry_on = true;
      }

   if(is_buy() && is_spread_ok()&&position_count(0) < 1 && buy_entry_on && !is_nenmatu_nensi()) {
      position_entry(0);
      buy_entry_on = false;
   }

   if(input_sell_on) {
      if(is_sell() && is_spread_ok()&&position_count(1) < 1 && sell_entry_on && !is_nenmatu_nensi()) {
         position_entry(1);
         sell_entry_on = false;
      }
   }

   if(!is_buy() && is_spread_ok()&&position_count(0) > 0) {
      position_close(0);
   }
   if(!is_sell() && is_spread_ok()&&position_count(1) > 0) {
      position_close(1);
   }

}

bool is_nenmatu_nensi() {
   bool nenmatu = TimeMonth(calculate_time()) == 12 && (TimeDay(calculate_time()) == 25|| TimeDay(calculate_time()) == 26|| TimeDay(calculate_time()) == 27|| TimeDay(calculate_time()) == 28|| TimeDay(calculate_time()) == 29||TimeDay(calculate_time()) == 30|| TimeDay(calculate_time()) == 31) ;
   bool nensi = TimeMonth(calculate_time()) == 1 && (TimeDay(calculate_time()) == 1|| TimeDay(calculate_time()) == 2|| TimeDay(calculate_time()) == 3|| TimeDay(calculate_time()) == 4||TimeDay(calculate_time()) == 5|| TimeDay(calculate_time()) == 6) ;

   return nenmatu || nensi;
}


bool is_spread_ok() {

   return Ask - Bid < Spread * _Point;
}
void position_entry(int side) {

   int ticket=0;

   double qty = input_lot;
   if(hukuri_on) {
      qty = lot_optimize();
   }

   if(qty > 49) {
      qty=49;
   }
   if(side==0) {
      ticket= OrderSend(NULL,side,qty,Ask,Slippage,0,0,"ゴトー日",MagicNumber,0,clrGreen);
      if(ticket > 0) {
         buy_entry_on  =false;
      }
   }
   if(side==1) {
      ticket= OrderSend(NULL,side,qty,Bid,Slippage,0,0,"ゴトー日",MagicNumber,0,clrRed);
      if(ticket > 0) {
         sell_entry_on  =false;
      }
   }



}
bool is_buy() {
   if(is_gotobi() && is_buy_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_buy_time() && is_weekday()) {

         return true;
      }


   }
   return false;
}
bool is_sell() {
   if(is_gotobi() && is_sell_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_sell_time() && is_weekday()) {

         return true;
      }

   }

   return false;
}
bool is_gotobi() {
   datetime pc_time = calculate_time();
   int day = TimeDay(pc_time);
   double amari = MathMod(day,5);
   if(amari==0) {
      return true;
   }

   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==FRIDAY && amari==3) {
      return true;
   }
   if(youbi==FRIDAY && amari==4) {
      return true;
   }

   return false;
}

bool is_friday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);
   if(youbi==FRIDAY) {
      return true;
   }


   return false;
}
bool is_buy_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);

   if(hour==4 && minute > 24) {
      return true;
   }

   for(int i=5; i < 9; i++) {
      if(hour == i) {
         return true;
      }
   }

   if(hour==9 && minute <= 54) {
      return true;
   }
   return false;
}
bool is_sell_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);

   if(hour==10 && minute <= 25) {
      return true;
   }

   if(hour==9 && minute >= 55) {
      return true;
   }
   return false;
}


bool is_weekday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==MONDAY) {
      return true;
   }
   if(youbi==TUESDAY) {
      return true;
   }
   if(youbi==WEDNESDAY) {
      return true;
   }
   if(youbi==THURSDAY) {
      return true;
   }
   if(youbi==FRIDAY) {
      return true;
   }
   return false;
}





double lot_optimize() {
   if(AccountInfoString(ACCOUNT_CURRENCY)=="JPY") {
      return NormalizeDouble(AccountBalance() * 0.01 * 0.01 * 0.04,2);
   }
   return NormalizeDouble(AccountBalance() * 0.01 * 0.04,2);

}

int position_count(int side) {

   int count = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderType() == side) {
            if(OrderSymbol()==Symbol()) {
               if(OrderMagicNumber()==MagicNumber) {
                  count++;
               }
            }
         }
      }
   }
   return count;
}
void position_close(int side) {

   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if(OrderType() == side) {
            if(OrderSymbol()==Symbol()) {
               if(OrderMagicNumber()==MagicNumber) {
                  bool res= OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,clrAliceBlue);
               }
            }
         }
      }
   }
}
// 日本時間の取得
datetime getJapanTime() {
   datetime now = TimeCurrent();
   datetime summer = now + 60 * 60 * natu;
   datetime winter = now + 60 * 60 * huyu;

   if(is_summer()) {
      return summer;
   }
   return winter;
}


// サマータイムなら真を返す関数
bool is_summer() {
   datetime now = TimeCurrent();
   int year = TimeYear(now);
   int month = TimeMonth(now);
   int day = TimeDay(now);
   int dayOfWeek = TimeDayOfWeek(now);
   int hours = TimeHour(now);

   if (month < 3 || month > 11) {
      return false;
   }
   if (month > 3 && month < 11) {
      return true;
   }

   // アメリカのサマータイムは3月の第2日曜日から11月の第1日曜日まで
   if (month == 3) {
      int dstStart = 14 - dayOfWeek;
      if (day >= dstStart) {
         return true;
      } else {
         return false;
      }
   }

   if (month == 11) {
      int dstEnd = 7 - dayOfWeek;
      if (day < dstEnd) {
         return true;
      } else {
         return false;
      }
   }
   return false;
}
//+------------------------------------------------------------------+

MT5ソースコード

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+

int OnInit()
  {
   InitSymbol();
   InitTrade();

   return 0;
  }

bool input_sell_on = true;
bool input_friday_on = true;

enum use_times {
   GMT9, //WindowsPCの時間を使って計算する
   GMT9_BACKTEST, // EAで計算された時間を使う(バックテスト用)
   GMT_KOTEI// サーバータイムがGMT+0で固定されている(バックテスト用)
};

input use_times set_time = GMT9;//時間取得方法
input int natu = 6;//夏加算時間(バックテスト用)
input int huyu = 7;//冬加算時間(バックテスト用)
datetime calculate_time() {

   if(set_time == GMT9) {
      return TimeGMT() + 60 * 60 * 9;
   }
   if(set_time == GMT9_BACKTEST) {
      return getJapanTime();
   }
   if(set_time == GMT_KOTEI) {
      return TimeCurrent() + 60 * 60 * 9;
   }

   return 0;

}

input int MagicNumber =1115111;//マジックナンバー
input int Slippage = 10;//スリッページ
input int iSpread = 80;//スプレッド制限
input double input_lot = 0.01;//ロットサイズ
input bool hukuri_on = false;//複利を適応する

bool buy_entry_on = true;
bool sell_entry_on = true;
void OnTick() {
   SetSymbol();

   if(order_count()!=0)
     {
      return;
     }
   static datetime prev_time = iTime(NULL,PERIOD_D1,0);
   if(TimeHour(calculate_time())==23)
      if(prev_time != iTime(NULL,PERIOD_D1,0)) {
         prev_time = iTime(NULL,PERIOD_D1,0);
         buy_entry_on = true;
         sell_entry_on = true;
      }

   if(is_buy() && is_spread_ok()&&position_count(0) < 1 && buy_entry_on && !is_nenmatu_nensi()) {
      position_entry(0);
      buy_entry_on = false;
   }

   if(input_sell_on) {
      if(is_sell() && is_spread_ok()&&position_count(1) < 1 && sell_entry_on && !is_nenmatu_nensi()) {
         position_entry(1);
         sell_entry_on = false;
      }
   }

   if(!is_buy() && is_spread_ok()&&position_count(0) > 0) {
      position_close(0);
   }
   if(!is_sell() && is_spread_ok()&&position_count(1) > 0) {
      position_close(1);
   }

}

bool is_nenmatu_nensi() {
   bool nenmatu = TimeMonth(calculate_time()) == 12 && (TimeDay(calculate_time()) == 25|| TimeDay(calculate_time()) == 26|| TimeDay(calculate_time()) == 27|| TimeDay(calculate_time()) == 28|| TimeDay(calculate_time()) == 29||TimeDay(calculate_time()) == 30|| TimeDay(calculate_time()) == 31) ;
   bool nensi = TimeMonth(calculate_time()) == 1 && (TimeDay(calculate_time()) == 1|| TimeDay(calculate_time()) == 2|| TimeDay(calculate_time()) == 3|| TimeDay(calculate_time()) == 4||TimeDay(calculate_time()) == 5|| TimeDay(calculate_time()) == 6) ;

   return nenmatu || nensi;
}


bool is_spread_ok() {

   return Ask - Bid < iSpread * _Point;
}

bool is_buy() {
   if(is_gotobi() && is_buy_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_buy_time() && is_weekday()) {

         return true;
      }


   }
   return false;
}
bool is_sell() {
   if(is_gotobi() && is_sell_time() && is_weekday()) {

      return true;
   }

   if(input_friday_on) {
      if(is_friday() && is_sell_time() && is_weekday()) {

         return true;
      }

   }

   return false;
}
bool is_gotobi() {
   datetime pc_time = calculate_time();
   int day = TimeDay(pc_time);
   double amari = MathMod(day,5);
   if(amari==0) {
      return true;
   }

   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==FRIDAY && amari==3) {
      return true;
   }
   if(youbi==FRIDAY && amari==4) {
      return true;
   }

   return false;
}

bool is_friday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);
   if(youbi==FRIDAY) {
      return true;
   }


   return false;
}
bool is_buy_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);
   if(hour==4 && minute > 24) {
      return true;
   }
   for(int i=5; i < 9; i++) {
      if(hour == i) {
         return true;
      }
   }

   if(hour==9 && minute <= 54) {
      return true;
   }
   return false;
}
bool is_sell_time() {
   datetime pc_time = calculate_time();
   int hour = TimeHour(pc_time);
   int minute = TimeMinute(pc_time);

   if(hour==10 && minute <= 25) {
      return true;
   }

   if(hour==9 && minute >= 55) {
      return true;
   }
   return false;
}


bool is_weekday() {

   datetime pc_time = calculate_time();
   int youbi = TimeDayOfWeek(pc_time);

   if(youbi==MONDAY) {
      return true;
   }
   if(youbi==TUESDAY) {
      return true;
   }
   if(youbi==WEDNESDAY) {
      return true;
   }
   if(youbi==THURSDAY) {
      return true;
   }
   if(youbi==FRIDAY) {
      return true;
   }
   return false;
}



// 日本時間の取得
datetime getJapanTime()
  {
   datetime now = TimeCurrent();
   datetime summer = now + 60 * 60 * natu;
   datetime winter = now + 60 * 60 * huyu;

   if(is_summer())
     {
      return summer;
     }
   return winter;
  }


// サマータイムなら真を返す関数
bool is_summer()
  {
   datetime now = TimeCurrent();
   int month = TimeMonth(now);
   int day = TimeDay(now);
   int dayOfWeek = TimeDayOfWeek(now);
   int hours = TimeHour(now);

   if(month < 3 || month > 11)
     {
      return false;
     }
   if(month > 3 && month < 11)
     {
      return true;
     }

// アメリカのサマータイムは3月の第2日曜日から11月の第1日曜日まで
   if(month == 3)
     {
      int dstStart = 14 - dayOfWeek;
      if(day >= dstStart)
        {
         return true;
        }
      else
        {
         return false;
        }
     }

   if(month == 11)
     {
      int dstEnd = 7 - dayOfWeek;
      if(day < dstEnd)
        {
         return true;
        }
      else
        {
         return false;
        }
     }
   return false;
  }
int TimeMonth(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.mon);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeDay(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.day);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeHour(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.hour);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeMinute(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.min);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int TimeDayOfWeek(datetime date)
  {
   MqlDateTime tm;
   TimeToStruct(date,tm);
   return(tm.day_of_week);
  }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_entry(int side)
  {

   double qty = input_lot;
   if(hukuri_on)
     {
      qty = lot_optimize();
     }

   if(qty > 10)
     {
      qty=10;
     }
   double close = iClose(NULL,0,0);
   if(side==0)
     {
      bool res= iTrade.Buy(qty,NULL,0,0,0,"ゴトー日");
     }
   if(side==1)
     {
      bool res= iTrade.Sell(qty,NULL,0,0,0,"ゴトー日");
     }

  }
double lot_optimize()
  {
   if(AccountInfoString(ACCOUNT_CURRENCY)=="JPY")
     {
      return NormalizeDouble(  AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * 0.01 * 0.04,2);
     }
   return NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE) * 0.01 * 0.04,2);

  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int position_count(int side)
  {
   int count =0;
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==side)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  count++;
                 }
              }
           }
        }
     }
   return count ;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int order_count()
  {
   int count =0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if("" != OrderGetString(ORDER_SYMBOL))
        {
         if(Symbol()==OrderGetString(ORDER_SYMBOL))
           {
            if(OrderGetInteger(ORDER_MAGIC)==MagicNumber)
              {
               count++;
              }
           }
        }
     }

   return count ;
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_close(int side)
  {

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if("" != PositionGetSymbol(i))
        {
         if(PositionGetInteger(POSITION_TYPE)==side)
           {
            if(Symbol()==PositionGetString(POSITION_SYMBOL))
              {
               if(PositionGetInteger(POSITION_MAGIC)==MagicNumber)
                 {
                  iTrade.PositionClose(PositionGetTicket(i));
                 }
              }
           }
        }
     }
  }



#include <Trade\SymbolInfo.mqh>
CSymbolInfo iSymbol;
double Bid,Ask,High,Low,Spread;
void InitSymbol()
  {
   iSymbol.Name(Symbol());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetSymbol()
  {
   iSymbol.RefreshRates();
   Bid = iSymbol.Bid();
   Ask = iSymbol.Ask();
   High = iHigh(NULL,PERIOD_CURRENT,0);
   Low = iLow(NULL,PERIOD_CURRENT,0);
   Spread = iSymbol.Spread();
  }
#include <Trade\Trade.mqh>
CTrade iTrade;
void InitTrade()
  {
   iTrade.SetDeviationInPoints(Slippage);
   iTrade.SetTypeFillingBySymbol(Symbol());
   iTrade.SetExpertMagicNumber(MagicNumber);
  }

ロジックの説明

五十日アノマリーです。
ロングの時間は5時から9時55分
ショートの時間は9時55分から10時30分



最近のデータ解析による傾向

木曜日は外したほうがいいかも。円高傾向になる。

金曜日が円安なら、木曜日が円高傾向になるのはなにかあるのかもしれません。

木曜日無しがこれです。

フォワードテストで気付く

以下ドル円スプレッドを計測するPythonのコードです。

import pandas as pd
import MetaTrader5 as mt5
from datetime import timedelta

# MT5への接続
mt5.initialize()

# 読み込む通貨ペアと時間枠、データの件数を指定
symbol = 'USDJPYm'
timeframe = mt5.TIMEFRAME_M1
count =10000

# データの取得
rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

# DataFrameに変換
df = pd.DataFrame(rates)

# 日時をPandasの日時形式に変換し、GMT+9に変換
df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=9)

print(df)

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter

# スプレッドの可視化
sns.set_style("whitegrid")
plt.figure(figsize=(12, 6))
sns.lineplot(data=df, x='time', y='spread')

# x軸の目盛りを時刻にして分まで表示
date_formatter = DateFormatter('%H:%M')
plt.gca().xaxis.set_major_formatter(date_formatter)
plt.xticks(rotation=45)

plt.title('Spread Visualization')
plt.xlabel('Time')
plt.ylabel('Spread')
plt.show()

import plotly.express as px

# スプレッドの可視化
fig = px.line(df, x='time', y='spread')

# x軸の目盛りを時刻にして分まで表示
fig.update_xaxes(
    tickformat='%H:%M',
    tickangle=45
)

fig.update_layout(
    title='Spread Visualization',
    xaxis_title='Time',
    yaxis_title='Spread'
)

fig.show()


スプレッド調査

あれ?エクスネスのspreadって5時からこんなに拡大するんでしたっけ?

もしや仲値の対策でしょうか?

その対策でソースコードをちょっと付け加えました。

5時エントリーを4時25分エントリーに変更しましょう。

   if(hour==4 && minute > 24) {
      return true;
   }


これは同じ日のEURUSDです。

EURUSDはスプレッド調査したら6時から拡大しています。

おまけ:ここだけの話

ドル円の時間帯の値動きの特徴を調査するとアノマリーを発見できます。

import pandas as pd
import MetaTrader5 as mt5
from datetime import timedelta
import seaborn as sns
import matplotlib.pyplot as plt

# MT5への接続
mt5.initialize()

def fetch_and_prepare(symbol, timeframe, count, timezone_hours, ratio_calculation):
    # データの取得
    rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

    # DataFrameに変換
    df = pd.DataFrame(rates)

    # 日時をPandasの日時形式に変換し、GMT+9に変換
    df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=timezone_hours)

    df[ratio_calculation.name] = ratio_calculation(df)

    return df

def high_low_ratio(df):
    return (df['high'] - df['low']) / df['low']

def close_open_ratio(df):
    return (df['close'] - df['open']) / df['open']

def plot_avg_return(df, column_name):
    # インデックスを日付に変換
    df.set_index('time', inplace=True)

    # 5分ごとの平均リターンを計算
    df['5min_avg_return'] = df[column_name].rolling(window=5).mean()

    # 時刻をグループ化して平均を計算
    grouped_df = df.groupby(df.index.time).mean()

    # 時刻を文字列に変換
    grouped_df.index = grouped_df.index.astype(str)

    # グラフの作成
    plt.figure(figsize=(50, 10))
    sns.barplot(x=grouped_df.index, y=grouped_df['5min_avg_return'])
    plt.xlabel('Time')
    plt.ylabel('5min Average Return')
    plt.title('5-minute Average Return (Grouped by Time)')

    # X軸のラベルを斜めに表示
    plt.xticks(rotation=90)

    plt.show()

def fetch_and_prepare(symbol, timeframe, count, timezone_hours, ratio_calculation, column_name):
    # データの取得
    rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)

    # DataFrameに変換
    df = pd.DataFrame(rates)

    # 日時をPandasの日時形式に変換し、GMT+9に変換
    df['time'] = pd.to_datetime(df['time'], unit='s') + timedelta(hours=timezone_hours)

    df[column_name] = ratio_calculation(df)

    return df

# 読み込む通貨ペアと時間枠、データの件数を指定


symbols = ['USDJPYm']

for symbol in symbols:
    timeframe = mt5.TIMEFRAME_M5
    count = 100000
    timezone_hours = 9
    print(symbol,"時間帯の値動きの特徴")
    df = fetch_and_prepare(symbol, timeframe, count, timezone_hours, high_low_ratio, 'high_low_ratio')
    plot_avg_return(df, 'high_low_ratio')

    df = fetch_and_prepare(symbol, timeframe, count, timezone_hours, close_open_ratio, 'close_open_ratio')
    plot_avg_return(df, 'close_open_ratio')



まだEA界隈に気づかれてないので、この時間帯は内緒でお願いします。

ここから先は

0字
このマガジンで読み放題です。

EA開発者のためのサンプルコード集

よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!