Что можно сделать с чартом терминала? Поджарить!

 

Вот простенький индикатор, который можно набросить на чарт и посмотреть.


Файлы:
Flame.ex5  20 kb
 
Renat:

Вот простенький индикатор, который можно набросить на чарт и посмотреть.


:-)


 
Renat:

Вот простенький индикатор, который можно набросить на чарт и посмотреть.

На холсте (canvas) можно уже даже пейзажи нарисовать и установить в качестве фона подогнав чётко по размеру графика. ))
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 

Создадим помехи на чарте терминала. ))



 
Полезно было бы реализовать графику, отвязанную по горизонтали от баров, в отдельном окне индикатора, чтобы были как опция обычные координаты и возможность перестройки изображения(без сдвига влево) по новому тику, новому бару, таймеру или по команде.
 
Renat:

Вот простенький индикатор, который можно набросить на чарт и посмотреть.

В исходнике было бы нагляднее )).
 

Renat:
Вот простенький индикатор, который можно набросить на чарт и посмотреть.

Чем ближе к Margin Call, тем выше пламя :))
 
Contender:
Чем ближе к Margin Call, тем выше пламя :))

Интересная идея! Индикатор поощрения-наказания трейдера:)) Вариаций масса, ядро идеи что в зависимости от дифференциала эквити, его гладкости и тп. раскраска элементов и фон меняется от умиляющих взгляд, до страшаще-агресивных, при приближении к мержинколу начинается совсем трешак. 


 
kPVT:
В исходнике было бы нагляднее )).

Да пожалуйста:

//+------------------------------------------------------------------+
//| Оставим место для работы пользовательского скрипта и эксперта    |
//+------------------------------------------------------------------+
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Определим высоту картинки (наше пламя не высокое)                |
//+------------------------------------------------------------------+
#define SCREEN_CY 200
//+------------------------------------------------------------------+
//| Необходимые для работы глобальные переменные                     |
//+------------------------------------------------------------------+
uint    ExtPal[256];             // палитра пламени
uint    ExtScreen[];             // буфер для вывода в ресурс   
uchar   ExtFlame[][SCREEN_CY+1]; // буфер для расчёта пламени
uint    ExtTime=0;               // время наступления следующего события         
long    ExtChartID=0;            // ID нашего чарта
uint    ExtWidth=0;              // ширина картинки пламени
uint    ExtY=0;                  // Точка для привязки нашего пламени к низу
//+------------------------------------------------------------------+
//| Инициализация                                                    |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- запоминаем ID чарта и создаём графический объект с привязкой к ресурсу
   ExtChartID=ChartID();
   ObjectCreate(ExtChartID,"flame",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetString(ExtChartID,"flame",OBJPROP_BMPFILE,"::flame");
//--- создадим палитру
   double g=0,b=0,dg=1.5,db=0.63;
//---
   for(uint a,i=0;i<256;i++)
     {
      //--- первые 32 значения пламени полностью прозрачны
      a=uchar(i<32?0:i-32);
      //--- вормируем цвет для значения пламени i
      ExtPal[i]=(a<<24)|(uint(255)<<16)|(uint(g+0.5)<<8)|uint(b+0.5);
      //--- инкрементируем компоненты цвета
      //--- красный получает градацию за счёт прозрачности цвета
      if(i>80)  g+=dg;
      if(i>160) b+=db;
     }
//--- определим размеры чарта и выведем первый кадр
   Resize();
//--- организуем свой таймер, при OnTimer от 1 раза в секунду маловато
   EventChartCustom(ExtChartID,1302,0,0,NULL);
  }
//+------------------------------------------------------------------+
//| Удаление                                                         |
//+------------------------------------------------------------------+
void OnDeinit(const int)
  {
   ObjectDelete(ExtChartID,"flame");
  }
//+------------------------------------------------------------------+
//| Ничего не рассчитываем                                           |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double& price[])
  {
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Обработка событий                                                |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long& lp,const double& dp,const string& sp)
  {
   switch(id)
     {
      //--- организация своего таймера
      case 2302:
         //--- наступило время нарисовать новый кадр?
         if(GetTickCount()>ExtTime)
           {
            //--- рисуем кадр
            Calculate();
            //--- рассчитаем время следующего кадра
            ExtTime=GetTickCount()+20;
           }
         //--- генерируем следующее событие для ручного таймера
         EventChartCustom(ExtChartID,1302,0,0,NULL);
         break;
      //--- изменения на чарте
      case CHARTEVENT_CHART_CHANGE:
         //--- пересчитаем с новыми параметрами
         Resize();
         break;
     }
  }
//+------------------------------------------------------------------+
//| Расчёт и отрисовка кадра                                         |
//+------------------------------------------------------------------+
void Calculate()
  {
//--- рассчитываем новый кадр
   for(uint x=0;x<ExtWidth;x++)
      ExtFlame[x][SCREEN_CY]++;
//--- построим языки пламени
   for(uint y=SCREEN_CY-1;y>0;y--)
     {
      for(uint c,x=1,n=ExtWidth-1;x<n;x++)
        {
         c =ExtFlame[x-1][y]+ExtFlame[x+1][y];
         c+=ExtFlame[x-1][y+1]+ExtFlame[x][y+1]+ExtFlame[x+1][y+1];
         ExtFlame[x][y]=uchar(c/5);
        }
     }
//--- переносим пламя в буфер ресурса
   for(uint y=0;y<SCREEN_CY;y++)
      for(uint x=0;x<ExtWidth;x++)
         ExtScreen[y*ExtWidth+x]=ExtPal[ExtFlame[x][y]];
//--- обновляем ресурс и выводим его на экран
   ResourceCreate("::flame",ExtScreen,ExtWidth,SCREEN_CY,0,0,ExtWidth,COLOR_FORMAT_ARGB_NORMALIZE);
   ChartRedraw(ExtChartID);
  }
//+------------------------------------------------------------------+
//| Обновление чарта                                                 |
//+------------------------------------------------------------------+
void Resize()
  {
//--- запросим новые размеры чарта
   uint cx=(uint)ChartGetInteger(ExtChartID,CHART_WIDTH_IN_PIXELS);
   uint cy=(uint)ChartGetInteger(ExtChartID,CHART_HEIGHT_IN_PIXELS);
//--- график изменил высоту - двигаем картинку
   if(ExtY!=cy)
     {
      ExtY=cy;
      ObjectSetInteger(ExtChartID,"flame",OBJPROP_YDISTANCE,ExtY-SCREEN_CY);
     }
//--- изменилась ширина
   if(ExtWidth!=cx)
     {
      //--- изменяем размеры буферов
      ArrayResize(ExtScreen,cx*SCREEN_CY);
      ArrayResize(ExtFlame,cx);
      //--- расширяем пламя
      for(uint x=ExtWidth;x<cx;x++)
        {
         //--- обнуляем языки пламени
         for(uint y=0;y<SCREEN_CY;y++) ExtFlame[x][y]=0;
         //--- подкидываем "дровишек"
         ExtFlame[x][SCREEN_CY]=uchar(rand()%256);
        }
      //--- обновляем размер и перерисовываем кадр
      ExtWidth=cx;
      Calculate();
     }
  }
//+------------------------------------------------------------------+
 

Открытость

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

 

 
mql5:

Да пожалуйста:

Спасибо!

Лично меня интересовал типа хак EvenSetTimer(1) от разработчика.

Раз такие дела, может убрать ограничение в 1 секунду? 

FinGeR:

Открытость

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

 Стандартными фигурами нет (пока?) . Вам ведь нужна привязка фигур к барам.

А с помощью ресурсов, как в flame, будет непросто. Придется отслеживать скрол чарта и динамически создавать, удалять, двигать объекты.

Причина обращения: