Обсуждение статьи "Изучаем возможности создания разноцветных свечных графиков"

 

Опубликована статья "Изучаем возможности создания разноцветных свечных графиков":

В этой статье мы рассмотрим возможности создания кастомных свечных индикаторов, а также поговорим об их преимуществах и недостатках.

В рамках статьи рассмотрим четыре варианта таких индикаторов:

  1. Построение свечей одного цвета без определения направления свечей.
  2. Построение разноцветных свечей, раскрашенных в соответствии с определенными правилами.
  3. Построение свечей с заливкой и без, используя различные цвета для заливки свечей и для их контуров.
  4. Построение разноцветных свечей с заливкой и без.

Итак, мы подошли к цели этой статьи — демонстрации того, как создавать правила раскраски на основе определенных выбранных торговых правил для создания пользовательского свечного графика. Окончательный результат работы показан на рисунке ниже:


Автор: Samuel Manoel De Souza

 
Отличный учебник, Самуэль! Parabéns e obrigado!!!
 
Excellent one.... моя мысль свеча палка также прямой, который может сделать кто-то понимает немного о торговом термине, я считаю, что красный один является продать в то время как зеленый один является купить, но они samething когда зеленый идет вверх купить в то время как красный вниз продать, но в конце точки там линии, зеленый должен принять обратный и красный должен двигаться дальше, а желтый является сок там цена. Так в размещении этого в mql5, каждый будет знать мой язык запроса (мой ql).
 

Здравствуйте, Самуэль,

Хорошая идея, но я не могу выполнить эту работу. Можете ли вы представить этот пример в этой статье?


С наилучшими пожеланиями,

 
как сделать тиковые свечи любого размера для торговли фьючерсами
 
scalp-91 #:
как сделать тиковые свечи любого количества для торговли фьючерсами

https://www.mql5.com/ru/articles/60

Creación de indicadores de tick en MQL5
Creación de indicadores de tick en MQL5
  • www.mql5.com
En este artículo vamos a ver la creación de dos indicadores: el indicador de tick, que representa el gráfico de tick del precio, y el indicador de vela de tick, que representa las velas con el número de ticks especificados. Cada uno de los indicadores escribe los precios de llegada en un archivo y utiliza los datos guardados tras el reinicio del indicador (estos datos pueden ser usados también por los demás programas).
 
Огромное спасибо за дидактику.
 
cf23EA1l #:

Привет, Сэмюэль,

Хорошая идея, но я не могу выполнить эту работу. Можете ли вы представить этот пример в этой статье?


С наилучшими пожеланиями,

//+------------------------------------------------------------------+
//|Цветные свечи.mq5 |
//|Copyright 2020, Samuel Manoel de Souza |
//| https://www.mql5.com/pt/users/samuelmnl |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Samuel Manoel de Souza"
#property link      "https://www.mql5.com/pt/users/samuelmnl"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots   3
//--- сюжетный бык
#property indicator_label1  "bull"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGreen,clrBlack,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- сюжетный медведь
#property indicator_label2  "bear"
#property indicator_type2   DRAW_CANDLES
#property indicator_color2  clrRed,clrBlack,clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- диапазон сюжета
#property indicator_label3  "wait"
#property indicator_type3   DRAW_CANDLES
#property indicator_color3  clrGold,clrBlack,clrGold
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- индикаторные буферы
double         bullBuffer1[];
double         bullBuffer2[];
double         bullBuffer3[];
double         bullBuffer4[];
double         bearBuffer1[];
double         bearBuffer2[];
double         bearBuffer3[];
double         bearBuffer4[];
double         rangeBuffer1[];
double         rangeBuffer2[];
double         rangeBuffer3[];
double         rangeBuffer4[];

input int inpShift = 0; //Индикатор Shift
input int inpBlue = 10;//Blue Shift
input int inpRed = 20; //Красная смена

//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(inpBlue <= 0)
     {
      Alert("Blue Shift must be greater then 0!");
      return INIT_PARAMETERS_INCORRECT;
     }
   if(inpRed <= inpBlue)
     {
      Alert("Red Shift must be greater then Blue Shift!");
      return INIT_PARAMETERS_INCORRECT;
     }
//--- отображение индикаторных буферов
   SetIndexBuffer(0, bullBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, bullBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, bullBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, bullBuffer4, INDICATOR_DATA);
   SetIndexBuffer(4, bearBuffer1, INDICATOR_DATA);
   SetIndexBuffer(5, bearBuffer2, INDICATOR_DATA);
   SetIndexBuffer(6, bearBuffer3, INDICATOR_DATA);
   SetIndexBuffer(7, bearBuffer4, INDICATOR_DATA);
   SetIndexBuffer(8, rangeBuffer1, INDICATOR_DATA);
   SetIndexBuffer(9, rangeBuffer2, INDICATOR_DATA);
   SetIndexBuffer(10, rangeBuffer3, INDICATOR_DATA);
   SetIndexBuffer(11, rangeBuffer4, INDICATOR_DATA);
//---Установка значения, которое делает бары невидимыми
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
//---Установка значений сдвига для каждого бара
   PlotIndexSetInteger(0, PLOT_SHIFT, inpShift);
   PlotIndexSetInteger(1, PLOT_SHIFT, inpShift);
   PlotIndexSetInteger(2, PLOT_SHIFT, inpShift);
//--Установка места, откуда должны быть нарисованы столбики
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, inpRed - 1);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, inpRed - 1);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, inpRed - 1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--Если нет достаточного количества баров, не вычисляйте.
   if(rates_total < inpRed)
     {
      return rates_total;
     }
//---Определение того, откуда мы должны начать вычисления
   int limit;
   if(prev_calculated < inpRed)
      limit = inpRed;
   else
      limit = prev_calculated - 1;
//--Основной цикл вычислений
   for(int i = limit; i < rates_total; i++)
     {
      int shift = BarIndex2shift(i);
      double open = iOpen(_Symbol, _Period, shift);
      double high = iHigh(_Symbol, _Period, shift);
      double low = iLow(_Symbol, _Period, shift);
      double close = iClose(_Symbol, _Period, shift);
      double red = price[i - (inpRed)]; //Получение значения красной строки
      double blue = price[i - inpBlue]; //Получение значения синей линии
      double yellow = price[i];     //Получение значения желтой линии
      //Для этого фильтра существует три флага
      //0 = продать, 1 = подождать, 1 = купить
      // мы можем покупать, если 2 линии находятся выше красной
      // мы можем продавать, если 2 линии находятся ниже красной
      int direction = 0;
      direction += (yellow > red) ? 1 : 0; // Если желтый цвет выше красного, прибавьте 1
      red = blue;
      blue = yellow;
      direction += (blue > red) ? 1 : 0; // Если синий цвет больше красного, добавьте 1 .
      //По умолчанию бары не видны
      bullBuffer1[i] = 0;
      bullBuffer2[i] = 0;
      bullBuffer3[i] = 0;
      bullBuffer4[i] = 0;
      bearBuffer1[i] = 0;
      bearBuffer2[i] = 0;
      bearBuffer3[i] = 0;
      bearBuffer4[i] = 0;
      rangeBuffer1[i] = 0;
      rangeBuffer2[i] = 0;
      rangeBuffer3[i] = 0;
      rangeBuffer4[i] = 0;
      //Мы будем присваивать значение каждому бару в соответствии с флагом направления
      switch(direction)
        {
         case 0: // Медвежий рынок
           {
            bearBuffer1[i] = open;
            bearBuffer2[i] = high;
            bearBuffer3[i] = low;
            bearBuffer4[i] = close;
            break;
           }
         case 1: // Бычий рынок
           {
            rangeBuffer1[i] = open;
            rangeBuffer2[i] = high;
            rangeBuffer3[i] = low;
            rangeBuffer4[i] = close;
            break;
           }
         case 2: // Является рынком диапазонов
           {
            bullBuffer1[i] = open;
            bullBuffer2[i] = high;
            bullBuffer3[i] = low;
            bullBuffer4[i] = close;
            break;
           }
        }
     }
//--- возвращаем значение prev_calculated для следующего вызова
   return(rates_total);
  }

int BarIndex2shift(int bar) {return Bars(_Symbol, _Period) - bar - 1;}

//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//|Цветные свечи.mq5 |
//| Copyright 2020, Samuel Manoel de Souza |
//| https://www.mql5.com/ru/users/samuelmnl |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Samuel Manoel de Souza"
#property link      "https://www.mql5.com/ru/users/samuelmnl"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 12
#property indicator_plots   3
//--- сюжетный бык
#property indicator_label1  "bull"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGreen,clrBlack,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- сюжетный медведь
#property indicator_label2  "bear"
#property indicator_type2   DRAW_CANDLES
#property indicator_color2  clrRed,clrBlack,clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- диапазон сюжета
#property indicator_label3  "wait"
#property indicator_type3   DRAW_CANDLES
#property indicator_color3  clrGold,clrBlack,clrGold
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- индикаторные буферы
double         bullBuffer1[];
double         bullBuffer2[];
double         bullBuffer3[];
double         bullBuffer4[];
double         bearBuffer1[];
double         bearBuffer2[];
double         bearBuffer3[];
double         bearBuffer4[];
double         rangeBuffer1[];
double         rangeBuffer2[];
double         rangeBuffer3[];
double         rangeBuffer4[];

input int inpShift = 0; //Индикатор Shift
input int inpBlue = 10;//Blue Shift
input int inpRed = 20; //Красная смена

//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(inpBlue <= 0)
     {
      Alert("Blue Shift must be greater then 0!");
      return INIT_PARAMETERS_INCORRECT;
     }
   if(inpRed <= inpBlue)
     {
      Alert("Red Shift must be greater then Blue Shift!");
      return INIT_PARAMETERS_INCORRECT;
     }
//--- отображение индикаторных буферов
   SetIndexBuffer(0, bullBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, bullBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, bullBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, bullBuffer4, INDICATOR_DATA);
   SetIndexBuffer(4, bearBuffer1, INDICATOR_DATA);
   SetIndexBuffer(5, bearBuffer2, INDICATOR_DATA);
   SetIndexBuffer(6, bearBuffer3, INDICATOR_DATA);
   SetIndexBuffer(7, bearBuffer4, INDICATOR_DATA);
   SetIndexBuffer(8, rangeBuffer1, INDICATOR_DATA);
   SetIndexBuffer(9, rangeBuffer2, INDICATOR_DATA);
   SetIndexBuffer(10, rangeBuffer3, INDICATOR_DATA);
   SetIndexBuffer(11, rangeBuffer4, INDICATOR_DATA);
//---Установка значения, которое делает бары невидимыми
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
//---Установка значений сдвига для каждого бара
   PlotIndexSetInteger(0, PLOT_SHIFT, inpShift);
   PlotIndexSetInteger(1, PLOT_SHIFT, inpShift);
   PlotIndexSetInteger(2, PLOT_SHIFT, inpShift);
//--Установка места, откуда должны быть нарисованы столбики
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, inpRed - 1);
   PlotIndexSetInteger(1, PLOT_DRAW_BEGIN, inpRed - 1);
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, inpRed - 1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--Если нет достаточного количества баров, не вычисляйте.
   if(rates_total < inpRed)
     {
      return rates_total;
     }
//---Определение того, откуда мы должны начать вычисления
   int limit;
   if(prev_calculated < inpRed)
      limit = inpRed;
   else
      limit = prev_calculated - 1;
//--Основной цикл вычислений
   for(int i = limit; i < rates_total; i++)
     {
      int shift = BarIndex2shift(i);
      double open = iOpen(_Symbol, _Period, shift);
      double high = iHigh(_Symbol, _Period, shift);
      double low = iLow(_Symbol, _Period, shift);
      double close = iClose(_Symbol, _Period, shift);
      double red = price[i - (inpRed)]; //Получение значения красной строки
      double blue = price[i - inpBlue]; //Получение значения синей линии
      double yellow = price[i];     //Получение значения желтой линии
      //Для этого фильтра существует три флага
      //0 = продать, 1 = подождать, 1 = купить
      // мы можем покупать, если 2 линии находятся выше красной
      // мы можем продавать, если 2 линии находятся ниже красной
      int direction = 0;
      direction += (yellow > red) ? 1 : 0; // Если желтый цвет выше красного, прибавьте 1
      red = blue;
      blue = yellow;
      direction += (blue > red) ? 1 : 0; // Если синий цвет больше красного, добавьте 1 .
      //По умолчанию бары не видны
      bullBuffer1[i] = 0;
      bullBuffer2[i] = 0;
      bullBuffer3[i] = 0;
      bullBuffer4[i] = 0;
      bearBuffer1[i] = 0;
      bearBuffer2[i] = 0;
      bearBuffer3[i] = 0;
      bearBuffer4[i] = 0;
      rangeBuffer1[i] = 0;
      rangeBuffer2[i] = 0;
      rangeBuffer3[i] = 0;
      rangeBuffer4[i] = 0;
      //Мы будем присваивать значение каждому бару в соответствии с флагом направления
      switch(direction)
        {
         case 0: // Медвежий рынок
           {
            bearBuffer1[i] = open;
            bearBuffer2[i] = high;
            bearBuffer3[i] = low;
            bearBuffer4[i] = close;
            break;
           }
         case 1: // Бычий рынок
           {
            rangeBuffer1[i] = open;
            rangeBuffer2[i] = high;
            rangeBuffer3[i] = low;
            rangeBuffer4[i] = close;
            break;
           }
         case 2: // Является рынком диапазонов
           {
            bullBuffer1[i] = open;
            bullBuffer2[i] = high;
            bullBuffer3[i] = low;
            bullBuffer4[i] = close;
            break;
           }
        }
     }
//--- возвращаем значение prev_calculated для следующего вызова
   return(rates_total);
  }

int BarIndex2shift(int bar) {return Bars(_Symbol, _Period) - bar - 1;}

//+------------------------------------------------------------------+
 
Спасибо за эту статью. Я смог следовать за ней и применить ее на своих графиках. Мой вопрос заключается в том, сделали ли вы какие-либо статьи, которые объясняют, как вызвать этот индикатор в советнике, чтобы использовать его для автоматической торговли, а также тестер стратегий с визуализацией?
 
PanteraNoire тестер стратегий с визуализацией?

Нет.

Вам нужно использовать iCustom. И вы можете увидеть номера буферов в индикаторе, чтобы узнать о цветах и значениях.