//-------------------------------------------------------------------- // FTL_EconomicAlert.mq4 // // Copyright(C) 2010, FTLabo // http://www.ftlabo.com/index.php // order@ftlabo.com // Rev.001 //-------------------------------------------------------------------- #property copyright "Copyright(C) 2010, FTLabo." #property link "http://www.ftlabo.com/index.php" #import "wininet.dll" int InternetAttemptConnect (int x); int InternetOpenA(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0); int InternetOpenUrlA(int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0,int lFlags = 0, int lContext = 0); int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]); int InternetCloseHandle(int hInet); #import extern string Program = "FTL_EconomicAlert"; extern string Rev = "Rev.100"; extern string Copyright = "Copyright(C) 2010, Forex Trading Laboratory"; extern string URL = "http://www.ftlabo.com/index.php"; extern string EMail = "info@ftlabo.com"; extern string exServerTimeZone = "日本とサーバ時間との誤差(時間)"; extern int ServerTimeZone = 9; extern string exImportance = "重要度(0:指定なし、1:重要度低、2:重要度中、3:重要度高)"; extern int Importance = 1; datetime LastTime = 0; string strNews[1000][10]; int iTotalNews = 0; int init(){ //-------------------------------------------------------------------- // コメント表示 //-------------------------------------------------------------------- string comA = "EA Name:" + Program + "\n"; string comB = "Rev:" + Rev + "\n"; string comC = "Copyright:" + Copyright + "\n"; string comD = URL + " " + EMail + "\n"; Comment("Local Time:"+ TimeToStr(TimeLocal(),TIME_DATE) + " " + TimeToStr(TimeLocal(),TIME_SECONDS )," System Run","\n", "--Copyright----------------------------------------------------------------------\n", comA,comB,comC,comD, "--------------------------------------------------------------------------------------"); return(0); } //-------------------------------------------------------------------- // 経済指標発表15分前にアラート通知する //-------------------------------------------------------------------- int start(){ datetime time = TimeCurrent(); if(time >= LastTime+5*60){ LastTime = time; // csvデータ(重要指標)の取得 string strCsvFile = ReadURL("http://www.dailyfx.com/calendar/cal.csv?sort=dateDesc&timezone=¤cy=|&importance=|"); if(strCsvFile == ""){ return(0); } int iPos = StringFind(strCsvFile,"\n"); string strCsvData = StringTrimRight(StringTrimLeft(StringSubstr(strCsvFile,iPos+6))); string strArData[1000]; iTotalNews = SplitArray(strCsvData, "\n", strArData); for(int i = 0; i < iTotalNews; i++){ string strArData2[10]; SplitArray(strArData[i], ",", strArData2); for( int j=0; j<10; j++ ){ strNews[i][j] = strArData2[j]; } string wk[3], wk1[2]; SplitArray(strNews[i][0], " ", wk); strNews[i][0] = Year()+"."+GetMonth(wk[1])+"."+wk[2]; SplitArray(strNews[i][1], " ", wk); bool pm = wk[1]=="PM"; SplitArray(wk[0], ":", wk1); wk1[0] = StrToInteger(wk1[0])%12; if(pm){ wk1[0] = StrToInteger(wk1[0])+12; } strNews[i][1] = wk1[0]+":"+wk1[1]; NotifyAlert(strNews[i][0],strNews[i][1],strNews[i][4],strNews[i][5]); } } } //-------------------------------------------------------------------- //アラート通知し、アラート通知した時間を保持しておく //-------------------------------------------------------------------- void NotifyAlert(string str0,string str1,string str4,string str5){ datetime dt = StrToTime(str0+" "+str1); string strDate = TimeToStr(dt + ServerTimeZone*60*60, TIME_DATE); string strMinute = TimeToStr(dt + ServerTimeZone*60*60, TIME_MINUTES); datetime NowLocalDt = StrToTime(TimeYear(TimeLocal()) + "." + TimeMonth(TimeLocal()) + "." + TimeDay(TimeLocal()) +" "+TimeHour(TimeLocal()) + ":" + TimeMinute(TimeLocal())); string strdt = TimeToStr(NowLocalDt, TIME_DATE); string strmt = TimeToStr(NowLocalDt, TIME_MINUTES); double sumi = GlobalVariableGet("ECODATE"); //Alert(strDate + " 1:" + strMinute + "5: " + str5 + "4: " + str4); if(sumi < dt){ if(NowLocalDt + 10*60 < dt && NowLocalDt + 20*60 > dt){ SelectHighMediumLow(strDate,strMinute,str5,str4); //グローバル変数にセットする GlobalVariableSet("ECODATE", StrToTime(strDate + " " + strMinute)); } } } //-------------------------------------------------------------------- //指定した重要度の経済指標をアラート通知する //-------------------------------------------------------------------- void SelectHighMediumLow(string strDate, string strMinute, string Level,string news){ if(Importance == 1){ if(Level == "Low"){ Alert(strDate + " " + strMinute + " " + Level + " " + news); } }else if(Importance == 2){ if(Level == "Medium"){ Alert(strDate + " " + strMinute + " " + Level + " " + news); } }else if(Importance == 3){ if(Level == "High"){ Alert(strDate + " " + strMinute + " " + Level + " " + news); } } else { Alert(strDate + " " + strMinute + " " + Level + " " + news); } } //-------------------------------------------------------------------- //月を取得する //-------------------------------------------------------------------- int GetMonth(string str){ int mon = 0; if(str=="Jan"){ mon=1; } else if(str=="Feb"){ mon=2; } else if(str=="Mar"){ mon=3; } else if(str=="Apr"){ mon=4; } else if(str=="May"){ mon=5; } else if(str=="Jun"){ mon=6; } else if(str=="Jul"){ mon=7; } else if(str=="Aug"){ mon=8; } else if(str=="Sep"){ mon=9; } else if(str=="Oct"){ mon=10; } else if(str=="Nov"){ mon=11; } else if(str=="Dec"){ mon=12; } return(mon); } //-------------------------------------------------------------------- //CSVデータを取得 //-------------------------------------------------------------------- int SplitArray(string str, string delimiter, string& arr[]) { int i = 0; int iPos = StringFind(str, delimiter); while(iPos != -1) { if(iPos == 0) arr[i] = ""; else arr[i] = StringSubstr(str, 0, iPos); i++; str = StringSubstr(str, iPos+StringLen(delimiter)); iPos = StringFind(str, delimiter); if(iPos == -1 || str == "") break; } arr[i] = str; return(i+1); } //-------------------------------------------------------------------- //CSVデータをダウンロードする //-------------------------------------------------------------------- string ReadURL(string strURL) { // Create Internet Handle int iSession = InternetOpenA("Microsoft Internet Explorer", 0, "", "", 0); if(iSession <= 0){ return("0"); } int iURL = InternetOpenUrlA(iSession, strURL, "", 0, 0, 0); if(iURL <= 0){ InternetCloseHandle(iSession); return("0"); } int cBuffer[256]; int dwBytesRead[1]; string strBuf = ""; while(!IsStopped()){ for(int i = 0; i<256; i++) cBuffer[i] = 0; bool bResult = InternetReadFile(iURL, cBuffer, 1024, dwBytesRead); if(dwBytesRead[0] == 0) break; string strCsvData = ""; for(i = 0; i < 256; i++){ strCsvData = strCsvData + CharToStr(cBuffer[i] & 0x000000FF); if(StringLen(strCsvData) == dwBytesRead[0]) break; strCsvData = strCsvData + CharToStr(cBuffer[i] >> 8 & 0x000000FF); if(StringLen(strCsvData) == dwBytesRead[0]) break; strCsvData = strCsvData + CharToStr(cBuffer[i] >> 16 & 0x000000FF); if(StringLen(strCsvData) == dwBytesRead[0]) break; strCsvData = strCsvData + CharToStr(cBuffer[i] >> 24 & 0x000000FF); } strBuf = strBuf + strCsvData; Sleep(10); } InternetCloseHandle(iSession); return(strBuf); } //+------------------------------------------------------------------+