Author: TheXpert
Indicators Used
Relative strength indexMoving average indicator
2 Views
0 Downloads
0 Favorites
Color_RSI
//+------------------------------------------------------------------+
//|                                                    Color_RSI.mq5 |
//+------------------------------------------------------------------+

// ãðóïïà èíôîðìàöèîííûõ ñâîéñòâ.
#property copyright "TheXpert"
#property link      "theforexpert@gmail.com"

#property version   "1.00"

// îïèñàíèå èíäèêàòîðà -- ñóììàðíî íå äîëæíî ïðåâûøàòü 511 ñèìâîëîâ
// ñ ó÷åòîì ñèìâîëîâ ïåðåâîäà ñòðîêè
#property description "      "
#property description "Äåìîíñòðàöèÿ ïîñòðîåíèÿ èíäèêàòîðà"
#property description "íà ïðèìåðå ðàñêðàøèâàíèÿ RSI"

// ñâîéñòâà íåïîñðåäñòâåííî èíäèêàòîðà
#property indicator_separate_window // èíäèêàòîð áóäåò îòîáðàæåí â îòäåëüíîì ïîäîêíå

//#property indicator_minimum 0
//#property indicator_maximum 100

#property indicator_buffers 4       // êîëè÷åñòâî èñïîëüçóåìûõ áóôåðîâ
#property indicator_plots 2         // êîëè÷åñòâî îòîáðàæàåìûõ áóôåðîâ

#property indicator_color1 DarkSalmon, DeepSkyBlue // èñïîëüçóåì 2 öâåòà
#property indicator_type1 DRAW_COLOR_LINE          // è ñïåöèàëüíûé öâåòíîé òèï îòîáðàæåíèÿ

#property indicator_color2 DarkSalmon, DeepSkyBlue // èñïîëüçóåì 2 öâåòà
#property indicator_type2 DRAW_COLOR_LINE          // è ñïåöèàëüíûé öâåòíîé òèï îòîáðàæåíèÿ

//---- buffers
double Values[];                    // áóôåð çíà÷åíèé
double ValuesPainting[];            // áóôåð èíäåêñîâ öâåòîâ
double SmoothedValues[];            // áóôåð ñãëàæåííûõ çíà÷åíèé
double SmoothedValuesPainting[];    // áóôåð èíäåêñîâ öâåòîâ
double BufferForCopy[];

// âõîäíûå ïàðàìåòðû èíäèêàòîðà
input string               _1             = "Ïàðàìåòðû äëÿ RSI";
input int                  RSIPeriod      = 5;
input int                  SmoothPeriod   = 5;
input ENUM_APPLIED_PRICE   AppliedPrice   = PRICE_CLOSE;
input string               _2             = "Íàñòðîéêè öâåòîâ";
input color                Down           = DarkSalmon;
input color                Up             = DeepSkyBlue;

// ïåðåìåííàÿ, â êîòîðîé áóäåò ñîäåðæàòüñÿ õýíäë èíäèêàòîðà
int RSIHandle;
int SmoothHandle;

// ôóíêöèÿ èíèöèàëèçàöèè èíäèêàòîðà
int OnInit()
{
   // ðåãèñòðèðóåì èíäèêàòîðíûå áóôåðû
   // Values êàê áóôåð äëÿ îòîáðàæåíèÿ
   SetIndexBuffer(0, Values,                 INDICATOR_DATA);
   // ValuesPainting êàê áóôåð äëÿ õðàíåíèÿ öâåòîâ
   SetIndexBuffer(1, ValuesPainting,         INDICATOR_COLOR_INDEX);
   
   // Values êàê áóôåð äëÿ îòîáðàæåíèÿ
   SetIndexBuffer(2, SmoothedValues,         INDICATOR_DATA);
   // ValuesPainting êàê áóôåð äëÿ õðàíåíèÿ öâåòîâ
   SetIndexBuffer(3, SmoothedValuesPainting, INDICATOR_COLOR_INDEX);

   // Óñòàíàâëèâàåì íà÷àëî ðèñîâàíèÿ áóôåðà Values
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, RSIPeriod);
   // Óñòàíàâëèâàåì íà÷àëî ðèñîâàíèÿ áóôåðà Values
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, RSIPeriod + SmoothPeriod);
   // Óñòàíàâëèâàåì èìÿ èíäèêàòîðà
   IndicatorSetString(INDICATOR_SHORTNAME, "Öâåòíîé RSI(" + string(RSIPeriod) + "," + string(SmoothPeriod) + ")");
   // Óñòàíàâëèâàåì ïóñòîå çíà÷åíèå äëÿ áóôåðà Values
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   // Óñòàíàâëèâàåì öâåòà áóôåðà
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, Down);
   PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, Up);
   PlotIndexSetInteger(2, PLOT_LINE_COLOR, 0, Down);
   PlotIndexSetInteger(2, PLOT_LINE_COLOR, 1, Up);

   RSIHandle = iRSI(NULL, 0, RSIPeriod, AppliedPrice);
   SmoothHandle = iMA(NULL, 0, SmoothPeriod, 0, MODE_EMA, RSIHandle);
   
   ArrayResize(BufferForCopy, 3);

   // Óñòàíàâëèâàåì ïîðÿäîê èíäåêñàöèè áóôåðîâ
   ArraySetAsSeries(Values, true);
   ArraySetAsSeries(ValuesPainting, true);
   ArraySetAsSeries(SmoothedValues, true);
   ArraySetAsSeries(SmoothedValuesPainting, true);
   ArraySetAsSeries(BufferForCopy, true);

   return(0);
}

// ôóíêöèÿ ðàñ÷åòà äàíûõ
// ïàðàìåòðû ôóíêöèè _ìîæíî_ ïåðåèìåíîâûâàòü
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
   int toCount = (int)MathMin(rates_total, rates_total - prev_calculated + 1);
   
   // "óìíîå" êîïèðîâàíèå äàííûõ, ÷òîáû íå êîïèðîâàòü êàæäûé ðàç öåëèêîì
   if (toCount <= 3)
   {
      int copied = CopyBuffer(RSIHandle, 0, 0, toCount, BufferForCopy);
      if (copied == -1)
      {
         Print("Îøèáêà âî âðåìÿ êîïèðîâàíèÿ äàííûõ ¹", GetLastError());
         return 0;
      }
      
      for (int i = toCount - 1; i >= 0; --i)
      {
         Values[i] = BufferForCopy[i];
      }

      copied = CopyBuffer(SmoothHandle, 0, 0, toCount, BufferForCopy);
      if (copied == -1)
      {
         Print("Îøèáêà âî âðåìÿ êîïèðîâàíèÿ ñãëàæåííûõ äàííûõ ¹", GetLastError());
         return 0;
      }
      
      for (int i = toCount - 1; i >= 0; --i)
      {
         SmoothedValues[i] = BufferForCopy[i];
      }
   }
   else
   {
      int copied = CopyBuffer(RSIHandle, 0, 0, rates_total, Values);
      if (copied == -1)
      {
         Print("Îøèáêà âî âðåìÿ êîïèðîâàíèÿ äàííûõ ¹", GetLastError());
         return 0;
      }

      copied = CopyBuffer(SmoothHandle, 0, 0, rates_total, SmoothedValues);
      if (copied == -1)
      {
         Print("Îøèáêà âî âðåìÿ êîïèðîâàíèÿ äàííûõ ¹", GetLastError());
         return 0;
      }
   }
   
   // ðàñêðàøèâàíèå. Äà, òåïåðü îíî ñòàëî òàêèì ïðîñòûì
   for (int i = toCount - 2; i >= 0; --i)
   {
      
      if (Values[i + 1] != EMPTY_VALUE && 
          Values[i] > Values[i + 1])   ValuesPainting[i] = 1;
      else                             ValuesPainting[i] = 0;

      if (SmoothedValues[i + 1] != EMPTY_VALUE &&
          SmoothedValues[i] > SmoothedValues[i + 1])  SmoothedValuesPainting[i] = 1;
      else                                            SmoothedValuesPainting[i] = 0;
   }

   return rates_total;
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---