//+------------------------------------------------------------------+ //| CCFp.mq4 | //| SemSemFX@rambler.ru | //| http://onix-trade.net/forum/index.php?showtopic=107 | //| V2: Bugs fixed and improvements by MrPip with assistance | //| from Big Be, Feb. 2011 | //| Now each chart line can be turned off at need, | //| does not affect calculations | //+------------------------------------------------------------------+ #property copyright "SemSemFX@rambler.ru" #property link "http://onix-trade.net/forum/index.php?showtopic=107" #property indicator_separate_window #property indicator_buffers 8 #property indicator_color1 Black #property indicator_color2 Black #property indicator_color3 Black #property indicator_color4 Black #property indicator_color5 Black #property indicator_color6 Black #property indicator_color7 Black #property indicator_color8 Black string Indicator_Name = "CCFp: "; int Objs = 0; extern string prefix = " Input proper prefix and suffix for pairs"; extern string prefix1 = " ie: IBFX uses suffix m for MiniAccounts"; extern string symbol_prefix = ""; extern string symbol_suffix = ""; extern bool ShowObjects = true; extern bool ShowOnlyPairOnChart = FALSE; extern int MA_Method = 3; extern int Price = 6; extern int Fast = 3; extern int Slow = 5; extern string Show = "False turns off currency line on chart:"; extern bool USD = TRUE; extern bool EUR = TRUE; extern bool GBP = TRUE; extern bool CHF = TRUE; extern bool JPY = TRUE; extern bool AUD = TRUE; extern bool CAD = TRUE; extern bool NZD = TRUE; extern color Color_USD = Green; extern color Color_EUR = Aqua; extern color Color_GBP = Red; extern color Color_CHF = Sienna; extern color Color_JPY = Maroon; extern color Color_AUD = DarkOrange; extern color Color_CAD = Purple; extern color Color_NZD = Teal; extern int Line_Thickness = 2; extern int All_Bars = 1000; extern int Last_Bars = 1000; double arrUSD[]; double arrEUR[]; double arrGBP[]; double arrCHF[]; double arrJPY[]; double arrAUD[]; double arrCAD[]; double arrNZD[]; string ObjectID = "CCFp_"; string sAUDUSD,sEURUSD,sUSDCHF,sNZDUSD,sGBPUSD,sUSDJPY,sUSDCAD; int init() { if (USD) Indicator_Name = StringConcatenate(Indicator_Name, " USD"); if (EUR) Indicator_Name = StringConcatenate(Indicator_Name, " EUR"); if (GBP) Indicator_Name = StringConcatenate(Indicator_Name, " GBP"); if (CHF) Indicator_Name = StringConcatenate(Indicator_Name, " CHF"); if (AUD) Indicator_Name = StringConcatenate(Indicator_Name, " AUD"); if (CAD) Indicator_Name = StringConcatenate(Indicator_Name, " CAD"); if (JPY) Indicator_Name = StringConcatenate(Indicator_Name, " JPY"); if (NZD) Indicator_Name = StringConcatenate(Indicator_Name, " NZD"); IndicatorShortName(Indicator_Name); int width = 0; if (StringFind(Symbol(), "USD", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, width, Color_USD); SetIndexBuffer(0, arrUSD); SetIndexLabel(0, "USD"); if (StringFind(Symbol(), "EUR", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, width, Color_EUR); SetIndexBuffer(1, arrEUR); SetIndexLabel(1, "EUR"); if (StringFind(Symbol(), "GBP", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, width, Color_GBP); SetIndexBuffer(2, arrGBP); SetIndexLabel(2, "GBP"); if (StringFind(Symbol(), "CHF", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, width, Color_CHF); SetIndexBuffer(3, arrCHF); SetIndexLabel(3, "CHF"); if (StringFind(Symbol(), "JPY", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(4, DRAW_LINE, STYLE_SOLID, width, Color_JPY); SetIndexBuffer(4, arrJPY); SetIndexLabel(4, "JPY"); if (StringFind(Symbol(), "AUD", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(5, DRAW_LINE, STYLE_SOLID, width, Color_AUD); SetIndexBuffer(5, arrAUD); SetIndexLabel(5, "AUD"); if (StringFind(Symbol(), "CAD", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(6, DRAW_LINE, STYLE_SOLID, width, Color_CAD); SetIndexBuffer(6, arrCAD); SetIndexLabel(6, "CAD"); if (StringFind(Symbol(), "NZD", 0) < 0) width = 1; else width = Line_Thickness; SetIndexStyle(7, DRAW_LINE, STYLE_SOLID, width, Color_NZD); SetIndexBuffer(7, arrNZD); SetIndexLabel(7, "NZD"); GetCorrectSymbols(); Objs = 0; return (0); } int deinit() { if (ShowObjects) { delete_objects(); } return (0); } void delete_objects() { int i, tot; string object_name; tot = ObjectsTotal(); for (i = tot; i>=0;i--) { object_name = ObjectName(i); if (StringFind(object_name, ObjectID) > -1 ) ObjectDelete(object_name); } } void PlaceColorChart() { int cur = 10; int st = 23; if (USD) { sl("~", cur, Color_USD); cur += st; } if (EUR) { sl("~", cur, Color_EUR); cur += st; } if (GBP) { sl("~", cur, Color_GBP); cur += st; } if (CHF) { sl("~", cur, Color_CHF); cur += st; } if (AUD) { sl("~", cur, Color_AUD); cur += st; } if (CAD) { sl("~", cur, Color_CAD); cur += st; } if (JPY) { sl("~", cur, Color_JPY); cur += st; } if (NZD) { sl("~", cur, Color_NZD); cur += st; } } int start() { double EURUSD_Fast, EURUSD_Slow; double GBPUSD_Fast, GBPUSD_Slow; double AUDUSD_Fast, AUDUSD_Slow; double NZDUSD_Fast, NZDUSD_Slow; double USDCAD_Fast, USDCAD_Slow; double USDCHF_Fast, USDCHF_Slow; double USDJPY_Fast, USDJPY_Slow; int counted_bars = IndicatorCounted(); if (counted_bars < 0) return (-1); if (All_Bars < 1) All_Bars = Bars; if (counted_bars > 0 && Last_Bars > 0) counted_bars -= Last_Bars; int limit = All_Bars - counted_bars; if (limit < 1) limit = 2; if (Objs == 0) PlaceColorChart(); for (int i = 0; i < limit; i++) { EURUSD_Fast = ma(sEURUSD, Fast, MA_Method, Price, i); EURUSD_Slow = ma(sEURUSD, Slow, MA_Method, Price, i); if (!EURUSD_Fast || !EURUSD_Slow) break; GBPUSD_Fast = ma(sGBPUSD, Fast, MA_Method, Price, i); GBPUSD_Slow = ma(sGBPUSD, Slow, MA_Method, Price, i); if (!GBPUSD_Fast || !GBPUSD_Slow) break; AUDUSD_Fast = ma(sAUDUSD, Fast, MA_Method, Price, i); AUDUSD_Slow = ma(sAUDUSD, Slow, MA_Method, Price, i); if (!AUDUSD_Fast || !AUDUSD_Slow) break; NZDUSD_Fast = ma(sNZDUSD, Fast, MA_Method, Price, i); NZDUSD_Slow = ma(sNZDUSD, Slow, MA_Method, Price, i); if (!NZDUSD_Fast || !NZDUSD_Slow) break; USDCAD_Fast = ma(sUSDCAD, Fast, MA_Method, Price, i); USDCAD_Slow = ma(sUSDCAD, Slow, MA_Method, Price, i); if (!USDCAD_Fast || !USDCAD_Slow) break; USDCHF_Fast = ma(sUSDCHF, Fast, MA_Method, Price, i); USDCHF_Slow = ma(sUSDCHF, Slow, MA_Method, Price, i); if (!USDCHF_Fast || !USDCHF_Slow) break; USDJPY_Fast = ma(sUSDJPY, Fast, MA_Method, Price, i); USDJPY_Slow = ma(sUSDJPY, Slow, MA_Method, Price, i); if (!USDJPY_Fast || !USDJPY_Slow) break; if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "USD", 0) != -1) || (ShowOnlyPairOnChart == FALSE && USD == TRUE)) { arrUSD[i] = 0; arrUSD[i] += (EURUSD_Slow / EURUSD_Fast - 1.0); arrUSD[i] += (GBPUSD_Slow / GBPUSD_Fast - 1.0); arrUSD[i] += (AUDUSD_Slow / AUDUSD_Fast - 1.0); arrUSD[i] += (NZDUSD_Slow / NZDUSD_Fast - 1.0); arrUSD[i] += (USDCHF_Fast / USDCHF_Slow - 1.0); arrUSD[i] += (USDCAD_Fast / USDCAD_Slow - 1.0); arrUSD[i] += (USDJPY_Fast / USDJPY_Slow - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "EUR", 0) != -1) || (ShowOnlyPairOnChart == FALSE && EUR == TRUE)) { arrEUR[i] = 0; arrEUR[i] += (EURUSD_Fast / EURUSD_Slow - 1.0); arrEUR[i] += (EURUSD_Fast / GBPUSD_Fast / (EURUSD_Slow / GBPUSD_Slow) - 1.0); arrEUR[i] += (EURUSD_Fast / AUDUSD_Fast / (EURUSD_Slow / AUDUSD_Slow) - 1.0); arrEUR[i] += (EURUSD_Fast / NZDUSD_Fast / (EURUSD_Slow / NZDUSD_Slow) - 1.0); arrEUR[i] += (EURUSD_Fast * USDCHF_Fast / (EURUSD_Slow * USDCHF_Slow) - 1.0); arrEUR[i] += (EURUSD_Fast * USDCAD_Fast / (EURUSD_Slow * USDCAD_Slow) - 1.0); arrEUR[i] += (EURUSD_Fast * USDJPY_Fast / (EURUSD_Slow * USDJPY_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "GBP", 0) != -1) || (ShowOnlyPairOnChart == FALSE && GBP == TRUE)) { arrGBP[i] = 0; arrGBP[i] += (GBPUSD_Fast / GBPUSD_Slow - 1.0); arrGBP[i] += (EURUSD_Slow / GBPUSD_Slow / (EURUSD_Fast / GBPUSD_Fast) - 1.0); arrGBP[i] += (GBPUSD_Fast / AUDUSD_Fast / (GBPUSD_Slow / AUDUSD_Slow) - 1.0); arrGBP[i] += (GBPUSD_Fast / NZDUSD_Fast / (GBPUSD_Slow / NZDUSD_Slow) - 1.0); arrGBP[i] += (GBPUSD_Fast * USDCHF_Fast / (GBPUSD_Slow * USDCHF_Slow) - 1.0); arrGBP[i] += (GBPUSD_Fast * USDCAD_Fast / (GBPUSD_Slow * USDCAD_Slow) - 1.0); arrGBP[i] += (GBPUSD_Fast * USDJPY_Fast / (GBPUSD_Slow * USDJPY_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "AUD", 0) != -1) || (ShowOnlyPairOnChart == FALSE && AUD == TRUE)) { arrAUD[i] = 0; arrAUD[i] += (AUDUSD_Fast / AUDUSD_Slow - 1.0); arrAUD[i] += (EURUSD_Slow / AUDUSD_Slow / (EURUSD_Fast / AUDUSD_Fast) - 1.0); arrAUD[i] += (GBPUSD_Slow / AUDUSD_Slow / (GBPUSD_Fast / AUDUSD_Fast) - 1.0); arrAUD[i] += (AUDUSD_Fast / NZDUSD_Fast / (AUDUSD_Slow / NZDUSD_Slow) - 1.0); arrAUD[i] += (AUDUSD_Fast * USDCHF_Fast / (AUDUSD_Slow * USDCHF_Slow) - 1.0); arrAUD[i] += (AUDUSD_Fast * USDCAD_Fast / (AUDUSD_Slow * USDCAD_Slow) - 1.0); arrAUD[i] += (AUDUSD_Fast * USDJPY_Fast / (AUDUSD_Slow * USDJPY_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "NZD", 0) != -1) || (ShowOnlyPairOnChart == FALSE && NZD == TRUE)) { arrNZD[i] = 0; arrNZD[i] += (NZDUSD_Fast / NZDUSD_Slow - 1.0); arrNZD[i] += (EURUSD_Slow / NZDUSD_Slow / (EURUSD_Fast / NZDUSD_Fast) - 1.0); arrNZD[i] += (GBPUSD_Slow / NZDUSD_Slow / (GBPUSD_Fast / NZDUSD_Fast) - 1.0); arrNZD[i] += (AUDUSD_Slow / NZDUSD_Slow / (AUDUSD_Fast / NZDUSD_Fast) - 1.0); arrNZD[i] += (NZDUSD_Fast * USDCHF_Fast / (NZDUSD_Slow * USDCHF_Slow) - 1.0); arrNZD[i] += (NZDUSD_Fast * USDCAD_Fast / (NZDUSD_Slow * USDCAD_Slow) - 1.0); arrNZD[i] += (NZDUSD_Fast * USDJPY_Fast / (NZDUSD_Slow * USDJPY_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "CAD", 0) != -1) || (ShowOnlyPairOnChart == FALSE && CAD == TRUE)) { arrCAD[i] = 0; arrCAD[i] += (USDCAD_Slow / USDCAD_Fast - 1.0); arrCAD[i] += (EURUSD_Slow * USDCAD_Slow / (EURUSD_Fast * USDCAD_Fast) - 1.0); arrCAD[i] += (GBPUSD_Slow * USDCAD_Slow / (GBPUSD_Fast * USDCAD_Fast) - 1.0); arrCAD[i] += (AUDUSD_Slow * USDCAD_Slow / (AUDUSD_Fast * USDCAD_Fast) - 1.0); arrCAD[i] += (NZDUSD_Slow * USDCAD_Slow / (NZDUSD_Fast * USDCAD_Fast) - 1.0); arrCAD[i] += (USDCHF_Fast / USDCAD_Fast / (USDCHF_Slow / USDCAD_Slow) - 1.0); arrCAD[i] += (USDJPY_Fast / USDCAD_Fast / (USDJPY_Slow / USDCAD_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "CHF", 0) != -1) || (ShowOnlyPairOnChart == FALSE && CHF == TRUE)) { arrCHF[i] = 0; arrCHF[i] += (USDCHF_Slow / USDCHF_Fast - 1.0); arrCHF[i] += (EURUSD_Slow * USDCHF_Slow / (EURUSD_Fast * USDCHF_Fast) - 1.0); arrCHF[i] += (GBPUSD_Slow * USDCHF_Slow / (GBPUSD_Fast * USDCHF_Fast) - 1.0); arrCHF[i] += (AUDUSD_Slow * USDCHF_Slow / (AUDUSD_Fast * USDCHF_Fast) - 1.0); arrCHF[i] += (NZDUSD_Slow * USDCHF_Slow / (NZDUSD_Fast * USDCHF_Fast) - 1.0); arrCHF[i] += (USDCHF_Slow / USDCAD_Slow / (USDCHF_Fast / USDCAD_Fast) - 1.0); arrCHF[i] += (USDJPY_Fast / USDCHF_Fast / (USDJPY_Slow / USDCHF_Slow) - 1.0); } if ((ShowOnlyPairOnChart == TRUE && StringFind(Symbol(), "JPY", 0) != -1) || (ShowOnlyPairOnChart == FALSE && JPY == TRUE)) { arrJPY[i] = 0; arrJPY[i] += (USDJPY_Slow / USDJPY_Fast - 1.0); arrJPY[i] += (EURUSD_Slow * USDJPY_Slow / (EURUSD_Fast * USDJPY_Fast) - 1.0); arrJPY[i] += (GBPUSD_Slow * USDJPY_Slow / (GBPUSD_Fast * USDJPY_Fast) - 1.0); arrJPY[i] += (AUDUSD_Slow * USDJPY_Slow / (AUDUSD_Slow * USDJPY_Fast) - 1.0); arrJPY[i] += (NZDUSD_Slow * USDJPY_Slow / (NZDUSD_Fast * USDJPY_Fast) - 1.0); arrJPY[i] += (USDJPY_Slow / USDCAD_Slow / (USDJPY_Fast / USDCAD_Slow) - 1.0); arrJPY[i] += (USDJPY_Slow / USDCHF_Slow / (USDJPY_Slow / USDCHF_Fast) - 1.0); } } return (0); } double ma(string sym, int per, int Mode, int Price, int i) { double res = 0; int k = 1; int ma_shift = 0; int tf = 0; switch (Period()) { case PERIOD_M1: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 5; case PERIOD_M5: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 3; case PERIOD_M15: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 2; case PERIOD_M30: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 2; case PERIOD_H1: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 4; case PERIOD_H4: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 6; case PERIOD_D1: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 4; case PERIOD_W1: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); k += 4; case PERIOD_MN1: res += iMA(sym, tf, per * k, ma_shift, Mode, Price, i); } return (res); } void sl(string sym, int y, color col) { int window = WindowFind(Indicator_Name); string ID; int tmp = y + 10; if (ShowObjects) { Objs++; ID = ObjectID + Objs; if (ObjectFind(ID) == -1 ){ if (ObjectCreate(ID, OBJ_LABEL, window, 0, 0)) { ObjectSet(ID, OBJPROP_XDISTANCE, y + 35); ObjectSet(ID, OBJPROP_YDISTANCE, 0); ObjectSetText(ID, sym, 18, "Arial Black", col); } } } } void GetCorrectSymbols() { sAUDUSD = symbol_prefix + "AUDUSD" + symbol_suffix; sEURUSD = symbol_prefix + "EURUSD" + symbol_suffix; sUSDCHF = symbol_prefix + "USDCHF" + symbol_suffix; sNZDUSD = symbol_prefix + "NZDUSD" + symbol_suffix; sGBPUSD = symbol_prefix + "GBPUSD" + symbol_suffix; sUSDJPY = symbol_prefix + "USDJPY" + symbol_suffix; sUSDCAD = symbol_prefix + "USDCAD" + symbol_suffix; } //+------------------------------------------------------------------+