ゴトー日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字
このマガジンで読み放題です。
FX自動売買開発入門サンプルコードセット
10,000円
EA開発者のためのサンプルコード集
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!