Indicators Used
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---