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

 
gyfto Именно. Можно попробовать реинициализировать программным нажатием на кнопку "обновить" (которое используется в эмуляции тика), можно программной подзагрузкой шаблона с индикатором на каждом новом баре. Но, скорее всего, ни один из способов работать не будет, а будет перезаливаться весь индикаторный буфер целиком. Вечером присяду, накидаю, проверю, отпишусь.

 

  За дурною головою, и ногам (рукам) нема покою :)))
 
gyfto:

))) Обычно такое обращение только в милиции услышать можно)))

Именно. Можно попробовать реинициализировать программным нажатием на кнопку "обновить" (которое используется в эмуляции тика), можно программной подзагрузкой шаблона с индикатором на каждом новом баре. Но, скорее всего, ни один из способов работать не будет, а будет перезаливаться весь индикаторный буфер целиком. Вечером присяду, накидаю, проверю, отпишусь.

 

"Когда по Земле, еще тепленькой, бегали сначала мамонты, а потом слоны..." (с)

Можно ли изменять цвет линии в буфере индикатора в процессе его работы?

 
granit77:

задача не разрешима в принципе ибо: цвет задается не для бара а для всего буфера

Да, я сам к этому сейчас прихожу. Почему? Как это работает? Вот на эти вопросы я найти ответа не могу. Есть ли описание внутреннего формата индикаторного буфера? Это же не исполняемый код.
 
gyfto:
Да, я сам к этому сейчас прихожу. Почему? Как это работает? Вот на эти вопросы я найти ответа не могу. Есть ли описание внутреннего формата индикаторного буфера? Это же не исполняемый код.
как это относится к торговым стратегиям? теоретег :))) 
 

Вот по мотивам granit77 переделал OsMA:

//+------------------------------------------------------------------+
//|                                                         OsMA.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2004, MetaQuotes Software Corp."
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_width1  2
#include <stdlib.mqh>
//---- indicator parameters
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
extern double Staturation=1.0;//значение насыщенности
extern double Lightness=0.5;//значение светлоты
double Hue;//будет значением оттенка (по нему мы и идём по радуге)
bool up=true;
//---- indicator buffers
double     OsmaBuffer[];
double     MacdBuffer[];
double     SignalBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexDrawBegin(0,SignalSMA);
   IndicatorDigits(Digits+2);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,OsmaBuffer);
   SetIndexBuffer(1,MacdBuffer);
   SetIndexBuffer(2,SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
   return(0);
  }
  
int deinit() {Comment(" ");}

//+------------------------------------------------------------------+
//| Moving Average of Oscillator                                     |
//+------------------------------------------------------------------+
int start()
  {
   color RGB = HSLtoRGB(Hue/256, Staturation, Lightness);
   SetIndexStyle(0, DRAW_HISTOGRAM, EMPTY, EMPTY, RGB);
   if(up) Hue++; else Hue--;
   if((Hue==255.0)||(Hue==0.0)) up=!up;
   Comment("RGB="+IntegerToHexString(RGB)+"\n"+"Hue="+DoubleToStr(Hue/256,8));
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd counted in the 1-st additional buffer
   for(int i=0; i<limit; i++)
      MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd additional buffer
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);
//---- main loop
   for(i=0; i<limit; i++)
      OsmaBuffer[i]=MacdBuffer[i]-SignalBuffer[i];
//---- done
   return(0);
  }
//+------------------------------------------------------------------+

double Hue_To_RGB(double P,double Q,double Tc){
        if(Tc<0) Tc+=1.0;
        if(Tc>1.0) Tc-=1.0;
        if(Tc<1.0/6.0) return(P+(Q-P)*6.0*Tc);
        if(Tc<1.0/2.0) return(Q);
        if(Tc<2.0/3.0) return(P+(Q-P)*((2.0/3.0)-Tc)*6.0);
        return(P);
}

color HSLtoRGB(double aH,double aS,double aL){
        if(aS==0){
                int oR=aL*255;
                int oG=aL*255;
                int oB=aL*255;
        }else{
                double Q;
                if(aL<0.5) Q=aL*(1.0+aS); else Q=(aL+aS)-(aS*aL);
                double P=2.0*aL-Q;
                oR=255.0*Hue_To_RGB(P,Q,aH+(1.0/3.0));
                oG=255.0*Hue_To_RGB(P,Q,aH);
                oB=255.0*Hue_To_RGB(P,Q,aH-(1.0/3.0));
        }
        return(0x100*0x100*oB+0x100*oG+oR);
}

Гистограмма плавно с каждым тиком меняет цвет по радуге , гуляя по ней туда-сюда. Очень красиво, но совершенно бесполезно)))

Добавлено: изменил код, исправил одну ошибку. 

 

Какие-то нелады у вас в датском королевстве... Написал следующий скрипт для тестирования радуги по функциям для работы с цветом:

#property show_inputs
extern int n=1;//выбор цветовой модели: 1 - HSL, любая другая цифра - HSV
extern double Staturation=1.0;//значение насыщенности
extern double LightnessOrBrightness=0.5;//значение светлоты или яркости
extern double step=256;//шаг, точнее шаг будет равен 1/step
extern int h=60;//высота линий
extern int shift=0;//смещение по высоте
double Hue;//будет значением оттенка (по нему мы и идём по радуге)
int index;

int init(){}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   while(Hue<1.0){
          switch(n){
             case 1: color RGB = HSLtoRGB(Hue, Staturation, LightnessOrBrightness); break;//конвертируем цветовую модель HSL в цветовую модель RGB
             default: RGB = HSVtoRGB(Hue, Staturation, LightnessOrBrightness); break;//конвертируем цветовую модель HSL в цветовую модель RGB
          }
          string name=StringConcatenate("dash", shift, "-", Time[index]);//формируем имя линии по совету FAQ    
          ObjectCreate(name, OBJ_TREND, 0, Time[index], Close[0]+(shift-h)*Point, Time[index], Close[0]+(shift+h)*Point);//создаём OBJ_TREND длинной в толщину одной свечи
          ObjectSet(name, OBJPROP_COLOR, RGB);//и меняем цвет OBJ_TREND в зависимости от разности +DI и -DI
          ObjectSet(name, OBJPROP_STYLE, STYLE_SOLID);//а также выполняем следующие перестраховки: это сплошная линия (не пунктирная и прочее)
          ObjectSet(name, OBJPROP_WIDTH, 2);//также она имеет ширину 2 пикселя (как и обычная линия цены)
          ObjectSet(name, OBJPROP_RAY, false);//и нарисованная трендовая линия это не луч, а отрезок
          index++;
          Hue+=(1/step);
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
double Hue_To_RGB(double P,double Q,double Tc){
        if(Tc<0) Tc+=1.0;
        if(Tc>1.0) Tc-=1.0;
        if(Tc<1.0/6.0) return(P+(Q-P)*6.0*Tc);
        if(Tc<1.0/2.0) return(Q);
        if(Tc<2.0/3.0) return(P+(Q-P)*((2.0/3.0)-Tc)*6.0);
        return(P);
}

color HSLtoRGB(double aH,double aS,double aL){
        if(aS==0){
                int oR=aL*255;
                int oG=aL*255;
                int oB=aL*255;
        }else{
                double Q;
                if(aL<0.5) Q=aL*(1.0+aS); else Q=(aL+aS)-(aS*aL);
                double P=2.0*aL-Q;
                oR=255.0*Hue_To_RGB(P,Q,aH+(1.0/3.0));
                oG=255.0*Hue_To_RGB(P,Q,aH);
                oB=255.0*Hue_To_RGB(P,Q,aH-(1.0/3.0));
        }
        return(0x100*0x100*oB+0x100*oG+oR);
}

// Преобразование HSV в RGB
color HSVtoRGB(double aH,double aS,double aV){
        if(aS==0){
                int oR=aV*255.0;
                int oG=aV*255.0;
                int oB=aV*255.0;
        }else{
                int H_i=DoubleToInt(6.0*aH);
                if(H_i==6) H_i=0;
                double V_min=(1-aS)*aV;
                double a=(aV-V_min)*(6.0*aH-H_i);
                double V_inc=V_min+a;
                double V_dec=aV-a;
                double R,G,B;
                switch(H_i){
                        case 0:
                                R=aV;
                                G=V_inc;
                                B=V_min;
                                break;
                        case 1:
                                R=V_dec;
                                G=aV;
                                B=V_min;
                                break;
                        case 2:
                                R=V_min;
                                G=aV;
                                B=V_inc;
                                break;
                        case 3:
                                R=V_min;
                                G=V_dec;
                                B=aV;
                                break;
                        case 4:
                                R=V_inc;
                                G=V_min;
                                B=aV;
                                break;
                        default:
                                R=aV;
                                G=V_min;
                                B=V_dec;
                }
                oR=R*255.0;
                oG=G*255.0;
                oB=B*255.0;
        }
        return(0x100*0x100*oB+0x100*oG+oR);
}

int DoubleToInt(double var){return(var);}

Вышло следующее:

Верхний прямоугольник, со смещением 120 - это 0.5-0.5, а нижний со смещением 0 это 1.0-0.5 (Staturation/Lightness). К integer претензий никаких - в Википедии та же самая функция конвертации HSL2RGB, что и у него в библиотеке, а свой код я скопипастил у него. У радуги спектр разрывным быть не может. Значит, либо ошибка в Википедии (не такая это и новость, бывало), либо модель HSL с переменным Н не может использоваться для пробега по радуге. Разбирайтесь сами, я к этому исследованию больше не вернусь - времени жалко.

 

Нет, всё правильно: просто у integer там возвращался double, а здесь надо возвращать int. Но я mql5 не знаю, поэтому является ли в mql5 это ошибкой или нет, не в курсе. Выше исходник исправил. Вот что получается:

 

Вверху модель HSV, внизу HSL. Соответственно в OsMA там тоже надо аналогично поменять double на int.

Постскриптум. Я наверное больше никому помогать не буду. Обидно, знаете ли. Тут всю душу выложил, а автора темы, этого сорванца, и след простыл. 

 
gyfto:

Какие-то нелады у вас в датском королевстве... Написал следующий скрипт для тестирования радуги по функциям для работы с цветом:

Вышло следующее:

Верхний прямоугольник, со смещением 120 - это 0.5-0.5, а нижний со смещением 0 это 1.0-0.5 (Staturation/Lightness). К integer претензий никаких - в Википедии та же самая функция конвертации HSL2RGB, что и у него в библиотеке, а свой код я скопипастил у него. У радуги спектр разрывным быть не может. Значит, либо ошибка в Википедии (не такая это и новость, бывало), либо модель HSL с переменным Н не может использоваться для пробега по радуге. Разбирайтесь сами, я к этому исследованию больше не вернусь - времени жалко.

Значит ошибка в википедии, а я типа как мартышка перекодировал с ошибкой? 

"либо модель HSL с переменным Н не может использоваться для пробега по радуге"  - ага функция предначенная для этого самого, для этого самого не может использоваться. Блеск

Вот картинка: сверху функция HSLtoRGB, снизу HSVtoRGB.



 

Так у вас там double по ссылке передаётся, я и скопипастил как double. Вышел разрывной спектр. Потом поменял на int. Вышел цельный.

----

Я имею ввиду вот эти:

void HSLtoRGB(double aH,double aS,double aL,double  &oR,double  &oG,double  &oB)

 которые на oR, oG, oB.

 
gyfto:

Так у вас там double по ссылке передаётся, я и скопипастил как double. Вышел разрывной спектр. Потом поменял на int. Вышел цельный.

----

Я имею ввиду вот эти:

 которые на oR, oG, oB.



Может хватит нести чушь?
Причина обращения: