Скачать MetaTrader 5

Плавное изменения цвета по ADX ..КАК ето реализовать ??

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
OGRE
78
OGRE  
Благодарью всем кто ответит !! Как написать ПЛАВНОЕ  изменение цвета по значению ADX  ? что-то на подобие  ..COLOR=цвет(12432) +ADX[i]
gyfto
251
gyfto  
Саму линию индикатора не знаю. OBJ_ARROW можно. И нечего плодить темы, есть вроде ветка для всех случаев. А с OBJ_ARROW описываешь color как функцию RGB от функции ADX.
Dmitry Fedoseev
47145
Dmitry Fedoseev  
Цвет надо разлагать на HLS, увеличивать номер оттенка (или яркость), преобразовывать назад. См. на пятом форуме в кодобазе есть мои коды по преобразованию цвета.
Dmitry Fedoseev
47145
Dmitry Fedoseev  
gyfto
251
gyfto  
Да, не RGB, а HSL, и изменяем значение H от 0 до 360 градусов в зависимости от значения ADX при постоянном S и L, а пoтом конвертируем в RGB. Но я так понял, что ему не актуально, хоть HSV, хоть HSL, и то и то катит. Вот ещё посмотрите в кодоперепалке между MetaDriver и Urain.
gyfto
251
gyfto  
И всё-таки, Integer, HSLtoRGB или HSVtoRGB? Правильно ли я понимаю, что для данной задачи не будет никакой разницы, или я не понимаю их различия?
OGRE
78
OGRE  

Спосибо ВСЕМ ..Побробую разобраться ..

OGRE
78
OGRE  
НЕ выходит ....!!!!! можно примерчик .. .что и куда вставлять  ,прописывать,обьявлять итд .итп ...
Рустам
3623
Рустам  
Значение цвета ЧЕГО ????
OGRE
78
OGRE  
например . ма ....по значению ADX    ....... COLOR=цвет(12432) +ADX[i]
gyfto
251
gyfto  
#property indicator_chart_window

extern int limit=360;//ширина окна свечей
extern int periodADX=14;
extern double Staturation=1.0;//максимальное значение насыщенности
extern double Lightness=1.0;//максимальное значение светлоты
int iDash=1;//текущий номер черты; объявляется на глобальном уровне, меняется тоже на глобальном уровне изнутри функции ColorDash()
int CountedBars;

int init(){
        for(int i=limit; i<=0; i--) ColorDash(i, iDash);//в инициализации прорисовываем на всё наше окно свечей
        CountedBars=Bars-1;
}

int deinit(){
        for(int i=limit; i<=0; i--) ObjectDelete(StringConcatenate("dashADX", i));//в деинициализации также в цикле удаляем все OBJ_TREND
}

int start(){//в старте
   if(CountedBars!=Bars-1){//как появилась новая свеча на графике
                ObjectDelete(StringConcatenate("dashADX", iDash));//сначала удаляем OBJ_TREND в конце окна свечей с номером iDash (которая меняется на глобальном уровне, повторяюсь)
                ColorDash(0, iDash);//а затем только рисуем OBJ_TREND с тем же номером iDash, только в начале окна свечей
                CountedBars=Bars-1;//и запоминаем новое значение общего количества баров на чарте
        }
}

void ColorDash(int index, int& iDash){//два параметра - номер бара, который всегда равен 0 в старте и пробегается в цикле в init(), и iDash, который передаётся ПО ССЫЛКЕ
        double Hue = iADX(NULL, 0, periodADX, PRICE_CLOSE, MODE_PLUSDI, 0) - iADX(NULL, 0, periodADX, PRICE_CLOSE, MODE_MINUSDI, 0);//получаем разницу +DI и -DI
        //NB! каждый отдельно меняется от 0 до 100, т.е. их разница меняется от -100 (0 минус 100) до +100 (100 минус 0)
        Hue = (Hue+100)/2;//область допустимых значений +100...-100 (т.е. от 100-0 до 0-100) переводим в О.Д.З. +100...0
        Hue = Hue/100;//и дальше переводим в О.Д.З. 0.0...1.0
        color RGB = HSLtoRGB(Hue, Staturation, Lightness);
        if(iDash!=limit) iDash++; else iDash=0;//инкрементируем на каждом обращении iDash до тех пор, пока не выходим за ширину окна
        ObjectCreate(StringConcatenate("dashADX", iDash), OBJ_TREND, 0, Close[index], Time[index], Close[index+1], Time[index+1]);//создаём OBJ_TREND длинной в толщину одной свечи
        ObjectSet(StringConcatenate("dashADX", iDash), OBJPROP_COLOR, RGB);//и меняем цвет OBJ_TREND в зависимости от разности +DI и -DI
}

double Hue_To_RGB(double v1,double v2,double vH){
        if(vH<0) vH+=1.0;
        if(vH>1.0) vH-=1;
        if((6.0*vH)<1.0) return(v1+(v2-v1)*6.0*vH);
        if((2.0*vH)<1.0) return(v2);
        if((3.0*vH)<2.0) return(v1+(v2-v1)*((2.0/3.0)-vH)*6.0);
        return(v1);
}

color HSLtoRGB(double aH,double aS,double aL){
        if(aS==0){
                double oR=aL*255;
                double oG=aL*255;
                double oB=aL*255;
        }else{
                double var_2;
                if(aL<0.5) var_2=aL*(1.0+aS); else var_2=(aL+aS)-(aS*aL);
                double var_1=2.0*aL-var_2;
                oR=255.0*Hue_To_RGB(var_1,var_2,aH+(1.0/3.0));
                oG=255.0*Hue_To_RGB(var_1,var_2,aH);
                oB=255.0*Hue_To_RGB(var_1,var_2,aH-(1.0/3.0));
        }
        return(0x10000*oB+0x100*oG+oR);
}
Как-то так чтоли? Не, сейчас ничё не рисует, надо разбираться ещё почему.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий