The problem is when color switches too fast(as fast as a different color for each consecutive index) the different color in between cannot be shown and one color dominates all.
Do you have a solution for this? I tried using double times buffers to solve this. Although it worked but I don't like making this so complicated.
Same as any colored line indicator. Look in the CodeBase. If you assign to one color buffer, make the other color buffer(s) EMPTY_VALUE. Then connect to the previous bar.
HOW CAN I hide CONNECTION lines of plots? (ttt) - MQL4 programming forum (2016)
For MT4 I use:
- One buffer has the value, color set to CLR_NONE so not shown on chart, (but in data window and pop up.)
- Two buffers, one color each, with SetIndexLabel(i, NULL) so they don't show in data window.
- Then you need to connect the lines on color change. downBuffer[i]=value[i]; if(downBuffer[i+1]==EMPTY_VALUE) downBuffer[i+1]=value[i].
In order to implement two-colored line in MT4 custom indicators, I try to use two buffers, each with a different color.
the code looks something like this:
The problem is when color switches too fast(as fast as a different color for each consecutive index) the different color in between cannot be shown and one color dominates all.
Do you have a solution for this? I tried using double times buffers to solve this. Although it worked but I don't like making this so complicated.
The issue starts when there are 3 sequential alternating rise or drops
like DROP , RISE , DROP
The indicator then correctly assumes it must connect the 2 drops which will occlude the rise if the drop plot is after the rise plot.
The solution is very ugly , unless i'm missing a DRAW type .
(i think it could be done with section if you smash the buffer following a drawn part with empty value , but i've not tested it.Absent any beautiful solutions the best course would be to have little balls on the data points and convey the indicators information by coloring them)
#property strict #property indicator_separate_window #property indicator_buffers 7 #property indicator_plots 5 //--- plot rise #property indicator_label1 "data" #property indicator_type1 DRAW_LINE #property indicator_color1 clrSilver #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot fall #property indicator_label2 "rise1" #property indicator_type2 DRAW_LINE #property indicator_color2 clrYellowGreen #property indicator_style2 STYLE_SOLID #property indicator_width2 2 //--- plot data #property indicator_label3 "fall1" #property indicator_type3 DRAW_LINE #property indicator_color3 clrCrimson #property indicator_style3 STYLE_SOLID #property indicator_width3 2 //--- plot fall #property indicator_label4 "rise2" #property indicator_type4 DRAW_LINE #property indicator_color4 clrYellowGreen #property indicator_style4 STYLE_SOLID #property indicator_width4 2 //--- plot data #property indicator_label5 "fall2" #property indicator_type5 DRAW_LINE #property indicator_color5 clrCrimson #property indicator_style5 STYLE_SOLID #property indicator_width5 2 //--- indicator buffers double rise1Buffer[],rise2[]; double fall1Buffer[],fall2[]; double dataBuffer[],riseIX[],fallIX[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,dataBuffer); SetIndexBuffer(1,rise1Buffer); SetIndexBuffer(2,fall1Buffer); SetIndexBuffer(3,rise2); SetIndexBuffer(4,fall2); SetIndexBuffer(5,riseIX);SetIndexStyle(5,DRAW_NONE,EMPTY,EMPTY,clrNONE); SetIndexBuffer(6,fallIX);SetIndexStyle(6,DRAW_NONE,EMPTY,EMPTY,clrNONE); SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); reset(); //--- return(INIT_SUCCEEDED); } void reset(){ ArrayFill(rise1Buffer,0,ArraySize(rise1Buffer),0.0); ArrayFill(fall1Buffer,0,ArraySize(fall1Buffer),0.0); ArrayFill(dataBuffer,0,ArraySize(dataBuffer),0.0); ArrayFill(rise2,0,ArraySize(rise2),0.0); ArrayFill(fall2,0,ArraySize(fall2),0.0); ArrayFill(riseIX,0,ArraySize(riseIX),0.0); ArrayFill(fallIX,0,ArraySize(fallIX),0.0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ 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 items=MathMin((rates_total-prev_calculated),rates_total-3); for(int i=items;i>=0;i--){ dataBuffer[i]=close[i]; riseIX[i]=riseIX[i+1]; fallIX[i]=fallIX[i+1]; //if data if(dataBuffer[i+1]!=EMPTY_VALUE) { //rise indicates a rise from the previous to this if(dataBuffer[i]>dataBuffer[i+1]){ riseIX[i]+=1.0; if(riseIX[i]==1.0){ rise1Buffer[i+1]=dataBuffer[i+1]; rise1Buffer[i]=dataBuffer[i]; }else{ rise2[i+1]=dataBuffer[i+1]; rise2[i]=dataBuffer[i]; riseIX[i]=0.0; } } //fall else if(dataBuffer[i]<dataBuffer[i+1]){ fallIX[i]+=1.0; if(fallIX[i]==1.0){ fall1Buffer[i+1]=dataBuffer[i+1]; fall1Buffer[i]=dataBuffer[i]; }else{ fall2[i+1]=dataBuffer[i+1]; fall2[i]=dataBuffer[i]; fallIX[i]=0.0; } } } } //--- return value of prev_calculated for next call return(rates_total); }
The issue starts when there are 3 sequential alternating rise or drops
like DROP , RISE , DROP
The indicator then correctly assumes it must connect the 2 drops which will occlude the rise if the drop plot is after the rise plot.
The solution is very ugly , unless i'm missing a DRAW type .
(i think it could be done with section if you smash the buffer following a drawn part with empty value , but i've not tested it.Absent any beautiful solutions the best course would be to have little balls on the data points and convey the indicators information by coloring them)
I did the same bro. Seems there is no solution.
There is always the canvas , but how would it understand that it must not connect the lines even there.
You could deploy a structure with in and out nodes so an out node of a data point cannot connect to another node .
The lines could only be drawn from in to out of the same type . I think a char would suffice for that . But , custom drawing
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
In order to implement two-colored line in MT4 custom indicators, I try to use two buffers, each with a different color.
the code looks something like this:
The problem is when color switches too fast(as fast as a different color for each consecutive index) the different color in between cannot be shown and one color dominates all.
Do you have a solution for this? I tried using double times buffers to solve this. Although it worked but I don't like making this so complicated.