//+------------------------------------------------------------------+ //| RSI_Tester_News_Example.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com/ru/users/progman | //+------------------------------------------------------------------+ #property copyright "https://www.mql5.com/ru/users/progman" #property version "1.18" #property link "https://www.mql5.com/ru/users/progman" #property description "RSI_Tester_News_Example" #property strict extern string a01="=== GMT & Daylight saving time ==="; extern int GMT=2; int GMT_Correct; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ enum DSTtype { e1 = 1, // Off DST e2 = 2, // Europe DST e3 = 3, // USA DST }; extern DSTtype DST_choice=2; extern bool Fix_GMT_2011_05_01=true; extern string a02="===== News Filter ====="; extern bool Use_NewsFilter=true; extern bool High_news=true; extern int Before_High_minutes = 120; extern int After_High_minutes = 120; extern bool Medium_news=true; extern int Before_Medium_minutes= 90; extern int After_Medium_minutes = 90; extern bool Low_news=false; extern int Before_Low_minutes= 30; extern int After_Low_minutes = 30; extern bool Speaks_news = true; extern int Before_Speaks_minutes= 90; extern int After_Speaks_minutes = 90; extern bool Auto_Select_News = true; extern bool All_Symbols_news = false; extern bool USD_news = false; extern bool EUR_news = false; extern bool GBP_news = false; extern bool NZD_news = false; extern bool JPY_news = false; extern bool AUD_news = false; extern bool CAD_news = false; extern bool CHF_news = false; extern bool CNY_news = false; extern bool ControlNewsFile=false; extern bool InfoPanel=true; extern string a03="==== RSI ===="; extern int RSI_Period=14; extern ENUM_APPLIED_PRICE RSI_AplPrice=PRICE_CLOSE; extern double RSI_Level=30; extern double Lots=0.1; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ datetime NewsTime[]; string NewsSymbol[]; string NewsImpact[]; string NewsText[]; string File_Name="Calendar.txt"; datetime Summer_Time_switch,Winter_Time_switch; int CountUpNews; bool Trade=true; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { //--- if(Use_NewsFilter) { if(IsTesting() || IsOptimization()) { if(!FilesCompare()) { Trade=false; // allow or disallow trade return(INIT_SUCCEEDED); } int Array_Res=GlobVarArrResize(); //To count or not count the number of news file Print("OnInit() Array_Res= ",Array_Res); ArrayResize(NewsTime,Array_Res); ArrayResize(NewsSymbol,Array_Res); ArrayResize(NewsImpact,Array_Res); ArrayResize(NewsText,Array_Res); Print("OnInit() LoadNewsArray(true)= ",LoadNewsArray(true)); // Loading news in array } } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- bool StopTradeNews=false; if(Use_NewsFilter) { if(IsTesting() || IsOptimization()) { int Fix2011_GMT=0; // Example broker Alpari until May 2011 had GMT +1, and after the May 2011 GMT +2 if(Fix_GMT_2011_05_01 && TimeCurrent()=RSI_Level && IST_RSI100-RSI_Level) Sell_Open=true; // Signal Open Sell if(OrdersTotal()==0 && !StopTradeNews) // open an order, if not news { if(Buy_Open) Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,20,0,0,"RSI",111,0,Blue); if(Sell_Open) Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,20,0,0,"RSI",111,0,Red); } if(OrdersTotal()==1) { if(Buy_Open && OrderSelect(0,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) { Contr=OrderClose(OrderTicket(),OrderLots(),Ask,20,Blue); if(!StopTradeNews) Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,20,0,0,"RSI",111,0,Blue); // open an order, if not news } if(Sell_Open && OrderSelect(0,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) { Contr=OrderClose(OrderTicket(),OrderLots(),Bid,20,Blue); if(!StopTradeNews) Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,20,0,0,"RSI",111,0,Blue); // open an order, if not news } } IST_RSI=RSI_ind; } // if(IST_Time != iTime(NULL, PERIOD_M1, 0) ) } //+------------------------------------------------------------------+ //=============================== Files Compare folder Common and tester\files bool FilesCompare() { int HandleCommon=-1,HandleTerminal=-1,ErrorF=0,cc; bool CheckFiles=true; //------------ Find files if(!FileIsExist(File_Name,FILE_COMMON) && !FileIsExist(File_Name)) { Print("FilesCompare() ",File_Name," not found!"); return(false); // Error File } //----------- Copy from Common in tester\files if(FileIsExist(File_Name,FILE_COMMON) && !FileIsExist(File_Name)) { Print("FilesCompare() tester\\files\\",File_Name," not found. Copy from ",TerminalInfoString(TERMINAL_COMMONDATA_PATH)," in tester\\files\\"); for(cc=1; cc<5; cc++) { FileCopy(File_Name,FILE_COMMON,File_Name,FILE_REWRITE); ErrorF=GetLastError(); Print("FilesCompare() FileCopy GetLastError= ",ErrorF); if(ErrorF==0) break; Sleep(1000); } if(ErrorF != 0) return(false); } //------------ Compare files. Update or not update if(FileIsExist(File_Name,FILE_COMMON) && FileIsExist(File_Name)) { HandleCommon=FileOpen(File_Name,FILE_SHARE_READ|FILE_COMMON); HandleTerminal=FileOpen(File_Name,FILE_SHARE_READ); datetime DateCommon=datetime(FileGetInteger(HandleCommon,FILE_MODIFY_DATE)); datetime DateTerminal=datetime(FileGetInteger(HandleTerminal,FILE_MODIFY_DATE)); FileClose(HandleTerminal); FileClose(HandleCommon); Print("FilesCompare() ",File_Name," Date Common= ",DateCommon," Date tester\\files\\= ",DateTerminal); if(DateCommon>DateTerminal) { Print("FilesCompare() ",File_Name," Update Copy from ",TerminalInfoString(TERMINAL_COMMONDATA_PATH)," in tester\\files\\"); for(cc=1; cc<5; cc++) { FileCopy(File_Name,FILE_COMMON,File_Name,FILE_REWRITE); ErrorF=GetLastError(); Print("FilesCompare() FileCopy GetLastError= ",ErrorF); if(ErrorF==0) break; Sleep(1000); } if(ErrorF != 0) return(false); } } return(CheckFiles); } //=============================== Load News from file in Arrays int LoadNewsArray(bool loadingF) { //------------ Open File int po=1; int HandleTerminal=INVALID_HANDLE; while(!IsStopped()) { HandleTerminal=FileOpen(File_Name,FILE_CSV|FILE_SHARE_READ,';'); if(HandleTerminal==INVALID_HANDLE) { Print("LoadNewsArray() ",po," ",Symbol()); int GL_ERR=GetLastError(); if(GL_ERR==4103) Print("LoadNewsArray() ",GL_ERR," Historic calendar file ",File_Name," not found!"); else Print("LoadNewsArray() ",GL_ERR," Historic calendar file Error opening (",File_Name,")"); Sleep(po*500); } else { break; } if(po >= 5) return(-100); po++; } //---------------- Load in array CountUpNews=0; while(!FileIsEnding(HandleTerminal)) { bool ActivateSym=false,ActiveImp=false; datetime Date_news = FileReadDatetime(HandleTerminal); string Symbol_news = FileReadString(HandleTerminal); string Impact_news = FileReadString(HandleTerminal); string Text_news = FileReadString(HandleTerminal); //---Skip old date if(Date_news=0) ActiveImp=true; if(!ActiveImp) continue; //--- Include symbol if(All_Symbols_news) { ActivateSym=true; } else { if(Auto_Select_News) { if(StringFind(Symbol(),Symbol_news)>=0) ActivateSym=true; if(USD_news) if(StringFind(Symbol_news, "USD") >= 0 ) ActivateSym = true; if(EUR_news) if(StringFind(Symbol_news, "EUR") >= 0 ) ActivateSym = true; if(GBP_news) if(StringFind(Symbol_news, "GBP") >= 0 ) ActivateSym = true; if(NZD_news) if(StringFind(Symbol_news, "NZD") >= 0 ) ActivateSym = true; if(JPY_news) if(StringFind(Symbol_news, "JPY") >= 0 ) ActivateSym = true; if(AUD_news) if(StringFind(Symbol_news, "AUD") >= 0 ) ActivateSym = true; if(CAD_news) if(StringFind(Symbol_news, "CAD") >= 0 ) ActivateSym = true; if(CHF_news) if(StringFind(Symbol_news, "CHF") >= 0 ) ActivateSym = true; if(CNY_news) if(StringFind(Symbol_news, "CNY") >= 0 ) ActivateSym = true; } else { if(USD_news) if(StringFind(Symbol_news, "USD") >= 0 ) ActivateSym = true; if(EUR_news) if(StringFind(Symbol_news, "EUR") >= 0 ) ActivateSym = true; if(GBP_news) if(StringFind(Symbol_news, "GBP") >= 0 ) ActivateSym = true; if(NZD_news) if(StringFind(Symbol_news, "NZD") >= 0 ) ActivateSym = true; if(JPY_news) if(StringFind(Symbol_news, "JPY") >= 0 ) ActivateSym = true; if(AUD_news) if(StringFind(Symbol_news, "AUD") >= 0 ) ActivateSym = true; if(CAD_news) if(StringFind(Symbol_news, "CAD") >= 0 ) ActivateSym = true; if(CHF_news) if(StringFind(Symbol_news, "CHF") >= 0 ) ActivateSym = true; if(CNY_news) if(StringFind(Symbol_news, "CNY") >= 0 ) ActivateSym = true; } } if(!ActivateSym) continue; if(loadingF) { NewsTime[CountUpNews] = Date_news; NewsSymbol[CountUpNews] = Symbol_news; NewsImpact[CountUpNews] = Impact_news; NewsText[CountUpNews] = Text_news; } CountUpNews++; } // while FileClose(HandleTerminal); if(ControlNewsFile && loadingF) { Print("LoadNewsArray() ControlNews CountUpNews= ",CountUpNews," ArraySize(NewsTime)= ",ArraySize(NewsTime)); int HHH=FileOpen("ControlNews.csv",FILE_CSV|FILE_WRITE); for(int rr=0; rrTime_GMT_0) break; } //------------ Before BeforeMinutes=12345; if(Step=0) if(BeforeMinutes<=Before_Speaks_minutes) pauseF=true; } //------------ After News AfterMinutes=12345; if(Step!=0) { AfterMinutes=int(Time_GMT_0-NewsTime[Step-1])/60; if(NewsImpact[Step - 1]== "H") if(AfterMinutes <= After_High_minutes) pauseF = true; if(NewsImpact[Step - 1]== "M") if(AfterMinutes <= After_Medium_minutes) pauseF = true; if(NewsImpact[Step - 1]== "L") if(AfterMinutes <= After_Low_minutes) pauseF = true; if(StringFind(NewsText[Step-1],"Speaks")>=0) if(AfterMinutes<=Before_Speaks_minutes) pauseF=true; } if(InfoPanel && IsVisualMode()) { string com1="",com2=""; if(Step