//+------------------------------------------------------------------+ //| FFS_CrossTiming.mq4 | //| Release date 20070128 | //+------------------------------------------------------------------+ #property copyright "icm63 (user name at Forex-TSD)" #property link "Forex-TSD" /* READ ME FIRST.. I have nothing to do with www.forexforsmarties.com. You use these tools at YOUR OWN RISK. I do not endorse or sell FFS methods or products in any way. These tools are provided FREE of charge, I wish to promote the development of MT4 tools and minds of those who trade FFS to get the best 'How to FFS tools'. So we all can trade FFS thru easy and tough times. As the Forex market gives and takes away fortunes ! To make 5% monthly compounding over 10 years is not easy when the forex beast changes. Use with FFS_Trend FFS_Correlation FFS_Cross FFS_NetPipChange IMPORTANT : Make sure the 'IndexType' is the same within each MT4 tool. The FFS_Mode should be set as BUY, to mirror the FFS Calcutator. Like the FFS_Correlation tool, this is a fundamental watch. It shows the combined trend of all the crosses related to the hedge pair in question. All cross have been adjusted to be on the same price scale and treated as equal weight. When this start getting wild so will the accounts trading FFS, and settings will have to be adjusted for survival. Use the FFS_Trainspotter (in FFS_Trend) to see FFS_NetPipChange summary to view the extremes of the net pip swings of the hedge pairs. This is the index selection format 1. EUR/USD, USD/CHF 2. EUR/USD, USD/CHF, GBP/USD 3. EUR/USD, USD/CHF, GBP/USD, USD/JPY 4. EUR/USD, USD/CHF, USD/JPY 5. EUR/USD, GBP/USD, USD/JPY 6. USD/CHF, GBP/USD 7. USD/CHF, GBP/USD, USD/JPY 8. GBP/USD, USD/JPY */ #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Red #property indicator_color2 DarkGreen #property indicator_color3 Lime #property indicator_level1 60 #property indicator_level2 40 //User Inputs Parameters extern int IndexType = 9; // FFS Index see above extern int CCI = 5; //CCI period extern double Lag1_Gamma = 0.5; //Laguerre Gamma Short extern double Lag2_Gamma = 0.8; //Laguerre Gamma Long //---- variables double cross1[]; double CCI1[]; double Lag1[]; double Lag2[]; double normCCI1[]; double normcross1[]; string shortname; //Laguerra Variables double L0A = 0; double L1A = 0; double L2A = 0; double L3A = 0; double L0 = 0; double L1 = 0; double L2 = 0; double L3 = 0; double CU = 0; double CD = 0; double LRSI = 0; int init() { shortname = "FFS_CrossTiming Index " + IndexType + ", CCI Red ("+CCI+ "), Laguerre("+DoubleToStr(Lag1_Gamma,1)+","+DoubleToStr(Lag2_Gamma,1)+"), "; IndicatorShortName(shortname); IndicatorBuffers(6); SetIndexDrawBegin(0,CCI+1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,normCCI1); SetIndexLabel(0, "CCI1"); SetIndexDrawBegin(1,5); SetIndexEmptyValue(1, -0.01); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,Lag1); SetIndexLabel(1, "Lag1"); SetIndexDrawBegin(2,5); SetIndexEmptyValue(2, -0.01); SetIndexStyle(2,DRAW_LINE); SetIndexBuffer(2,Lag2); SetIndexLabel(2, "Lag2"); SetIndexBuffer(3,cross1); SetIndexBuffer(4,CCI1); SetIndexBuffer(5,normcross1); return(0); } int deinit() { return(0); } int start() { int limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars-=1; limit=Bars-counted_bars; double EURCHFW, GBPCHFW, EURJPYW, GBPJPYW, CHFJPYW, EURGBPW; //Determine correct weight to get all prices on scale of 10,000 EURCHFW = (10000/(iClose("EURCHF",0,1)*10000))*10000; GBPCHFW = (10000/(iClose("GBPCHF",0,1)*10000))*10000; EURJPYW = (10000/(iClose("EURJPY",0,1)*10000))*10000; GBPJPYW = (10000/(iClose("GBPJPY",0,1)*10000))*10000; CHFJPYW = (10000/(iClose("CHFJPY",0,1)*10000))*10000; EURGBPW = (10000/(iClose("EURGBP",0,1)*10000))*10000; for(int i=limit; i>=0; i--) { switch(IndexType) { case 1: //1. EUR/USD, USD/CHF" cross1[i]= iClose("EURCHF",0,i) * EURCHFW; break; case 2: //2. EUR/USD, USD/CHF, GBP/USD cross1[i]= iClose("EURCHF",0,i) * EURCHFW + iClose("GBPCHF",0,i) * GBPCHFW + iClose("EURGBP",0,i) * EURGBPW; break; case 3: //3. EUR/USD, USD/CHF, GBP/USD, USD/JPY cross1[i]= iClose("EURCHF",0,i) * EURCHFW + iClose("GBPCHF",0,i) * GBPCHFW + iClose("EURJPY",0,i) * EURJPYW + iClose("GBPJPY",0,i) * GBPJPYW + iClose("CHFJPY",0,i) * CHFJPYW + iClose("EURGBP",0,i) * EURGBPW ; break; case 4: //4. EUR/USD, USD/CHF, USD/JPY cross1[i]= iClose("EURCHF",0,i) * EURCHFW + iClose("EURJPY",0,i) * EURJPYW + iClose("CHFJPY",0,i) * CHFJPYW ; break; case 5: //5. EUR/USD, GBP/USD, USD/JPY cross1[i]= iClose("EURJPY",0,i) * EURJPYW + iClose("GBPJPY",0,i) * GBPJPYW + iClose("EURGBP",0,i) * EURGBPW ; break; case 6: //6. USD/CHF, GBP/USD cross1[i]= iClose("GBPCHF",0,i) * GBPCHFW ; break; case 7: //7. USD/CHF, GBP/USD, USD/JPY cross1[i]= iClose("GBPCHF",0,i) * GBPCHFW + iClose("GBPJPY",0,i) * GBPJPYW + iClose("CHFJPY",0,i) * CHFJPYW ; break; case 8: //8. GBP/USD, USD/JPY cross1[i]= iClose("GBPJPY",0,i) * GBPJPYW ; break; case 9: //9. Chart Symbol cross1[i]= iClose(NULL,0,i) ; break; default: //3. EUR/USD, USD/CHF, GBP/USD, USD/JPY cross1[i]= iClose("EURCHF",0,i) * EURCHFW + iClose("GBPCHF",0,i) * GBPCHFW + iClose("EURJPY",0,i) * EURJPYW + iClose("GBPJPY",0,i) * GBPJPYW + iClose("CHFJPY",0,i) * CHFJPYW + iClose("EURGBP",0,i) * EURGBPW ; break; } //Find Max and Min or series double Maxcross1=-10000000, Mincross1=10000000; for (int k=0; k<limit;k++) { if( cross1[i+k] > Maxcross1) Maxcross1 = cross1[i+k]; if( cross1[i+k] < Mincross1) Mincross1 = cross1[i+k]; } } //Normalise Data btw 0 and 100 for(int m=limit; m>=0; m--) { if (Maxcross1 - Mincross1 != 0) normcross1[m] = NormalizeDouble(100*(cross1[m]-Mincross1)/(Maxcross1-Mincross1),2); } //INDICATORS FOR NORMALISED CROSSES DATA FOR ENTRY AND EXIT TIMING FOR FFS TRADES //Calculate CCI and Laguerre arrays if(CCI > 0) { for(int g = limit; g>=0; g--) { CCI1[g] = iCCIOnArray(normcross1,limit,CCI,g); //Red Lag1[g] = LaguerreRSI(normcross1[g],Lag1_Gamma); } for(int y = limit; y>=0; y--) { Lag2[y] = LaguerreRSI(normcross1[y],Lag2_Gamma); } } NormaliseSeries(CCI1,normCCI1,limit); return(0); } //+------------------------------------------------------------------+ //FUNCTIONS void NormaliseSeries(double& InData[], double& OutData[], int limit) { double nMax= -10000000; double nMin= 10000000; for ( int k=0; k<limit;k++) { if( InData[k] > nMax) nMax = InData[k]; if( InData[k] < nMin) nMin = InData[k]; } //Normalise Data btw Min and Max for(int m=limit; m>=0; m--) { if (nMax - nMin != 0) OutData[m] = NormalizeDouble(100*((InData[m]-nMin)/(nMax-nMin)),2); } } // Laguerre calc double LaguerreRSI(double InData, double gamma) { L0A = L0; L1A = L1; L2A = L2; L3A = L3; L0 = (1 - gamma)* InData + gamma* L0A; L1 = - gamma * L0 + L0A + gamma * L1A; L2 = - gamma * L1 + L1A + gamma * L2A; L3 = - gamma * L2 + L2A + gamma * L3A; //---- CU = 0; CD = 0; //---- if(L0 >= L1) CU = L0 - L1; else CD = L1 - L0; //---- if(L1 >= L2) CU = CU + L1 - L2; else CD = CD + L2 - L1; //---- if(L2 >= L3) CU = CU + L2 - L3; else CD = CD + L3 - L2; //---- if(CU + CD != 0) LRSI = NormalizeDouble((CU / (CU + CD))* 90,2); return(LRSI); }
Sample
Analysis
Market Information Used:
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Commodity channel index
Custom Indicators Used:
Order Management characteristics:
Other Features: