//+------------------------------------------------------------------+ //| Triggerlines | //| | //+------------------------------------------------------------------+ #property copyright "www,forex-station.com" #property link "www,forex-station.com" #property indicator_chart_window #property indicator_buffers 6 #property indicator_color1 clrLimeGreen #property indicator_color2 clrRed #property indicator_color3 clrRed #property indicator_color4 clrLimeGreen #property indicator_color5 clrRed #property indicator_color6 clrRed #property indicator_width1 2 #property indicator_width2 2 #property indicator_width3 2 #property indicator_width4 2 #property indicator_width5 2 #property indicator_width6 2 #property strict // // // // // enum enPrices { pr_close, // Close pr_open, // Open pr_high, // High pr_low, // Low pr_median, // Median pr_typical, // Typical pr_weighted, // Weighted pr_average, // Average (high+low+open+close)/4 pr_medianb, // Average median body (open+close)/2 pr_tbiased, // Trend biased price pr_tbiased2, // Trend biased (extreme) price pr_haclose, // Heiken ashi close pr_haopen , // Heiken ashi open pr_hahigh, // Heiken ashi high pr_halow, // Heiken ashi low pr_hamedian, // Heiken ashi median pr_hatypical, // Heiken ashi typical pr_haweighted, // Heiken ashi weighted pr_haaverage, // Heiken ashi average pr_hamedianb, // Heiken ashi median body pr_hatbiased, // Heiken ashi trend biased price pr_hatbiased2, // Heiken ashi trend biased (extreme) price pr_habclose, // Heiken ashi (better formula) close pr_habopen , // Heiken ashi (better formula) open pr_habhigh, // Heiken ashi (better formula) high pr_hablow, // Heiken ashi (better formula) low pr_habmedian, // Heiken ashi (better formula) median pr_habtypical, // Heiken ashi (better formula) typical pr_habweighted,// Heiken ashi (better formula) weighted pr_habaverage, // Heiken ashi (better formula) average pr_habmedianb, // Heiken ashi (better formula) median body pr_habtbiased, // Heiken ashi (better formula) trend biased price pr_habtbiased2 // Heiken ashi (better formula) trend biased (extreme) price }; input int inpPeriod = 20; // Lsma period input enPrices Price = pr_habclose; // Lsma price input bool verticalLinesVisible = false; // Show vertical lines true/false input string verticalLinesID = "trigg Lines"; // Lines ID input color verticalLinesUpColor = clrDeepSkyBlue; // Lines up color input color verticalLinesDnColor = clrPaleVioletRed; // Lines down color input ENUM_LINE_STYLE verticalLinesStyle = STYLE_DOT; // Lines style input int verticalLinesWidth = 0; // lines width double lsma[],lsmaUa[],lsmaUb[],lwma[],lwmaUa[],lwmaUb[],vals[],valw[],valc[]; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // int OnInit() { IndicatorBuffers(9); SetIndexBuffer(0,lsma, INDICATOR_DATA); SetIndexBuffer(1,lsmaUa,INDICATOR_DATA); SetIndexBuffer(2,lsmaUb,INDICATOR_DATA); SetIndexBuffer(3,lwma, INDICATOR_DATA); SetIndexBuffer(4,lwmaUa,INDICATOR_DATA); SetIndexBuffer(5,lwmaUb,INDICATOR_DATA); SetIndexBuffer(6,vals); SetIndexBuffer(7,valw); SetIndexBuffer(8,valc); IndicatorSetString(INDICATOR_SHORTNAME,"Triggerlines"); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { string lookFor = verticalLinesID+":"; int lookForLength = StringLen(lookFor); for (int i=ObjectsTotal()-1; i>=0; i--) { string objectName = ObjectName(i); if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName); } } // // // int OnCalculate(const int rates_total,const int prev_calculated,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 i=rates_total-prev_calculated+1; if (i>=rates_total) i=rates_total-2; // // // if (vals[i]==-1) CleanPoint(i,lsmaUa,lsmaUb); if (valw[i]==-1) CleanPoint(i,lwmaUa,lwmaUb); for (; i>=0 && !_StopFlag; i--) { double prc = getPrice(Price,open,close,high,low,i,rates_total); lsma[i] = iLinr(prc,inpPeriod,i,rates_total); lwma[i] = lsma[i+1]; vals[i] = (ilsma[i+1]) ? 1 : (lsma[i]lwma[i+1]) ? 1 : (lwma[i]lwma[i]) ? 1 : (lsma[i]=0; k++) { double weight = period-k; lwmw += weight; liwma += weight*workLinr[r-k][instanceNo]; sma += workLinr[r-k][instanceNo]; } return(3.0*liwma/lwmw-2.0*sma/period); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // #define _prHABF(_prtype) (_prtype>=pr_habclose && _prtype<=pr_habtbiased2) #define _priceInstances 1 #define _priceInstancesSize 4 double workHa[][_priceInstances*_priceInstancesSize]; double getPrice(int tprice, const double& open[], const double& close[], const double& high[], const double& low[], int i, int bars, int instanceNo=0) { if (tprice>=pr_haclose) { if (ArrayRange(workHa,0)!= bars) ArrayResize(workHa,bars); instanceNo*=_priceInstancesSize; int r = bars-i-1; // // // // // double haOpen = (r>0) ? (open[i+1]+close[i+1])*0.5 : (open[i]+close[i])*0.5; double haClose = (open[i]+high[i]+low[i]+close[i])*0.25; if (_prHABF(tprice)) if (high[i]!=low[i]) haClose = (open[i]+close[i])/2.0+(((close[i]-open[i])/(high[i]-low[i]))*fabs((close[i]-open[i])/2.0)); else haClose = (open[i]+close[i])/2.0; double haHigh = fmax(high[i], fmax(haOpen,haClose)); double haLow = fmin(low[i] , fmin(haOpen,haClose)); // // // // // if(haOpenhaOpen) return((haHigh+haClose)/2.0); else return((haLow+haClose)/2.0); case pr_hatbiased2: case pr_habtbiased2: if (haClose>haOpen) return(haHigh); if (haCloseopen[i]) return((high[i]+close[i])/2.0); else return((low[i]+close[i])/2.0); case pr_tbiased2: if (close[i]>open[i]) return(high[i]); if (close[i]=Bars-2) return; if ((second[i] != EMPTY_VALUE) && (second[i+1] != EMPTY_VALUE)) second[i+1] = EMPTY_VALUE; else if ((first[i] != EMPTY_VALUE) && (first[i+1] != EMPTY_VALUE) && (first[i+2] == EMPTY_VALUE)) first[i+1] = EMPTY_VALUE; } void PlotPoint(int i,double& first[],double& second[],double& from[]) { if (i>=Bars-2) return; if (first[i+1] == EMPTY_VALUE) if (first[i+2] == EMPTY_VALUE) { first[i] = from[i]; first[i+1] = from[i+1]; second[i] = EMPTY_VALUE; } else { second[i] = from[i]; second[i+1] = from[i+1]; first[i] = EMPTY_VALUE; } else { first[i] = from[i]; second[i] = EMPTY_VALUE; } } // // // // // void drawLine(int i,color theColor) { string name = verticalLinesID+":"+(string)Time[i]; // // // // // datetime time = Time[i]; //if (linesOnNewest) time += _Period*60-1; ObjectCreate(name,OBJ_VLINE,0,time,0); ObjectSet(name,OBJPROP_COLOR,theColor); ObjectSet(name,OBJPROP_STYLE,verticalLinesStyle); ObjectSet(name,OBJPROP_WIDTH,verticalLinesWidth); ObjectSet(name,OBJPROP_BACK,true); }