//+------------------------------------------------------------------+ #property copyright "Torinex Consulting Pty Ltd 2017" #property link "http://www.torinex.com" //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ // input parameters input int Inp_CSC_LookBackPeriod = 60; // LookBack Period input int Inp_CSC_StdDevPeriod = 60; // StdDev Period input bool Inp_OPTION_PrintDiagnostics = true; // Print Diagnostic Messages //+------------------------------------------------------------------+ // Global Variables int i, j, k, OrderCounter[27], bars_Max, bars_Start, MinBars_Required, MinBars_Available, MinBars_Available_Index, BarsSinceStart, OrderType, CopyClose_ReturnValue, //arrays BarsHistory_Array[28]; long bars; double PriceClose_AUDCAD[], PriceClose_AUDCHF[], PriceClose_AUDJPY[], PriceClose_AUDNZD[], PriceClose_AUDUSD[], PriceClose_EURAUD[], PriceClose_GBPAUD[], PriceClose_CADCHF[], PriceClose_CADJPY[], PriceClose_EURCAD[], PriceClose_GBPCAD[], PriceClose_NZDCAD[], PriceClose_USDCAD[], PriceClose_CHFJPY[], PriceClose_EURCHF[], PriceClose_GBPCHF[], PriceClose_NZDCHF[], PriceClose_USDCHF[], PriceClose_EURGBP[], PriceClose_EURJPY[], PriceClose_EURNZD[], PriceClose_EURUSD[], PriceClose_GBPJPY[], PriceClose_GBPNZD[], PriceClose_GBPUSD[], PriceClose_NZDJPY[], PriceClose_USDJPY[], PriceClose_NZDUSD[], //Functions SeriesSum, Variance, StdDev; bool NewBar_CurrentSymbol, NewBar_AllSymbols, CopyTime_ReturnValue, AllPricesLoaded, AllTimesLoaded; string SymbolIndex_Array[29], CurrencyIndex_Array[8], MinBars_Available_Symbol; datetime TimeStamp_Current, Time_CurrentSymbol[], SymbolsOpenTime[29], CurrentTimeStamp[29], PairsOpenTime_AUDCAD[], PairsOpenTime_AUDCHF[], PairsOpenTime_AUDJPY[], PairsOpenTime_AUDNZD[], PairsOpenTime_AUDUSD[], PairsOpenTime_EURAUD[], PairsOpenTime_GBPAUD[], PairsOpenTime_CADCHF[], PairsOpenTime_CADJPY[], PairsOpenTime_EURCAD[], PairsOpenTime_GBPCAD[], PairsOpenTime_NZDCAD[], PairsOpenTime_USDCAD[], PairsOpenTime_CHFJPY[], PairsOpenTime_EURCHF[], PairsOpenTime_GBPCHF[], PairsOpenTime_NZDCHF[], PairsOpenTime_USDCHF[], PairsOpenTime_EURGBP[], PairsOpenTime_EURJPY[], PairsOpenTime_EURNZD[], PairsOpenTime_EURUSD[], PairsOpenTime_GBPJPY[], PairsOpenTime_GBPNZD[], PairsOpenTime_GBPUSD[], PairsOpenTime_NZDJPY[], PairsOpenTime_USDJPY[], PairsOpenTime_NZDUSD[], PairsOpenTime_Current[]; //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ //| Expert initialization function //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ int OnInit() { // Print Iitialisation time and Initialisation TimeStamp Print("Line#: ",__LINE__, " | ",Symbol(), " | Time Initialised: ",TimeCurrent()); //+------------------------------------------------------------------+ //Multi-symbols //Set CurrencyIndex_Array values CurrencyIndex_Array[0] = "AUD" ; CurrencyIndex_Array[1] = "CAD" ; CurrencyIndex_Array[2] = "CHF" ; CurrencyIndex_Array[3] = "EUR" ; CurrencyIndex_Array[4] = "GBP" ; CurrencyIndex_Array[5] = "JPY" ; CurrencyIndex_Array[6] = "NZD" ; CurrencyIndex_Array[7] = "USD" ; //Set SymbolIndex_Array values SymbolIndex_Array[0] = "AUDCAD" ; SymbolIndex_Array[1] = "AUDCHF" ; SymbolIndex_Array[2] = "AUDJPY" ; SymbolIndex_Array[3] = "AUDNZD" ; SymbolIndex_Array[4] = "AUDUSD" ; SymbolIndex_Array[5] = "EURAUD" ; SymbolIndex_Array[6] = "GBPAUD" ; SymbolIndex_Array[7] = "CADCHF" ; SymbolIndex_Array[8] = "CADJPY" ; SymbolIndex_Array[9] = "EURCAD" ; SymbolIndex_Array[10] = "GBPCAD" ; SymbolIndex_Array[11] = "NZDCAD" ; SymbolIndex_Array[12] = "USDCAD" ; SymbolIndex_Array[13] = "CHFJPY" ; SymbolIndex_Array[14] = "EURCHF" ; SymbolIndex_Array[15] = "GBPCHF" ; SymbolIndex_Array[16] = "NZDCHF" ; SymbolIndex_Array[17] = "USDCHF" ; SymbolIndex_Array[18] = "EURGBP" ; SymbolIndex_Array[19] = "EURJPY" ; SymbolIndex_Array[20] = "EURNZD" ; SymbolIndex_Array[21] = "EURUSD" ; SymbolIndex_Array[22] = "GBPJPY" ; SymbolIndex_Array[23] = "GBPNZD" ; SymbolIndex_Array[24] = "GBPUSD" ; SymbolIndex_Array[25] = "NZDJPY" ; SymbolIndex_Array[26] = "USDJPY" ; SymbolIndex_Array[27] = "NZDUSD" ; //ensure all symbols are loaded in MarketWatch for(i=0; i<=27; i++) { if(SymbolInfoInteger(SymbolIndex_Array[i],SYMBOL_SELECT) == false) { SymbolSelect(SymbolIndex_Array[i],true); Print("Line#: ",__LINE__, " | Symbol ",SymbolIndex_Array[i]," added to MarketWatch"); } } //+------------------------------------------------------------------+ //Ensure adequate Bar History avaialble for all symbols MinBars_Required = Inp_CSC_LookBackPeriod + Inp_CSC_StdDevPeriod + 1; bool HistoryCheck; int Iterations; Print("----------------------------------------------------"); Print("Synchronise with Server Check"); for(i=0; i<=27; i++) { Iterations = 0; { HistoryCheck = false; while(HistoryCheck == false) { HistoryCheck = CheckLoadHistory(SymbolIndex_Array[i], PERIOD_CURRENT,MinBars_Required, true); Iterations++; if(HistoryCheck == true) { Print("Server & Terminal synchronisation for ",SymbolIndex_Array[i],": SUCCESFULL | Iterations = ",Iterations); } } } } Print("----------------------------------------------------"); Print("Bars History Check"); MinBars_Available = 0; Iterations = 0; while(MinBars_Available < MinBars_Required) { //check sufficient bars are loaded BarsHistory_Array[0] =Bars("AUDCAD",PERIOD_CURRENT); BarsHistory_Array[1] =Bars("AUDCHF",PERIOD_CURRENT); BarsHistory_Array[2] =Bars("AUDJPY",PERIOD_CURRENT); BarsHistory_Array[3] =Bars("AUDNZD",PERIOD_CURRENT); BarsHistory_Array[4] =Bars("AUDUSD",PERIOD_CURRENT); BarsHistory_Array[5] =Bars("EURAUD",PERIOD_CURRENT); BarsHistory_Array[6] =Bars("GBPAUD",PERIOD_CURRENT); BarsHistory_Array[7] =Bars("CADCHF",PERIOD_CURRENT); BarsHistory_Array[8] =Bars("CADJPY",PERIOD_CURRENT); BarsHistory_Array[9] =Bars("EURCAD",PERIOD_CURRENT); BarsHistory_Array[10] =Bars("GBPCAD",PERIOD_CURRENT); BarsHistory_Array[11] =Bars("NZDCAD",PERIOD_CURRENT); BarsHistory_Array[12] =Bars("USDCAD",PERIOD_CURRENT); BarsHistory_Array[13] =Bars("CHFJPY",PERIOD_CURRENT); BarsHistory_Array[14] =Bars("EURCHF",PERIOD_CURRENT); BarsHistory_Array[15] =Bars("GBPCHF",PERIOD_CURRENT); BarsHistory_Array[16] =Bars("NZDCHF",PERIOD_CURRENT); BarsHistory_Array[17] =Bars("USDCHF",PERIOD_CURRENT); BarsHistory_Array[18] =Bars("EURGBP",PERIOD_CURRENT); BarsHistory_Array[19] =Bars("EURJPY",PERIOD_CURRENT); BarsHistory_Array[20] =Bars("EURNZD",PERIOD_CURRENT); BarsHistory_Array[21] =Bars("EURUSD",PERIOD_CURRENT); BarsHistory_Array[22] =Bars("GBPJPY",PERIOD_CURRENT); BarsHistory_Array[23] =Bars("GBPNZD",PERIOD_CURRENT); BarsHistory_Array[24] =Bars("GBPUSD",PERIOD_CURRENT); BarsHistory_Array[25] =Bars("NZDJPY",PERIOD_CURRENT); BarsHistory_Array[26] =Bars("USDJPY",PERIOD_CURRENT); BarsHistory_Array[27] =Bars("NZDUSD",PERIOD_CURRENT); Iterations++; //Print("Iterations = ",Iterations); MinBars_Available_Index = ArrayMinimum(BarsHistory_Array,0,0); MinBars_Available_Symbol = SymbolIndex_Array[MinBars_Available_Index]; MinBars_Available = BarsHistory_Array[MinBars_Available_Index]; //if(Iterations > 30000) break; } for(i=0; i<=27; i++) { Print("Bars avaialble for ",SymbolIndex_Array[i]," = ", BarsHistory_Array[i]); } Print("----------------------------------------------------"); Print("Sufficient History loaded for all Symbols:", " | Iterations = ", Iterations, " | MinBars_Required = ", MinBars_Required, " | MinBars_Available = ",MinBars_Available); //+------------------------------------------------------------------+ //Other return(INIT_SUCCEEDED); } //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ //| Expert deinitialization function //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ void OnDeinit(const int reason) { // Print Deinitialisation time and Initialisation TimeStamp Print("Time De-Initialised: ",TimeCurrent()); } //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ //| Expert tick function | //+-----------------------------------------------------------------------------------------------------------------------------------------------------+ void OnTick() { //******************************************************************************************************************************************************* // MODULE 1: Trading Signals Calculations //******************************************************************************************************************************************************* //+------------------------------------------------------------------+ //Set arrays as series ArraySetAsSeries(PairsOpenTime_AUDCAD,true); ArraySetAsSeries(PairsOpenTime_AUDCHF,true); ArraySetAsSeries(PairsOpenTime_AUDJPY,true); ArraySetAsSeries(PairsOpenTime_AUDNZD,true); ArraySetAsSeries(PairsOpenTime_AUDUSD,true); ArraySetAsSeries(PairsOpenTime_EURAUD,true); ArraySetAsSeries(PairsOpenTime_GBPAUD,true); ArraySetAsSeries(PairsOpenTime_CADCHF,true); ArraySetAsSeries(PairsOpenTime_CADJPY,true); ArraySetAsSeries(PairsOpenTime_EURCAD,true); ArraySetAsSeries(PairsOpenTime_GBPCAD,true); ArraySetAsSeries(PairsOpenTime_NZDCAD,true); ArraySetAsSeries(PairsOpenTime_USDCAD,true); ArraySetAsSeries(PairsOpenTime_CHFJPY,true); ArraySetAsSeries(PairsOpenTime_EURCHF,true); ArraySetAsSeries(PairsOpenTime_GBPCHF,true); ArraySetAsSeries(PairsOpenTime_NZDCHF,true); ArraySetAsSeries(PairsOpenTime_USDCHF,true); ArraySetAsSeries(PairsOpenTime_EURGBP,true); ArraySetAsSeries(PairsOpenTime_EURJPY,true); ArraySetAsSeries(PairsOpenTime_EURNZD,true); ArraySetAsSeries(PairsOpenTime_EURUSD,true); ArraySetAsSeries(PairsOpenTime_GBPJPY,true); ArraySetAsSeries(PairsOpenTime_GBPNZD,true); ArraySetAsSeries(PairsOpenTime_GBPUSD,true); ArraySetAsSeries(PairsOpenTime_NZDJPY,true); ArraySetAsSeries(PairsOpenTime_USDJPY,true); ArraySetAsSeries(PairsOpenTime_NZDUSD,true); ArraySetAsSeries(PriceClose_AUDCAD,true); ArraySetAsSeries(PriceClose_AUDCHF,true); ArraySetAsSeries(PriceClose_AUDJPY,true); ArraySetAsSeries(PriceClose_AUDNZD,true); ArraySetAsSeries(PriceClose_AUDUSD,true); ArraySetAsSeries(PriceClose_EURAUD,true); ArraySetAsSeries(PriceClose_GBPAUD,true); ArraySetAsSeries(PriceClose_CADCHF,true); ArraySetAsSeries(PriceClose_CADJPY,true); ArraySetAsSeries(PriceClose_EURCAD,true); ArraySetAsSeries(PriceClose_GBPCAD,true); ArraySetAsSeries(PriceClose_NZDCAD,true); ArraySetAsSeries(PriceClose_USDCAD,true); ArraySetAsSeries(PriceClose_CHFJPY,true); ArraySetAsSeries(PriceClose_EURCHF,true); ArraySetAsSeries(PriceClose_GBPCHF,true); ArraySetAsSeries(PriceClose_NZDCHF,true); ArraySetAsSeries(PriceClose_USDCHF,true); ArraySetAsSeries(PriceClose_EURGBP,true); ArraySetAsSeries(PriceClose_EURJPY,true); ArraySetAsSeries(PriceClose_EURNZD,true); ArraySetAsSeries(PriceClose_EURUSD,true); ArraySetAsSeries(PriceClose_GBPJPY,true); ArraySetAsSeries(PriceClose_GBPNZD,true); ArraySetAsSeries(PriceClose_GBPUSD,true); ArraySetAsSeries(PriceClose_NZDJPY,true); ArraySetAsSeries(PriceClose_USDJPY,true); ArraySetAsSeries(PriceClose_NZDUSD,true); //more arrays required //+------------------------------------------------------------------+ //synchronise all symbols new NewBar_CurrentChart //check for NewBar_CurrentChart == true if(CopyTime(Symbol(),PERIOD_CURRENT,0,1,PairsOpenTime_Current)== -1) { Print("Line#: ",__LINE__,"CopyTime - ERROR CODE: ",GetLastError()," Symbol: ",Symbol()); CopyTime_ReturnValue = false; } else CopyTime_ReturnValue = true; NewBar_CurrentSymbol = false; if(TimeStamp_Current != PairsOpenTime_Current[0]) { NewBar_CurrentSymbol = true; TimeStamp_Current = PairsOpenTime_Current[0]; } if(NewBar_CurrentSymbol == true) { Print("----------------------------------------------------"); Print("New bar formed on current symbol & time frame"); //download time[] data for all symbols int CopyTimeSum = 0; int CopyTimeIterations = 0; double CopyTimeTimer_Start = GetTickCount(); while(CopyTimeSum < 28) { //download time[] data for all symbols CopyTime("AUDCAD",PERIOD_CURRENT,0,1,PairsOpenTime_AUDCAD);if(PairsOpenTime_AUDCAD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("AUDCHF",PERIOD_CURRENT,0,1,PairsOpenTime_AUDCHF);if(PairsOpenTime_AUDCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("AUDJPY",PERIOD_CURRENT,0,1,PairsOpenTime_AUDJPY);if(PairsOpenTime_AUDJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("AUDNZD",PERIOD_CURRENT,0,1,PairsOpenTime_AUDNZD);if(PairsOpenTime_AUDNZD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("AUDUSD",PERIOD_CURRENT,0,1,PairsOpenTime_AUDUSD);if(PairsOpenTime_AUDUSD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURAUD",PERIOD_CURRENT,0,1,PairsOpenTime_EURAUD);if(PairsOpenTime_EURAUD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPAUD",PERIOD_CURRENT,0,1,PairsOpenTime_GBPAUD);if(PairsOpenTime_GBPAUD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("CADCHF",PERIOD_CURRENT,0,1,PairsOpenTime_CADCHF);if(PairsOpenTime_CADCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("CADJPY",PERIOD_CURRENT,0,1,PairsOpenTime_CADJPY);if(PairsOpenTime_CADJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURCAD",PERIOD_CURRENT,0,1,PairsOpenTime_EURCAD);if(PairsOpenTime_EURCAD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPCAD",PERIOD_CURRENT,0,1,PairsOpenTime_GBPCAD);if(PairsOpenTime_GBPCAD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("NZDCAD",PERIOD_CURRENT,0,1,PairsOpenTime_NZDCAD);if(PairsOpenTime_NZDCAD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("USDCAD",PERIOD_CURRENT,0,1,PairsOpenTime_USDCAD);if(PairsOpenTime_USDCAD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("CHFJPY",PERIOD_CURRENT,0,1,PairsOpenTime_CHFJPY);if(PairsOpenTime_CHFJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURCHF",PERIOD_CURRENT,0,1,PairsOpenTime_EURCHF);if(PairsOpenTime_EURCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPCHF",PERIOD_CURRENT,0,1,PairsOpenTime_GBPCHF);if(PairsOpenTime_GBPCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("NZDCHF",PERIOD_CURRENT,0,1,PairsOpenTime_NZDCHF);if(PairsOpenTime_NZDCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("USDCHF",PERIOD_CURRENT,0,1,PairsOpenTime_USDCHF);if(PairsOpenTime_USDCHF[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURGBP",PERIOD_CURRENT,0,1,PairsOpenTime_EURGBP);if(PairsOpenTime_EURGBP[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURJPY",PERIOD_CURRENT,0,1,PairsOpenTime_EURJPY);if(PairsOpenTime_EURJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURNZD",PERIOD_CURRENT,0,1,PairsOpenTime_EURNZD);if(PairsOpenTime_EURNZD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("EURUSD",PERIOD_CURRENT,0,1,PairsOpenTime_EURUSD);if(PairsOpenTime_EURUSD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPJPY",PERIOD_CURRENT,0,1,PairsOpenTime_GBPJPY);if(PairsOpenTime_GBPJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPNZD",PERIOD_CURRENT,0,1,PairsOpenTime_GBPNZD);if(PairsOpenTime_GBPNZD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("GBPUSD",PERIOD_CURRENT,0,1,PairsOpenTime_GBPUSD);if(PairsOpenTime_GBPUSD[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("NZDJPY",PERIOD_CURRENT,0,1,PairsOpenTime_NZDJPY);if(PairsOpenTime_NZDJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("USDJPY",PERIOD_CURRENT,0,1,PairsOpenTime_USDJPY);if(PairsOpenTime_USDJPY[0] == TimeStamp_Current) CopyTimeSum++; CopyTime("NZDUSD",PERIOD_CURRENT,0,1,PairsOpenTime_NZDUSD);if(PairsOpenTime_NZDUSD[0] == TimeStamp_Current) CopyTimeSum++; CopyTimeIterations++; //Print("CopyTimeSum = ",CopyTimeSum," | CopyTimeIterations = ",CopyTimeIterations); if(CopyTimeSum == 28) break; else CopyTimeSum = 0; double CopyTimeTimer_Current = GetTickCount(); if(CopyTimeTimer_Current - CopyTimeTimer_Start > 58000) { CopyTimeSum = 29; Print("CopyTime loop exited on Time Expiry!!!! CopyTimeSum = ",CopyTimeSum); break; } } double CopyTimeTimer_End = GetTickCount(); double CopyTimer_TimeElapsed = (CopyTimeTimer_End - CopyTimeTimer_Start)/1000; Print("CopyTimer_TimeElapsed = ",CopyTimer_TimeElapsed,"s"); if(CopyTimeSum >= 28) { NewBar_AllSymbols = true; BarsSinceStart++; Print("CopyTimeIterations = ",CopyTimeIterations, " | CopyTimeSum = ",CopyTimeSum," | BarsSinceStart = ",BarsSinceStart," | Server Time: ",TimeCurrent()," ************************************** | NEW BAR - ALL SYMBOLS"); } if(NewBar_AllSymbols == true) { //+------------------------------------------------------------------+ //download Closing Price of last bar for all Symbols when NewBar_AllSymbols == true //NOTE: If CopyTimeSum == 28, Bar[0] for each pair is the correct bar - hence no loop required (???) int CopyCloseReturn = 0; int CopyCloseSum[28]; //download close[] data for all symbols CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("AUDCAD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_AUDCAD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[0] = CopyCloseReturn; else CopyCloseSum[0] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("AUDCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_AUDCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[1] = CopyCloseReturn; else CopyCloseSum[1] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("AUDJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_AUDJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[2] = CopyCloseReturn; else CopyCloseSum[2] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("AUDNZD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_AUDNZD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[3] = CopyCloseReturn; else CopyCloseSum[3] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("AUDUSD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_AUDUSD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[4] = CopyCloseReturn; else CopyCloseSum[4] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURAUD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURAUD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[5] = CopyCloseReturn; else CopyCloseSum[5] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPAUD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPAUD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[6] = CopyCloseReturn; else CopyCloseSum[6] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("CADCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_CADCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[7] = CopyCloseReturn; else CopyCloseSum[7] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("CADJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_CADJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[8] = CopyCloseReturn; else CopyCloseSum[8] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURCAD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURCAD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[9] = CopyCloseReturn; else CopyCloseSum[9] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPCAD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPCAD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[10] = CopyCloseReturn; else CopyCloseSum[10] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("NZDCAD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_NZDCAD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[11] = CopyCloseReturn; else CopyCloseSum[11] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("USDCAD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_USDCAD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[12] = CopyCloseReturn; else CopyCloseSum[12] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("CHFJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_CHFJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[13] = CopyCloseReturn; else CopyCloseSum[13] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[14] = CopyCloseReturn; else CopyCloseSum[14] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[15] = CopyCloseReturn; else CopyCloseSum[15] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("NZDCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_NZDCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[16] = CopyCloseReturn; else CopyCloseSum[16] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("USDCHF",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_USDCHF);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[17] = CopyCloseReturn; else CopyCloseSum[17] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURGBP",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURGBP);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[18] = CopyCloseReturn; else CopyCloseSum[18] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[19] = CopyCloseReturn; else CopyCloseSum[19] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURNZD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURNZD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[20] = CopyCloseReturn; else CopyCloseSum[20] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("EURUSD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_EURUSD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[21] = CopyCloseReturn; else CopyCloseSum[21] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[22] = CopyCloseReturn; else CopyCloseSum[22] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPNZD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPNZD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[23] = CopyCloseReturn; else CopyCloseSum[23] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("GBPUSD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_GBPUSD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[24] = CopyCloseReturn; else CopyCloseSum[24] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("NZDJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_NZDJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[25] = CopyCloseReturn; else CopyCloseSum[25] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("USDJPY",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_USDJPY);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[26] = CopyCloseReturn; else CopyCloseSum[26] = 0;} CopyCloseReturn = 0; while(CopyCloseReturn < MinBars_Required+1){CopyCloseReturn = CopyClose("NZDUSD",PERIOD_CURRENT,1,MinBars_Required+1,PriceClose_NZDUSD);if(CopyCloseReturn == MinBars_Required + 1) CopyCloseSum[27] = CopyCloseReturn; else CopyCloseSum[27] = 0;} bool CopyCloseError = false; for(i=0; i<=27; i++) { if(CopyCloseSum[i] != MinBars_Required+1) { Print("CopyClose ERROR for Symbol: ",SymbolIndex_Array[i]); CopyCloseError = true; } } if(CopyCloseError == false) Print("CopyClose for all symbols SUCCESSFUL!!!"); } } } //+------------------------------------------------------------------+ //Synchronise Terminal and Server timeseries and download missing data //Ref: Andrey Khatimlianskii (MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR corrected) //+------------------------------------------------------------------+ uint StartTickCount=0; //check data & download if not in terminal bool CheckLoadHistory(const string symbol, const ENUM_TIMEFRAMES period, const int size, bool print_info=true) { // do not check data of current chart for indicators if(MQLInfoInteger(MQL_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) return(true); if(size > TerminalInfoInteger(TERMINAL_MAXBARS)) { printf(__FUNCTION__+": requested too much data (%d)",size); return(false); } StartTickCount = GetTickCount(); if(CheckTerminalHistory(symbol,period,size) == true || CheckServerHistory(symbol,period,size) == true) { if(print_info == true) { double length=(GetTickCount()-StartTickCount)/1000.0; if(length>0.1) Print(symbol,", ",EnumToString(period),": history synchronized within ",DoubleToString(length,1)," sec"); } return(true); } if(print_info) Print(symbol,", ",EnumToString(period),": ERROR synchronizing history!!!"); return(false); } //+------------------------------------------------------------------+ //Checks data in terminal. | bool CheckTerminalHistory(const string symbol, const ENUM_TIMEFRAMES period, const int size) { //check for sufficient data if(Bars(symbol,period)>=size) return(true); //second attempt datetime times[1]; bars=0; //check sufficient data is loaded to build Time Series if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_BARS_COUNT,bars)== true) { if(bars>size*PeriodSeconds(period)/60) { //force timeseries build CopyTime(symbol,period,size-1,1,times); //check date if(SeriesInfoInteger(symbol,period,SERIES_BARS_COUNT,bars)) { //Timeseries generated using data from terminal if(bars>=size) return(true); } } } return(false); } //+------------------------------------------------------------------+ // Downloads missing data from server. | bool CheckServerHistory(const string symbol, const ENUM_TIMEFRAMES period, const int size) { //load symbol history info datetime first_server_date=0; while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStoppedExt()) Sleep(5); // Check if sufficient data on server if(first_server_date>TimeCurrent()-size*PeriodSeconds(period)) return(false); //load data step by step int fail_cnt=0; datetime times[1]; while(IsStoppedExt() == false) { //wait for timeseries build while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStoppedExt()) Sleep(5); //ask for built bars bars=Bars(symbol,period); if(bars>size) return(true); //copying of next part forces data loading if(CopyTime(symbol,period,size-1,1,times)==1) { return(true); } else { //no more than 10000 failed attempts if(++fail_cnt>=10000) return(false); Sleep(10); } } return(false); } //+------------------------------------------------------------------+ bool IsStoppedExt() { if( IsStopped() == true) return(true); if( GetTickCount() - StartTickCount > 58000 ) return(true); return(false); }