Коллега, я тут проходил мимо, скачал вашего робота, потестировать предложенную систему, но уж больно медленно он тестируется из-за обращения к индикатору через iCustom. Потом вспомнил, что делал расчёт значений индикатора BetterVolume в самом советнике в виде обычной функции. Я для себя изменил код вашего советника, скорость тестирования выросла в 5-6 раз. Счёл нужным поделиться с вами кодом.
[CODE lang="clike" title="Better Volume x.x"]//+------------------------------------------------------------------+
//| Функция принимает переменные red,yellow,green,white,magenta |
//| и записывает в них значения столбцов соответствующего цвета |
//| индикатора BeterVolume |
//| look_back - расчётный период индикатора |
//| bar - номер свечи, для которой рассчитывается значение индикатора|
//+------------------------------------------------------------------+
void GetBetterVolume(int look_back,int bar,double &red,double &yellow,double &green,double &white,double &magenta)
{
double Range,Value2=0,Value3=0,HiValue2=0,HiValue3=0,LoValue3=FLT_MAX,tempv2=0,tempv3=0;
red=0;
yellow=0;
green=0;
white=0;
magenta=0;
MqlRates rates[];
ArraySetAsSeries(rates,true);
if(CopyRates(_Symbol,_Period,bar,look_back,rates)<=0)
return;
Range=rates[0].high-rates[0].low;
Value2=rates[0].tick_volume*Range;
long min_volume=LONG_MAX;
for(int j=0; j<look_back; j++)
{
if(rates[j].tick_volume<min_volume)
min_volume=rates[j].tick_volume;
tempv2=rates[j].tick_volume*(rates[j].high-rates[j].low);
if(NormalizeDouble(tempv2,_Digits)>=NormalizeDouble(HiValue2,_Digits))
HiValue2=tempv2;
if(NormalizeDouble(rates[j].tick_volume*(rates[j].high-rates[j].low),_Digits)!=0)
{
double hl=rates[j].high-rates[j].low;
if(NormalizeDouble(hl,_Digits)!=0)
tempv3=rates[j].tick_volume/hl;
if(tempv3>HiValue3)
HiValue3=tempv3;
if(tempv3<LoValue3)
LoValue3=tempv3;
}
}
if(rates[0].tick_volume==min_volume)
yellow=double(min_volume);
if(NormalizeDouble(Value2,_Digits)==NormalizeDouble(HiValue2,_Digits) &&
rates[0].close>(rates[0].high+rates[0].low)/2.0)
red=double(rates[0].tick_volume); // Climax High
if(NormalizeDouble(Value3,_Digits)==NormalizeDouble(HiValue3,_Digits))
green=double(rates[0].tick_volume);
if(NormalizeDouble(Value2,_Digits)==NormalizeDouble(HiValue2,_Digits)
&& NormalizeDouble(Value3,_Digits)==NormalizeDouble(HiValue3,_Digits))
magenta=double(rates[0].tick_volume);
if(NormalizeDouble(Value2,_Digits)==NormalizeDouble(HiValue2,_Digits) &&
rates[0].close<=NormalizeDouble((rates[0].high+rates[0].low)/2.0,_Digits))
white=double(rates[0].tick_volume); // Climax Low
}
[/CODE]
Использование
C-подобный:
double red[2],white[2];
//red[0] = iCustom(NULL,0,"bettervolume1.4",0,"",ind_MAPeriod,ind_LookBack,0, i);
//red[1] = iCustom(NULL,0,"bettervolume1.4",0,"",ind_MAPeriod,ind_LookBack,0, i+1);
//white[0] = iCustom(NULL,0,"bettervolume1.4",0,"",ind_MAPeriod,ind_LookBack,4, i);
//white[1] = iCustom(NULL,0,"bettervolume1.4",0,"",ind_MAPeriod,ind_LookBack,4, i+1);
GetBetterVolume(ind_LookBack,i,red[0],yl,gr,white[0],mg);
GetBetterVolume(ind_LookBack,i+1,red[1],yl,gr,white[1],mg);