見出し画像

日足ブレイクアウトEA MT4ソースコード付き

割引あり

現在無料で全文読めます。

日足高値安値ブレイクアウトで内部的トレーリングストップで決済します。


注意!

期待利得が低いのでスプレッドに依存、ブローカーに依存します。

また、フォワードテストの結果はよくないのでお蔵入りさせています。

MT4ソースコード

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

#property strict

int input_SL = 120;
int trail_trigger = 10;
int trail_haba = 10;

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 =1118111;//マジックナンバー
input int Slippage = 10;//スリッページ
input int Spread = 10;//スプレッド制限
input double input_lot = 0.01;//ロットサイズ
input bool hukuri_on = false;//複利を適応する

void OnTick() {




   bool kadou_gbp = TimeHour(calculate_time()) != 2 &&
                    TimeHour(calculate_time()) != 3 &&
                    TimeHour(calculate_time()) != 4 &&
                    TimeHour(calculate_time()) != 5 &&
                    TimeHour(calculate_time()) != 6 &&
                    TimeHour(calculate_time()) != 7 &&
                    TimeHour(calculate_time()) != 8 &&
                    TimeHour(calculate_time()) != 9 &&
                    TimeHour(calculate_time()) != 10&&
                    TimeHour(calculate_time()) != 11&&
                    TimeHour(calculate_time()) != 12&&
                    TimeHour(calculate_time()) != 13&&
                    TimeHour(calculate_time()) != 14&&
                    TimeHour(calculate_time()) != 15;


   bool kadou_eur = TimeHour(calculate_time()) != 0 &&
                    TimeHour(calculate_time()) != 1 &&
                    TimeHour(calculate_time()) != 2 &&
                    TimeHour(calculate_time()) != 3 &&
                    TimeHour(calculate_time()) != 4 &&
                    TimeHour(calculate_time()) != 5 &&
                    TimeHour(calculate_time()) != 6 &&
                    TimeHour(calculate_time()) != 7 &&
                    TimeHour(calculate_time()) != 8 &&
                    TimeHour(calculate_time()) != 9 &&
                    TimeHour(calculate_time()) != 10&&
                    TimeHour(calculate_time()) != 11&&
                    TimeHour(calculate_time()) != 12&&
                    TimeHour(calculate_time()) != 13&&
                    TimeHour(calculate_time()) != 14;

   bool kadou_jpy = TimeHour(calculate_time()) != 2 &&
                    TimeHour(calculate_time()) != 3 &&
                    TimeHour(calculate_time()) != 4 &&
                    TimeHour(calculate_time()) != 5 &&
                    TimeHour(calculate_time()) != 6 &&
                    TimeHour(calculate_time()) != 7 &&
                    TimeHour(calculate_time()) != 8 &&
                    TimeHour(calculate_time()) != 9 ;

   bool kadou = false;
   if(StringFind(Symbol(),"JPY",0) >=0) {
      kadou = kadou_jpy;
   } else if(StringFind(Symbol(),"EUR",0) >=0) {
      kadou = kadou_eur;
   } else {
      kadou = kadou_gbp;
   }


   bool kadou2_eur = TimeDayOfWeek(calculate_time()) != SATURDAY;
   bool kadou2_jpy = TimeDayOfWeek(calculate_time()) != SATURDAY;
   bool kadou2_gbp = TimeDayOfWeek(calculate_time()) != MONDAY && TimeDayOfWeek(calculate_time()) != FRIDAY&& TimeDayOfWeek(calculate_time()) != SATURDAY;


   bool kadou2 = false;
   if(StringFind(Symbol(),"JPY",0) >=0) {
      kadou2 = kadou2_jpy;
   } else if(StringFind(Symbol(),"EUR",0) >=0) {
      kadou2 = kadou2_eur;
   } else {
      kadou2 = kadou2_gbp;
   }



   bool kadou3 = Ask - Bid < Spread * _Point;
   if(kadou && kadou2&& kadou3) {

      if(position_count(0)<1 && position_count(1)<1) {
         sl_price=0;
         for(int i =1; i <= 1; i++) {
            if(is_buy(i)) {
               position_entry(0);
            }
            if(is_sell(i)) {
               position_entry(1);
            }
         }
      }
   }



   trailing_stop();
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool is_buy(int num) {

   static datetime prev_time = 0;
   static datetime prev_time2 = 0;
   static bool buy_on= true;
   static double day_high10 = iHigh(NULL,PERIOD_D1,0) + 10 * _Point;

   if(prev_time != iTime(NULL,PERIOD_D1,0)) {
      prev_time = iTime(NULL,PERIOD_D1,0);
      buy_on = true;
      day_high10 = iHigh(NULL,PERIOD_D1,0) + 10 * _Point;
   }

   if(prev_time2 != iTime(NULL,PERIOD_D1,0) &&  TimeHour(calculate_time()) == 21 && StringFind(Symbol(),"JPY",0) >=0) {
      prev_time2 = iTime(NULL,PERIOD_D1,0);
      buy_on = true;
      day_high10 = iHigh(NULL,PERIOD_D1,0) + 10 * _Point;
   }
   double max=0;
   for(int i = num; i >= 0; i--) {
      if(max < iHigh(NULL,PERIOD_D1,i)) {
         max = iHigh(NULL,PERIOD_D1,i);
      }
   }
   bool C = iHigh(NULL,PERIOD_M1,0) >= iHigh(NULL,PERIOD_D1,num) && iHigh(NULL,PERIOD_D1,num) ==max;

   bool D = iHigh(NULL,PERIOD_M1,0) >= iHigh(NULL,PERIOD_D1,0) && iHigh(NULL,PERIOD_D1,0) ==max;

   if((C || StringFind(Symbol(),"EUR",0) >=0?D:false) && buy_on) {
      buy_on =false;
      return true;
   }
   if((C || StringFind(Symbol(),"JPY",0) >=0?D:false) && buy_on) {
      buy_on =false;
      return true;
   }

   return false;
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool is_sell(int num) {

   static datetime prev_time = 0;
   static datetime prev_time2 = 0;
   static bool sell_on= true;
   static double day_low10 = iLow(NULL,PERIOD_D1,0) - 10 * _Point;

   if(prev_time != iTime(NULL,PERIOD_D1,0)) {
      prev_time = iTime(NULL,PERIOD_D1,0);
      sell_on = true;
      day_low10 = iLow(NULL,PERIOD_D1,0) - 10 * _Point;

   }

   if(prev_time2 != iTime(NULL,PERIOD_D1,0) &&  TimeHour(calculate_time()) == 21) {
      prev_time2 = iTime(NULL,PERIOD_D1,0);
      sell_on = true;
      day_low10 = iLow(NULL,PERIOD_D1,0) - 10 * _Point;
   }

   double min=9999999;
   for(int i = num; i >= 0; i--) {
      if(min > iLow(NULL,PERIOD_D1,i)) {
         min = iLow(NULL,PERIOD_D1,i);
      }
   }
   bool C = iLow(NULL,PERIOD_M1,0) <= iLow(NULL,PERIOD_D1,num) && iLow(NULL,PERIOD_D1,num) ==min;
   bool D = iLow(NULL,PERIOD_M1,0) <= iLow(NULL,PERIOD_D1,0) && iLow(NULL,PERIOD_D1,0) ==min;
   if((C||(StringFind(Symbol(),"EUR",0) >=0?D:false))&& sell_on) {
      sell_on =false;
      return true;
   }
   if((C||(StringFind(Symbol(),"JPY",0) >=0?D:false))&& sell_on) {
      sell_on =false;
      return true;
   }
   return false;
}
double SL = input_SL * _Point;
void position_entry(int side) {

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

   if(qty > 10) {
      qty=10;
   }
   if(side==0) {
      int res= OrderSend(NULL,side,qty,Ask,Slippage,0,0,"日足ブレイクアウト",MagicNumber,0,clrGreen);
      if(res  > 0) {
         sl_price = Ask - SL;
      }
   }
   if(side==1) {
      int res= OrderSend(NULL,side,qty,Bid,Slippage,0,0,"日足ブレイクアウト",MagicNumber,0,clrRed);
      if(res  > 0) {
         sl_price = Bid + SL;
      }
   }

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void position_modify_SL(int side,double price) {

   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= OrderModify(OrderTicket(),OrderOpenPrice(),price,0,0,clrNONE);
               }
            }
         }
      }
   }
}



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

double sl_price = 0;
void trailing_stop() {
   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

         if(OrderSymbol()==Symbol()) {
            if(OrderMagicNumber()==MagicNumber) {

               if(OrderType()==0) {
                  if(Bid > OrderOpenPrice() + trail_trigger * _Point) {
                     if(Bid > sl_price + trail_haba * _Point) {
                        sl_price=Bid - trail_haba * _Point;
                     }
                  }
               }
               if(OrderType()==1) {
                  if(Ask < OrderOpenPrice() - trail_trigger * _Point) {
                     if(Ask < sl_price - trail_haba * _Point) {
                        sl_price=Ask + trail_haba * _Point;
                     }
                  }




               }


               if(OrderType()==0 && sl_price>Bid && sl_price!=0) {
                  position_close(0);
               }

               if(OrderType()==1 && sl_price<Ask && sl_price!=0) {
                  position_close(1);
               }


            }
         }

      }
   }




}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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) {
   bool kadou3 = Ask - Bid < Spread * _Point;
   if(!kadou3) {
      return;
   }
   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(),Slippage,clrAliceBlue);
                  sl_price = 0;
               }
            }
         }
      }
   }
}

// 日本時間の取得
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;
}

ここから先は

0字
この記事のみ ¥ 1,980〜

この記事が気に入ったらサポートをしてみませんか?