//+------------------------------------------------------------------+ //| ocn - nst.mq5 | //+------------------------------------------------------------------+ #property copyright "mladen" #property link "mladenfx@gmail.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 1 // // // // // #property indicator_label1 "Ocean nmm" #property indicator_type1 DRAW_LINE #property indicator_color1 DeepSkyBlue #property indicator_style1 STYLE_SOLID // // // // // input int inpNmmPeriod = 40; // Natural market mirror calculation period input ENUM_APPLIED_PRICE inpNmmPrice = PRICE_CLOSE; // Apply to price input int inpTemaPeriod = 10; // triple EMA smoothing period // // // // // double nmmBuffer[]; double prcBuffer[]; double tBuffer[][4]; double alpha; // // // // // int iNmmPeriod; int iTemaPeriod; int priceHandle; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // int OnInit() { SetIndexBuffer(0,nmmBuffer,INDICATOR_DATA); ArraySetAsSeries(nmmBuffer,true); SetIndexBuffer(1,prcBuffer,INDICATOR_CALCULATIONS); ArraySetAsSeries(prcBuffer,true); iNmmPeriod = (inpNmmPeriod>1) ? inpNmmPeriod : 1; iTemaPeriod = (inpTemaPeriod>1) ? inpTemaPeriod : 1; alpha = 2.0 /(1.0 + iTemaPeriod); // // // // // string PriceType; switch(inpNmmPrice) { case PRICE_CLOSE: PriceType = "Close"; break; // 0 case PRICE_OPEN: PriceType = "Open"; break; // 1 case PRICE_HIGH: PriceType = "High"; break; // 2 case PRICE_LOW: PriceType = "Low"; break; // 3 case PRICE_MEDIAN: PriceType = "Median"; break; // 4 case PRICE_TYPICAL: PriceType = "Typical"; break; // 5 case PRICE_WEIGHTED: PriceType = "Weighted"; break; // 6 } // // // // // IndicatorSetString(INDICATOR_SHORTNAME,"Ocean nmm ("+(string)iNmmPeriod+","+(string)iTemaPeriod+","+PriceType+")"); priceHandle = iMA(NULL,0,1,0,MODE_SMA,inpNmmPrice); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // #define iPrc 3 int OnCalculate(const int totalBars, const int totalCalculated, const datetime& time[], const double& open[], const double& high[], const double& low[], const double& close[], const long& tick_volume[], const long& volume[], const int& spread[]) { // // // // // int limit = totalBars-totalCalculated; if (totalCalculated > 0) limit++; if (totalCalculated ==0) limit -= (iNmmPeriod>1) ? iNmmPeriod : 2; if (!checkCalculated(priceHandle,totalBars,"prices")) return(totalCalculated); if (!doCopy(priceHandle,prcBuffer,0,limit,"prices")) return(totalCalculated); if (ArrayRange(tBuffer,0) != totalBars) ArrayResize(tBuffer,totalBars); // // // // // for(int i=limit, r=totalBars-i-1; i >= 0; i--,r++) { double currPrice = iTema(prcBuffer[i],r); if (currPrice > 0) tBuffer[r][iPrc] = MathLog(currPrice); else tBuffer[r][iPrc] = 0.00; // // // // // nmmBuffer[i] = iNmmFunction(1,r); } return(totalBars); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // natural market mirror // // // double iNmmFunction(int startPeriod, int r) { int endPeriod = startPeriod*iNmmPeriod; double sum = 0.00; double currPrice = tBuffer[r][iPrc]; for (int i= startPeriod;(i<=r) && (i<=endPeriod); i += startPeriod) sum += (currPrice-tBuffer[r-i][iPrc])/MathSqrt(i); return(sum/(double)iNmmPeriod*1000.00); } // // // // // double iTema(double price,int i) { if (i < iNmmPeriod) { tBuffer[i][0] = price; tBuffer[i][1] = price; tBuffer[i][2] = price; } else { tBuffer[i][0] = tBuffer[i-1][0]+alpha*(price -tBuffer[i-1][0]); tBuffer[i][1] = tBuffer[i-1][1]+alpha*(tBuffer[i][0]-tBuffer[i-1][1]); tBuffer[i][2] = tBuffer[i-1][2]+alpha*(tBuffer[i][1]-tBuffer[i-1][2]); } return(3.0*tBuffer[i][0] - 3.0*tBuffer[i][1] + tBuffer[i][2]); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // bool checkCalculated(int bufferHandle, int total, string checkDescription) { int calculated=BarsCalculated(bufferHandle); if (calculated