rsi_divergence_1.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «rsi_divergence_1.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор рассчитывает значения RSI заданного периода по ценовым данным и отображает их в отдельном подокне графика. Дополнительно доступно сглаживание линии RSI методом T3 с настраиваемым периодом и коэффициентом кривизны. Индикатор поддерживает работу на разных таймфреймах, включая мультитаймфреймный режим, когда данные берутся с более высокого таймфрейма.
Основная функция — обнаружение дивергенций между линией RSI (или её сглаженной версией) и ценовым действием. Поддерживаются как обычные, так и скрытые дивергенции, с возможностью фильтрации по уровням перекупленности и перепроданности. Дополнительно индикатор определяет точки пересечения линий RSI и сигнальной линии на заданных уровнях.
Встроена система оповещений с воспроизведением звука при срабатывании сигналов о дивергенции или пересечении. Индикатор рисует линии и стрелки на графике, отслеживает пиковые точки (вершины и впадины), а также строит линии LineMan, соединяющие ключевые уровни. Все графические объекты привязаны к префиксу индикатора и удаляются при деинициализации.
Настройки программы
| Настройка | Описание |
|---|---|
| time frame (timeFrame) | Таймфрейм — Таймфрейм, с которого берутся данные для расчёта; 0 означает текущий таймфрейм |
| show divergence (bCheckDiv) | Показывать дивергенцию — Отображение линий и стрелок при обнаружении дивергенций между RSI и ценой |
| show all divergence or above/below level_hi/lo (bShowAllDiv) | Показывать все дивергенции — Показывать все дивергенции или только те, что находятся ниже уровня lo или выше уровня hi |
| show cross signal (bCheckCross) | Показывать сигнал пересечения — Отображение сигнальных стрелок при пересечении линий RSI и сигнальной линии на уровнях перекупленности/перепроданности |
| show LineMan (bCheckLineMan) | Показывать LineMan — Отображение линий LineMan, соединяющих пиковые точки RSI |
| PlaySound() on signal cross (bAlertCross) | Звуковое оповещение при пересечении — Воспроизведение звукового оповещения при пересечении линий RSI на заданном уровне |
| PlaySound() on divergence (bAlertDiv) | Звуковое оповещение при дивергенции — Воспроизведение звукового оповещения при обнаружении дивергенции |
| PlaySound() on divergence (bAlertLineMan) | Звуковое оповещение для LineMan — Воспроизведение звукового оповещения при обновлении линий LineMan |
| draw lines on chart/window (bDrawOnChart) | Рисовать на графике — Отрисовка вспомогательных линий и стрелок непосредственно на графике цены |
| 0/MODE_MAIN:RSI value 1/MODE_SIGNAL:smoothed value(T3) (div_mode) | Режим линии RSI — Режим расчёта: 0 — по основной линии RSI, 1 — по сглаженной линии T3 |
| number of bars to check divergence (nCheckBars) | Количество баров для проверки — Количество баров, в пределах которых выполняется поиск дивергенций |
| RSI period (rsi_period) | Период RSI — Период расчёта индикатора RSI |
| RSI period (t3_period) | Период T3 — Период сглаживания линии RSI методом T3 |
| when bShowAllDiv is true, show divergence only below this level (level_lo) | Нижний уровень — Нижний уровень фильтрации дивергенций (перепроданность), используется при включённом режиме показа всех дивергенций |
| when bShowAllDiv is true, show divergence only above this level (level_hi) | Верхний уровень — Верхний уровень фильтрации дивергенций (перекупленность), используется при включённом режиме показа всех дивергенций |
| allowable error along divergence line (oscilator) (div_oscErr) | Допустимая ошибка осциллятора — Допустимое отклонение вдоль линии дивергенции для показания осциллятора |
| allowable error along divergence line (PPS), iATR(nCheckBars)*err (div_priceErr) | Допустимая ошибка цены — Допустимое отклонение вдоль линии дивергенции для цены, рассчитывается как iATR(nCheckBars) умноженное на err |
| specify indicator window explicitly, 0: auto (window) | Окно отображения — Номер подокна для отображения индикатора; 0 означает автоматический выбор |
| maximum number of bars to calculate, 0: no limit (nMaxBars) | Максимальное количество баров — Максимальное количество баров для расчёта; 0 означает отсутствие ограничений |
Поиск по коду файла
#define DodgerBlue2 0xaa6014
#define Crimson2 0x280d93
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 8
#property indicator_color1 SlateBlue // 0: Rsi line
#property indicator_color2 MediumOrchid // 1: Rsi smoothed line(T3)
#property indicator_color3 Aqua // 2: Long signal, cross
#property indicator_color4 Magenta // 3: Short signal, cross
#property indicator_color5 DodgerBlue // 4: Long signal, divergence
#property indicator_color6 Crimson // 5: Short signal, divergence
#property indicator_color7 Crimson2 // 6: Top peak
#property indicator_color8 DodgerBlue2 // 7: Bottom peak
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1
#property indicator_width6 1
#property indicator_width7 1
#property indicator_width8 1
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_DOT
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_style6 STYLE_SOLID
#property indicator_style7 STYLE_SOLID
#property indicator_style8 STYLE_SOLID
extern int timeFrame = 0; // time frame
extern bool bCheckDiv = true; // show divergence
extern bool bShowAllDiv = false; // show all divergence or above/below level_hi/lo
extern bool bCheckCross = false; // show cross signal
extern bool bCheckLineMan = true; // show LineMan
extern bool bAlertCross = false; // PlaySound() on signal cross
extern bool bAlertDiv = false; // PlaySound() on divergence
extern bool bAlertLineMan = false; // PlaySound() on divergence
extern bool bDrawOnChart = true; // draw lines on chart/window
extern int div_mode = MODE_MAIN; // 0/MODE_MAIN:RSI value 1/MODE_SIGNAL:smoothed value(T3)
extern int nCheckBars = 120; // number of bars to check divergence
extern int rsi_period = 8; // RSI period
extern int t3_period = 8; // RSI period
extern double level_lo = 30; // when bShowAllDiv is true, show divergence only below this level
extern double level_hi = 70; // when bShowAllDiv is true, show divergence only above this level
extern double div_oscErr = 4.0; // allowable error along divergence line (oscilator)
extern double div_priceErr = 0.4; // allowable error along divergence line (PPS), iATR(nCheckBars)*err
extern int window = 0; // specify indicator window explicitly, 0: auto
extern int nMaxBars = 2000; // maximum number of bars to calculate, 0: no limit
double BufferMain[]; // 0: Rsi main line
double BufferSignal[]; // 1: Rsi smoothed line
double BufferLongCross[]; // 2: Long signal, cross
double BufferShortCross[]; // 3: Short signal, cross
double BufferLongDiv[]; // 4: Long signal, divergence
double BufferShortDiv[]; // 5: Short signal, divergence
double BufferTop[]; // 6: top peak
double BufferBottom[]; // 7: bottom peak
string sIndicatorName;
string sIndSelf = "00-RsiDiv_v104";
string sPrefix;
int g_window;
int markLong = 233;
int markShort = 234;
int markDot = 167;
color colRegularLong = DodgerBlue; // ( 30, 144, 255)= 0x1e90ff
color colRegularShort = Crimson; // (220, 20, 60)= 0xdc143c
color colHiddenLong = DodgerBlue2;
color colHiddenShort = Crimson2;
color colLineManUpper = Aqua;
color colLineManLower = Magenta;
int wRegular = 1;
int wHidden = 1;
double t3_curvature = 0.6180;
double t3_e1, t3_e2, t3_e3, t3_e4, t3_e5, t3_e6;
double t3_c1, t3_c2, t3_c3, t3_c4;
double t3_w1, t3_w2, t3_b2, t3_b3;
datetime tAlertLast = 0;
string indName;
string TimeFrameToStr(int timeFrame)
{
switch (timeFrame) {
case 1: return("M1");
case 5: return("M5");
case 15: return("M15");
case 30: return("M30");
case 60: return("H1");
case 240: return("H4");
case 1440: return("D1");
case 10080: return("W1");
case 43200: return("MN");
}
return("??");
}
void init()
{
// код доступен только после оплаты
}
void deinit()
{
int n = ObjectsTotal();
for (int i = n - 1; i >= 0; i--) {
string sName = ObjectName(i);
if (StringFind(sName, sPrefix) == 0) {
ObjectDelete(sName);
}
}
}
void objLine(string sName, int win, datetime ts, double ps, datetime te, double pe, color col,
int width = 1, int style = STYLE_SOLID, bool bBack = true, bool bRay = false)
{
sName = sPrefix + sName + " w" + win;
ObjectCreate(sName, OBJ_TREND, win, 0, 0);
ObjectSet(sName, OBJPROP_TIME1, ts);
ObjectSet(sName, OBJPROP_PRICE1, ps);
ObjectSet(sName, OBJPROP_TIME2, te);
ObjectSet(sName, OBJPROP_PRICE2, pe);
ObjectSet(sName, OBJPROP_COLOR, col);
ObjectSet(sName, OBJPROP_WIDTH, width);
ObjectSet(sName, OBJPROP_STYLE, style);
ObjectSet(sName, OBJPROP_BACK, bBack);
ObjectSet(sName, OBJPROP_RAY, bRay);
}
void objArrow(string sName, int win, datetime t, double p, int arrow, color col, int width = 1)
{
sName = sPrefix + sName + " w" + win;
ObjectCreate(sName, OBJ_ARROW, win, 0, 0);
ObjectSet(sName, OBJPROP_TIME1, t);
ObjectSet(sName, OBJPROP_PRICE1, p);
ObjectSet(sName, OBJPROP_ARROWCODE, arrow);
ObjectSet(sName, OBJPROP_COLOR, col);
ObjectSet(sName, OBJPROP_WIDTH, width);
}
double getVal(int i)
{
if (div_mode == MODE_MAIN) {
return(BufferMain[i]);
}
return(BufferSignal[i]);
}
double getLowerPrice(int i)
{
double hi, lo;
if (div_mode == MODE_MAIN) {
hi = High[i];
lo = Low[i];
} else {
hi = iMA(NULL, 0, t3_period, 0, MODE_LWMA, PRICE_HIGH, i);
lo = iMA(NULL, 0, t3_period, 0, MODE_LWMA, PRICE_LOW, i);
}
return(MathMin(hi, lo));
}
double getHigherPrice(int i)
{
double hi, lo;
if (div_mode == MODE_MAIN) {
hi = High[i];
lo = Low[i];
} else {
hi = iMA(NULL, 0, t3_period, 0, MODE_LWMA, PRICE_HIGH, i);
lo = iMA(NULL, 0, t3_period, 0, MODE_LWMA, PRICE_LOW, i);
}
return(MathMax(hi, lo));
}
void intersect(double &x0, double &y0, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
{
x0 = 0;
y0 = 0;
double a1, a2, b1, b2;
if (x1 == x2){
if (x3 != x4) {
a1 = (y4 - y3) / (x4 - x3);
b1 = y3 - a1 * x3;
x0 = x2;
y0 = a1 * x0 + b1;
} else {
if (x1 == x3) {
x0 = x1;
y0 = y1;
}
}
return;
}
if (x3 == x4){
a1 = (y2 - y1) / (x2 - x1);
b1 = y2 - a1 * x2;
x0 = x3;
y0 = a1 * x0 + b1;
return;
}
a1 = 0;
b1 = 0;
a2 = 0;
b2 = 0;
a1 = (y2 - y1) / (x2 - x1);
b1 = y2 - a1 * x2;
a2 = (y4 - y3) / (x4 - x3);
b2 = y3 - a2 * x3;
if (a1 != a2) {
x0 = (b1 - b2) / (a2 - a1);
y0 = a1 * x0 + b1;
} else {
if (b1 == b2) {
x0 = x1;
y0 = y1;
}
}
}
bool checkAlert()
{
bool bPlayed = false;
if ((bCheckCross && bAlertCross) || (bCheckDiv && bAlertDiv) || (bCheckLineMan && bAlertLineMan)) {
bool bFireCross = (BufferLongCrПоказано первые 50% кода (символов: 13949)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.