Исправление индикатора MACD

  • Автор темы Автор темы Andersen
  • Дата начала Дата начала

Andersen

Новичок форума
Здравствуйте
Уважаемые трейдеры-программисты, помогите исправить стандартный MACD-гистограмму в МТ4. Хочется сделать подобно индикаторам известного б.вилиьмса АО и АС, каждый повыщающийся столбец гистограммы (значения по модулю) был зеленного цвета, а понижающийся (значения по модулю) красного. Если таковой измененый MACD существует подскажите где его можно взять.

Заранее спасибо
 

Василий Петрович

Новичок форума
"...Если таковой измененый MACD существует подскажите где его можно взять..."

Существует!!!
АО и АС - это MACD_color и OSMA_color соотвенно.

Получите. Распишитесь.:-)
 

Вложения

sumotori

Интересующийся
Здравствуйте, Вы не знаете случайно кто может исправить индикатор что бы он не перерисовывал?
 

Василий Петрович

Новичок форума
... кто может исправить индикатор что бы он не перерисовывал?

Вы сами и сможете это сделать :-)
Чтобы индикатор не перерисовывался, нужно задать его по ценам открытия (open)
МАКД будет перерисовываться всегда на последнем баре (как впрочем и любой индикатор), если он построен по ценам закрытия (close). Посудите сами - каждое новое значение цены закрытия должно учитываться индикатором. Так что единственный выход - цена открытия - она, как понятно, задается в самом начале построения бара, и ничего уже точно перерисовываться не будет.
 

sumotori

Интересующийся
И еще один вопрос, если можно, извиняюсь за безграмотность, а как с этим индикатором быть, не подскажите.:

//+--------------------------------------------------------------------------------+
//| Float.mq4 |
//| Copyright © 2005 Barry Stander [email protected] |
//| _http://www.4Africa.net/4meta/ |
//| Float |
//+--------------------------------------------------------------------------------+

#property copyright "Float converted from MT3 to MT4"
#property link "_http://www.4Africa.net/4meta/"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

// Var //////////////////////////////////////////////////////////////
extern int float=200,use_fibos=1,Backtesting=0;
string short_name;

double f,c1,high_bar,Low_bar,bars_high,bars_low;
double cumulativeV,FLOATV,cumulativeV2,loopbegin2,swing;
double swingv,loopbegin1,cnt,prevbars;
double newcv,CV,CV2;
double fib23,fib38,fib50,fib62,fib76;
double dinap0,dinap1,dinap2,dinap3,dinap4,dinap5;
double CVL,CVL1,CVL2,CVL3,CVL4;
double Buffer1[];
double Buffer2[];

bool first = true , first1 = true;

int shift,swing_time;
int cvstart,cvend,bar;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);

ObjectDelete("swingtop");
ObjectDelete("swingbottom");

ObjectDelete( "fib23" );
ObjectDelete( "fib38" );
ObjectDelete( "fib50" );
ObjectDelete( "fib62" );
ObjectDelete( "fib76" );

ObjectDelete( "fib23t" );
ObjectDelete( "fib38t" );
ObjectDelete( "fib50t" );
ObjectDelete( "fib62t" );
ObjectDelete( "fib76t" );

ObjectDelete( "dinap0" );
ObjectDelete( "dinap1" );
ObjectDelete( "dinap2" );
ObjectDelete( "dinap3" );
ObjectDelete( "dinap4" );
ObjectDelete( "dinap5" );

ObjectDelete("CVSTART");
ObjectDelete("CVEND");
ObjectDelete("swingend");
ObjectDelete("swingend2");
ObjectDelete("swingend3");
ObjectDelete("swingend4");
ObjectDelete("swingend5");
ObjectDelete("swingend6");
ObjectDelete("swingend7");
ObjectDelete("swingend8");
ObjectDelete("swingend9");

short_name="Float";
IndicatorShortName(short_name);
SetIndexLabel(0,short_name);

SetIndexStyle(0,DRAW_HISTOGRAM );
SetIndexBuffer(0,Buffer1);
SetIndexDrawBegin(0,1000);

SetIndexStyle(1,DRAW_LINE );
SetIndexBuffer(1,Buffer2);
SetIndexDrawBegin(1,1000);

return(0);
}

//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+

int deinit()
{

ObjectDelete("swingtop");
ObjectDelete("swingbottom");

ObjectDelete( "fib23" );
ObjectDelete( "fib38" );
ObjectDelete( "fib50" );
ObjectDelete( "fib62" );
ObjectDelete( "fib76" );

ObjectDelete( "fib23t" );
ObjectDelete( "fib38t" );
ObjectDelete( "fib50t" );
ObjectDelete( "fib62t" );
ObjectDelete( "fib76t" );

ObjectDelete( "dinap0" );
ObjectDelete( "dinap1" );
ObjectDelete( "dinap2" );
ObjectDelete( "dinap3" );
ObjectDelete( "dinap4" );
ObjectDelete( "dinap5" );

ObjectDelete("CVSTART");
ObjectDelete("CVEND");
ObjectDelete("swingend");
ObjectDelete("swingend2");
ObjectDelete("swingend3");
ObjectDelete("swingend4");
ObjectDelete("swingend5");
ObjectDelete("swingend6");
ObjectDelete("swingend7");
ObjectDelete("swingend8");
ObjectDelete("swingend9");

Comment("");
return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+


int start()
{

int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1); // Exit if na data

cumulativeV=0;
cumulativeV2=0;
int SetLoopCount=0;

if( Bars < prevbars || Bars-prevbars>1 ) //If 1
{
first = True;
first1 = True;
prevbars = Bars;
FLOATV=0;

if( first ) //if 2
{
loopbegin1 = Bars-float-1;
loopbegin2 = Bars-float-1;
first = False;

loopbegin1 = loopbegin1+1;

for( shift=loopbegin1;shift>=0;shift--) // for 1
{

//find high and low
high_bar = High[Highest(NULL,0,MODE_HIGH,float,1)];
Low_bar = Low[Lowest(NULL,0,MODE_LOW,float,1)];

//find bar counts
bars_high = Highest(NULL,0,MODE_HIGH,float,1);
bars_low = Lowest(NULL,0,MODE_LOW,float,1);

//find swing price differance
swing = High[Highest(NULL,0,MODE_HIGH,float,1)] - Low[Lowest(NULL,0,MODE_LOW,float,1)];

//find float time barcount
swing_time = MathAbs(bars_low-bars_high);

//find cumulative volume for float period
if( bars_high < bars_low )
{
cvstart=bars_low;
cvend=bars_high;
}
else
{
cvstart=bars_high;
cvend=bars_low;
}

if( first1 && FLOATV == 0 ) // if 3
{

for( shift=cvstart;shift>=cvend;shift--)
{
FLOATV=FLOATV+Volume[shift];
first1 = False;}
}

}

//find cumulative volume since last turnover
for( shift=cvstart;shift>=0;shift--) // for 2
{
cumulativeV=cumulativeV+Volume[shift];

if( cumulativeV >= FLOATV )
{
cumulativeV=0;
}

Buffer1[shift] = cumulativeV*0.001; //Blue
Buffer2[shift] = FLOATV*0.001; //Red

Comment(
"\n","high was ",bars_high," bars ago",
"\n","Low was ",bars_low," bars ago","\n",
"\n","Float time was = ", swing_time," bars",
"\n","Float Vol. left = ",FLOATV-cumulativeV,
"\n","Float Volume = ",FLOATV);
ObjectDelete("swingtop");
ObjectCreate("swingtop", OBJ_TREND , 0, Time[cvstart],high_bar,Time[1],high_bar);
ObjectSet("swingtop" , OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("swingtop" , OBJPROP_COLOR , Blue );
ObjectSet("swingtop" , OBJPROP_RAY , 0 );
ObjectSet("swingtop" , OBJPROP_WIDTH , 1 );

ObjectDelete("swingbottom");
ObjectCreate("swingbottom", OBJ_TREND , 0, Time[cvstart],Low_bar,Time[1],Low_bar);
ObjectSet("swingbottom" , OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("swingbottom" , OBJPROP_COLOR , Blue );
ObjectSet("swingbottom" , OBJPROP_RAY , 0 );
ObjectSet("swingbottom" , OBJPROP_WIDTH , 1 );

//fibos
if( use_fibos == 1 )
{
ObjectDelete( "fib23" );
ObjectDelete( "fib38" );
ObjectDelete( "fib50" );
ObjectDelete( "fib62" );
ObjectDelete( "fib76" );

ObjectDelete( "dinap0" );
ObjectDelete( "dinap1" );
ObjectDelete( "dinap2" );
ObjectDelete( "dinap3" );
ObjectDelete( "dinap4" );
ObjectDelete( "dinap5" );

fib23=((high_bar-Low_bar)*0.236)+Low_bar;
fib38=((high_bar-Low_bar)*0.382)+Low_bar;
fib50=((high_bar-Low_bar)/2)+Low_bar;
fib62=((high_bar-Low_bar)*0.618)+Low_bar;
fib76=((high_bar-Low_bar)*0.764)+Low_bar;
dinap0=(Low_bar+fib23)/2;
dinap1=(fib23+fib38)/2;
dinap2=(fib38+fib50)/2;
dinap3=(fib50+fib62)/2;
dinap4=(fib62+fib76)/2;
dinap5=(high_bar+fib76)/2;

ObjectCreate("fib23", OBJ_TREND , 0, Time[cvstart],fib23,Time[1],fib23 );
ObjectSet("fib23" , OBJPROP_STYLE, STYLE_DASH );
ObjectSet("fib23" , OBJPROP_COLOR , Green );
ObjectSet("fib23" , OBJPROP_RAY , 0 );
ObjectSet("fib23" , OBJPROP_WIDTH , 1 );
ObjectCreate("fib23t", OBJ_TEXT , 0, Time[1],fib23 );
ObjectSetText("fib23t" , "23.6", 8 , "Arial", Green);

ObjectCreate("fib38", OBJ_TREND , 0, Time[cvstart],fib38,Time[1],fib38 );
ObjectSet("fib38" , OBJPROP_STYLE, STYLE_DASH );
ObjectSet("fib38" , OBJPROP_COLOR , Green );
ObjectSet("fib38" , OBJPROP_RAY , 0 );
ObjectSet("fib38" , OBJPROP_WIDTH , 1 );
ObjectCreate("fib38t", OBJ_TEXT , 0, Time[1],fib38 );
ObjectSetText("fib38t" , "38.2", 8 , "Arial", Green);

ObjectCreate("fib50", OBJ_TREND , 0, Time[cvstart],fib50,Time[1],fib50 );
ObjectSet("fib50" , OBJPROP_STYLE, STYLE_SOLID );
ObjectSet("fib50" , OBJPROP_COLOR , Red );
ObjectSet("fib50" , OBJPROP_RAY , 0 );
ObjectSet("fib50" , OBJPROP_WIDTH , 2 );
ObjectCreate("fib50t", OBJ_TEXT , 0, Time[1],fib50 );
ObjectSetText("fib50t" , "50", 8 , "Arial", Green);

ObjectCreate("fib62", OBJ_TREND , 0, Time[cvstart],fib62,Time[1],fib62 );
ObjectSet("fib62" , OBJPROP_STYLE, STYLE_DASH );
ObjectSet("fib62" , OBJPROP_COLOR , Green );
ObjectSet("fib62" , OBJPROP_RAY , 0 );
ObjectSet("fib62" , OBJPROP_WIDTH , 1 );
ObjectCreate("fib62t", OBJ_TEXT , 0, Time[1],fib62 );
ObjectSetText("fib62t" , "61.8", 8 , "Arial", Green);

ObjectCreate("fib76", OBJ_TREND , 0, Time[cvstart],fib76,Time[1],fib76 );
ObjectSet("fib76" , OBJPROP_STYLE, STYLE_DASH );
ObjectSet("fib76" , OBJPROP_COLOR , Green );
ObjectSet("fib76" , OBJPROP_RAY , 0 );
ObjectSet("fib76" , OBJPROP_WIDTH , 1 );
ObjectCreate("fib76t", OBJ_TEXT , 0, Time[1],fib76 );
ObjectSetText("fib76t" , "76.4", 8 , "Arial", Green);

ObjectCreate("dinap0", OBJ_TREND , 0, Time[cvstart],dinap0,Time[1],dinap0 );
ObjectSet("dinap0" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap0" , OBJPROP_COLOR , Red );
ObjectSet("dinap0" , OBJPROP_RAY , 0 );
ObjectSet("dinap0" , OBJPROP_WIDTH , 1 );

ObjectCreate("dinap1", OBJ_TREND , 0, Time[cvstart],dinap1,Time[1],dinap1 );
ObjectSet("dinap1" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap1" , OBJPROP_COLOR , Red );
ObjectSet("dinap1" , OBJPROP_RAY , 0 );
ObjectSet("dinap1" , OBJPROP_WIDTH , 1 );

ObjectCreate("dinap2", OBJ_TREND , 0, Time[cvstart],dinap2,Time[1],dinap2 );
ObjectSet("dinap2" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap2" , OBJPROP_COLOR , Red );
ObjectSet("dinap2" , OBJPROP_RAY , 0 );
ObjectSet("dinap2" , OBJPROP_WIDTH , 1 );

ObjectCreate("dinap3", OBJ_TREND , 0, Time[cvstart],dinap3,Time[1],dinap3 );
ObjectSet("dinap3" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap3" , OBJPROP_COLOR , Red );
ObjectSet("dinap3" , OBJPROP_RAY , 0 );
ObjectSet("dinap3" , OBJPROP_WIDTH , 1 );

ObjectCreate("dinap4", OBJ_TREND , 0, Time[cvstart],dinap4,Time[1],dinap4 );
ObjectSet("dinap4" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap4" , OBJPROP_COLOR , Red );
ObjectSet("dinap4" , OBJPROP_RAY , 0 );
ObjectSet("dinap4" , OBJPROP_WIDTH , 1 );

ObjectCreate("dinap5", OBJ_TREND , 0, Time[cvstart],dinap5,Time[1],dinap5 );
ObjectSet("dinap5" , OBJPROP_STYLE, STYLE_DOT );
ObjectSet("dinap5" , OBJPROP_COLOR , Red );
ObjectSet("dinap5" , OBJPROP_RAY , 0 );
ObjectSet("dinap5" , OBJPROP_WIDTH , 1 );

}
else
{
ObjectDelete( "fib23" );
ObjectDelete( "fib38" );
ObjectDelete( "fib50" );
ObjectDelete( "fib62" );
ObjectDelete( "fib76" );

ObjectDelete( "dinap0" );
ObjectDelete( "dinap1" );
ObjectDelete( "dinap2" );
ObjectDelete( "dinap3" );
ObjectDelete( "dinap4" );
ObjectDelete( "dinap5" );
}

//vert. float lines. these draw the lines that calculate the float
//if you change "trendline" to "Vline" it will draw through oscillators too.might be fun
ObjectDelete("CVSTART");
ObjectCreate("CVSTART", OBJ_TREND , 0, Time[cvstart],high_bar,Time[cvstart],Low_bar*Point);
ObjectSet("CVSTART" , OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("CVSTART" , OBJPROP_COLOR , Blue );
ObjectSet("CVSTART" , OBJPROP_RAY , 0 );
ObjectSet("CVSTART" , OBJPROP_WIDTH , 1 );

ObjectDelete("CVEND");
ObjectCreate("CVEND", OBJ_TREND , 0, Time[cvend],high_bar,Time[cvend],Low_bar*Point);
ObjectSet("CVEND" , OBJPROP_STYLE, STYLE_SOLID);
ObjectSet("CVEND" , OBJPROP_COLOR , Blue );
ObjectSet("CVEND" , OBJPROP_RAY , 0 );
ObjectSet("CVEND" , OBJPROP_WIDTH , 1 );

//vert float predictions. These are only time based.
//see blue histogram for real float values.
//if you change "trendline" to "Vline" it will draw through oscillators too.might be fun
if ( cvend-swing_time > 0 )
{
ObjectDelete("swingend");
ObjectCreate("swingend", OBJ_TREND , 0, Time[(cvend-swing_time)+5],high_bar,Time[cvend-swing_time+5],Low_bar);
ObjectSet("swingend" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend" , OBJPROP_COLOR , Red );
ObjectSet("swingend" , OBJPROP_RAY , 0 );
ObjectSet("swingend" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend");


if( cvend-(swing_time*2)>0 )
{
ObjectDelete("swingend2");
ObjectCreate("swingend2", OBJ_TREND , 0, Time[(cvend-(swing_time*2))+5],high_bar,Time[cvend-(swing_time*2)+5],Low_bar);
ObjectSet("swingend2" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend2" , OBJPROP_COLOR , Red );
ObjectSet("swingend2", OBJPROP_RAY , 0 );
ObjectSet("swingend2" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend2");


if( cvend-(swing_time*3)>0 )
{
ObjectDelete("swingend3");
ObjectCreate("swingend3", OBJ_TREND , 0, Time[(cvend-(swing_time*3))+5],high_bar,Time[cvend-(swing_time*3)+5],Low_bar);
ObjectSet("swingend3" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend3" , OBJPROP_COLOR , Red );
ObjectSet("swingend3", OBJPROP_RAY , 0 );
ObjectSet("swingend3" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend3");

if( cvend-(swing_time*4)>0 )
{
ObjectDelete("swingend4");
ObjectCreate("swingend4", OBJ_TREND , 0, Time[(cvend-(swing_time*4))+5],high_bar,Time[cvend-(swing_time*4)+5],Low_bar);
ObjectSet("swingend4" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend4" , OBJPROP_COLOR , Red );
ObjectSet("swingend4", OBJPROP_RAY , 0 );
ObjectSet("swingend4" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend4");

if( cvend-(swing_time*5)>0 )
{
ObjectDelete("swingend5");
ObjectCreate("swingend5", OBJ_TREND , 0, Time[(cvend-(swing_time*5))+5],high_bar,Time[cvend-(swing_time*5)+5],Low_bar);
ObjectSet("swingend5" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend5" , OBJPROP_COLOR , Red );
ObjectSet("swingend5", OBJPROP_RAY , 0 );
ObjectSet("swingend5" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend5");

if( cvend-(swing_time*6)>0 )
{
ObjectDelete("swingend6");
ObjectCreate("swingend6", OBJ_TREND , 0, Time[cvend-(swing_time*6)+5],high_bar,Time[cvend-(swing_time*6)+5],Low_bar);
ObjectSet("swingend6" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend6" , OBJPROP_COLOR , Red );
ObjectSet("swingend6", OBJPROP_RAY , 0 );
ObjectSet("swingend6" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend6");

if( cvend-(swing_time*7)>0 )
{
ObjectDelete("swingend7");
ObjectCreate("swingend7", OBJ_TREND , 0, Time[cvend-(swing_time*7)+5],high_bar,Time[cvend-(swing_time*7)+5],Low_bar);
ObjectSet("swingend7" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend7" , OBJPROP_COLOR , Red );
ObjectSet("swingend7", OBJPROP_RAY , 0 );
ObjectSet("swingend7" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend7");

if( cvend-(swing_time*8)>0 )
{
ObjectDelete("swingend8");
ObjectCreate("swingend8", OBJ_TREND , 0, Time[cvend-(swing_time*8)+5],high_bar,Time[cvend-(swing_time*8)+5],Low_bar);
ObjectSet("swingend8" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend8" , OBJPROP_COLOR , Red );
ObjectSet("swingend8", OBJPROP_RAY , 0 );
ObjectSet("swingend8" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend8");

if( cvend-(swing_time*9)>0 )
{
ObjectDelete("swingend9");
ObjectCreate("swingend9", OBJ_TREND , 0, Time[cvend-(swing_time*9)+5],high_bar,Time[cvend-(swing_time*9)+5],Low_bar);
ObjectSet("swingend9" , OBJPROP_STYLE, STYLE_DOT);
ObjectSet("swingend9" , OBJPROP_COLOR , Red );
ObjectSet("swingend9", OBJPROP_RAY , 0 );
ObjectSet("swingend9" , OBJPROP_WIDTH , 1 );
}
else ObjectDelete("swingend9");



//comment out anything you"re not using it will help with speed.
if( Backtesting == 1 )
{
GlobalVariableSet("fib23",fib23);
GlobalVariableSet("fib38",fib38);
GlobalVariableSet("fib50",fib50);
GlobalVariableSet("fib62",fib62);
GlobalVariableSet("fib76",fib76);
GlobalVariableSet("dinap0",dinap0);
GlobalVariableSet("dinap1",dinap1);
GlobalVariableSet("dinap2",dinap2);
GlobalVariableSet("dinap3",dinap3);
GlobalVariableSet("dinap4",dinap4);
GlobalVariableSet("dinap5",dinap5);
GlobalVariableSet("swingtop",high_bar);
GlobalVariableSet("swingbottom",Low_bar);
GlobalVariableSet("CVSTART",cvstart);
GlobalVariableSet("CVEND",cvend);
GlobalVariableSet("FLOATV",FLOATV);
GlobalVariableSet("cumulativeV",cumulativeV);
GlobalVariableSet("swing_time",swing_time);
GlobalVariableSet("bars_high",bars_high);
GlobalVariableSet("bars_low",bars_low);

if( cvend-swing_time>0 )
GlobalVariableSet("swingend",(cvend-swing_time)+5);

if( cvend-(swing_time*2)>0 )
GlobalVariableSet("swingend2",cvend-(swing_time*2)+5);

if( cvend-(swing_time*3)>0 )
GlobalVariableSet("swingend3",cvend-(swing_time*3)+5);

if( cvend-(swing_time*4)>0 )
GlobalVariableSet("swingend4",cvend-(swing_time*4)+5);

if( cvend-(swing_time*5)>0 )
GlobalVariableSet("swingend5",cvend-(swing_time*5)+5);

if( cvend-(swing_time*6)>0 )
GlobalVariableSet("swingend6",cvend-(swing_time*6)+5);

if( cvend-(swing_time*7)>0 )
GlobalVariableSet("swingend7",cvend-(swing_time*7)+5);

if( cvend-(swing_time*8)>0 )
GlobalVariableSet("swingend8",cvend-(swing_time*8)+5);

if( cvend-(swing_time*9)>0 )
GlobalVariableSet("swingend9",cvend-(swing_time*9)+5);

} // end Backtesting


}
}
}
return(0);
}
 
Верх