日足ブレイクアウト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;
}
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!