Вот простенький индикатор, который можно набросить на чарт и посмотреть.
:-)
Вот простенький индикатор, который можно набросить на чарт и посмотреть.
- www.mql5.com
Создадим помехи на чарте терминала. ))
Вот простенький индикатор, который можно набросить на чарт и посмотреть.
Renat:
Вот простенький индикатор, который можно набросить на чарт и посмотреть.
Чем ближе к Margin Call, тем выше пламя :))
Интересная идея! Индикатор поощрения-наказания трейдера:)) Вариаций масса, ядро идеи что в зависимости от дифференциала эквити, его гладкости и тп. раскраска элементов и фон меняется от умиляющих взгляд, до страшаще-агресивных, при приближении к мержинколу начинается совсем трешак.
В исходнике было бы нагляднее )).
Да пожалуйста:
//+------------------------------------------------------------------+ //| Оставим место для работы пользовательского скрипта и эксперта | //+------------------------------------------------------------------+ #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(); } } //+------------------------------------------------------------------+
Открытость
Можно ли создать прозрачные прямоугольники?
Да пожалуйста:
Спасибо!
Лично меня интересовал типа хак EvenSetTimer(1) от разработчика.
Раз такие дела, может убрать ограничение в 1 секунду?
Открытость
Можно ли создать прозрачные прямоугольники?
Стандартными фигурами нет (пока?) . Вам ведь нужна привязка фигур к барам.
А с помощью ресурсов, как в flame, будет непросто. Придется отслеживать скрол чарта и динамически создавать, удалять, двигать объекты.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот простенький индикатор, который можно набросить на чарт и посмотреть.