SHK Professional Heikin Ashi Signals
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «shk_professional_heikin_ashi_signals.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
SHK Professional Heikin Ashi Signals — это пользовательский индикатор для MetaTrader 5, реализующий движок свечей Хайкин Аши с цветовой индексацией и дополнительными аналитическими сигналами. Индикатор рассчитывает значения HA Open, HA High, HA Low, HA Close, а также визуальный ATR и индекс цвета свечей, отображая их на графике цен.
Индикатор поддерживает три режима цветового кодирования свечей Хайкин Аши: стандартный, основанный на тренде и основанный на импульсе. В импульсном режиме сильные свечи определяются по соотношению тела свечи к среднему значению за скользящее окно.
Сигналы формируются двумя способами: по подтверждённому изменению цвета HA и по импульсным разворотам с подтверждением через расхождение MACD. Сигналы отрисовываются в виде стрелок и кругов на графике. Индикатор использует логику работы только с закрытыми барами, что обеспечивает отсутствие перерисовки.
Доступны четыре типа уведомлений: всплывающие окна, push-уведомления, электронная почта и звуковые сигналы. Работа уведомлений контролируется через параметры включения, задержки по времени и фильтрации только для реального времени.
Настройки программы
| Настройка | Описание |
|---|---|
| MaxBarsToCalculate | Макс. баров для расчёта — Максимальное количество баров для расчёта индикатора. |
| ShowHeikinAshiCandles | Показать свечи HA — Отображать свечи Хайкин Аши на графике. |
| ShowOriginalCandlesFaint | Показать оригинальные свечи тускло — Отображать оригинальные свечи графика приглушённым цветом поверх свечей HA. |
| EnableSignals | Включить сигналы — Включить или отключить формирование аналитических сигналов на графике. |
| UseClosedBarsOnly | Только закрытые бары — Использовать только закрытые бары для формирования сигналов, исключая формирующийся бар. |
| CandleMode | Режим цвета свечей — Режим цветового кодирования свечей Хайкин Аши: стандартный, основанный на тренде или на импульсе. |
| BullColor | Цвет бычьих свечей — Цвет бычьих свечей Хайкин Аши на графике. |
| BearColor | Цвет медвежьих свечей — Цвет медвежьих свечей Хайкин Аши на графике. |
| StrongBullColor | Цвет сильных бычьих свечей — Цвет сильных бычьих свечей Хайкин Аши. |
| StrongBearColor | Цвет сильных медвежьих свечей — Цвет сильных медвежьих свечей Хайкин Аши. |
| NeutralColor | Цвет нейтральных свечей — Цвет нейтральных свечей Хайкин Аши (равные open и close). |
| 1 to 10 (ConfirmationCandles) | Свечи подтверждения цвета — Количество свечей, необходимых для подтверждения изменения цвета HA (от 1 до 10). |
| SignalLookbackBars | Бары поиска сигналов — Количество баров назад для сканирования при поиске сигналов при полном пересчёте. |
| MinBodyPercent | Мин. процент тела свечи — Минимальный процент тела свечи относительно диапазона для распознавания значимого импульса. |
| SignalOnHAColorChange | Сигналы по изменению цвета HA — Формировать сигналы по подтверждённому изменению цвета HA вместо импульсной логики. |
| RequireMACDDivergenceConfirmation | Требовать расхождение MACD — Требовать подтверждения расхождения MACD для формирования стрелок подтверждённых сигналов. |
| MACDFastEMA | MACD быстрая EMA — Период быстрой экспоненциальной скользящей средней для расчёта MACD. |
| MACDSlowEMA | MACD медленная EMA — Период медленной экспоненциальной скользящей средней для расчёта MACD. |
| MACDSignalEMA | MACD сигнальная EMA — Период сигнальной линии MACD. |
| DivergencePivotLookback | Поиск пивотов расхождения — Количество баров для поиска пивотов при определении расхождений MACD. |
| DivergenceSearchBars | Глубина поиска расхождения — Максимальное количество баров назад для поиска предыдущего пивота при определении расхождений MACD. |
| DivergenceConfirmWindow | Окно подтверждения расхождения MACD — Количество баров назад, в пределах которых должно быть подтверждено расхождение MACD для действительного сигнала. |
| RequireStrongCandleForCircle | Требовать сильную свечу для круга — Требовать сильную свечу для формирования импульсного круга (по длине wick или объёму тела). |
| CancelSignalOnOppositeHA | Отмена сигнала при противоположном HA — Отмена ожидающего подтверждения сигнала при появлении свечи противоположного направления HA. |
| ConfirmByCloseBreak | Подтверждение пробоем закрытия — Условие подтверждения: пробой по закрытию (close) или по максимуму/минимуму свечи. |
| ArrowOffsetATR | Смещение стрелок (ATR) — Смещение стрелок подтверждённых сигналов в единицах ATR. |
| CircleOffsetATR | Смещение кругов (ATR) — Смещение кругов импульсных сигналов в единицах ATR. |
| VisualATRPeriod | Период визуального ATR — Период расчёта визуального ATR, используемого для смещения стрелок и кругов. |
| EnablePopupAlert | Всплывающие уведомления — Включить всплывающие уведомления на графике. |
| EnablePushAlert | Push-уведомления — Включить push-уведомления на мобильное устройство. |
| EnableEmailAlert | Email-уведомления — Включить отправку уведомлений по электронной почте. |
| EnableSoundAlert | Звуковые уведомления — Включить звуковые уведомления. |
| BuySoundFile | Звуковой файл покупки — Путь к звуковому файлу для уведомления о покупке. |
| SellSoundFile | Звуковой файл продажи — Путь к звуковому файлу для уведомления о продаже. |
| AlertCooldownSeconds | Задержка уведомлений (сек) — Задержка в секундах между повторными уведомлениями одного направления. |
| AlertOnlyRealtime | Уведомления только в реальном времени — Фильтр: уведомления срабатывают только при обработке реальных тиков, а не при пересчёте исторических данных. |
Поиск по коду файла
#property version "1.02"
#property description "Professional Heikin Ashi candle engine with HA color change plus MACD divergence confirmed BUY/SELL arrows. Closed bar, EA integration friendly."
#property strict
#property indicator_chart_window
#property indicator_buffers 10
#property indicator_plots 5
enum CandleColorMode
{
COLOR_STANDARD = 0,
COLOR_TREND_BASED = 1,
COLOR_MOMENTUM_BASED = 2
};
input int MaxBarsToCalculate = 3000;
input bool ShowHeikinAshiCandles = true;
input bool ShowOriginalCandlesFaint = false;
input bool EnableSignals = true;
input bool UseClosedBarsOnly = true;
input CandleColorMode CandleMode = COLOR_STANDARD;
input color BullColor = clrLime;
input color BearColor = clrRed;
input color StrongBullColor = clrDodgerBlue;
input color StrongBearColor = clrOrange;
input color NeutralColor = clrGray;
input int ConfirmationCandles = 1; // 1 to 10
input int SignalLookbackBars = 1000;
input double MinBodyPercent = 0.0;
input bool SignalOnHAColorChange = true;
input bool RequireMACDDivergenceConfirmation = true;
input int MACDFastEMA = 12;
input int MACDSlowEMA = 26;
input int MACDSignalEMA = 5;
input int DivergencePivotLookback = 2;
input int DivergenceSearchBars = 200;
input int DivergenceConfirmWindow = 30;
input bool RequireStrongCandleForCircle = false;
input bool CancelSignalOnOppositeHA = true;
input bool ConfirmByCloseBreak = true;
input double ArrowOffsetATR = 0.25;
input double CircleOffsetATR = 0.15;
input int VisualATRPeriod = 14;
input bool EnablePopupAlert = true;
input bool EnablePushAlert = false;
input bool EnableEmailAlert = false;
input bool EnableSoundAlert = false;
input string BuySoundFile = "alert.wav";
input string SellSoundFile = "alert2.wav";
input int AlertCooldownSeconds = 120;
input bool AlertOnlyRealtime = true;
double HAOpen[];
double HAHigh[];
double HALow[];
double HAClose[];
double HAColor[];
double BuyCircle[];
double SellCircle[];
double BuyArrow[];
double SellArrow[];
double ATRBuf[];
double MacdFastBuf[];
double MacdSlowBuf[];
double MacdSignalBuf[];
double MacdHistBuf[];
bool BullDivConfirmed[];
bool BearDivConfirmed[];
#define COL_BULL 0
#define COL_BEAR 1
#define COL_STRONG_BULL 2
#define COL_STRONG_BEAR 3
#define COL_NEUTRAL 4
#define MOM_BODY_WINDOW 14
#define STRONG_WICK_FRAC 0.10
#define CIRCLE_WICK_FRAC 0.15
#define ARROW_BUY_CODE 233
#define ARROW_SELL_CODE 234
#define CIRCLE_CODE 108
int g_firstBar = 1;
int g_confCandles = 3;
bool g_buyPending = false;
double g_buyRefHigh = 0.0;
int g_buyBarsLeft = 0;
bool g_sellPending = false;
double g_sellRefLow = 0.0;
int g_sellBarsLeft = 0;
datetime g_lastClosedTime = 0;
datetime g_lastAlertTime = 0;
int g_lastAlertDir = 0;
datetime g_lastAlertWall = 0;
bool IsBullishHA(const int i)
{
return(HAClose[i] > HAOpen[i]);
}
bool IsBearishHA(const int i)
{
return(HAClose[i] < HAOpen[i]);
}
double GetBodyPercent(const int i)
{
double range = HAHigh[i] - HALow[i];
if(range <= 0.0)
return(0.0);
return(MathAbs(HAClose[i] - HAOpen[i]) / range * 100.0);
}
double AvgHABody(const int i, const int win, const int firstBar)
{
int st = i - win;
if(st < firstBar)
return(0.0);
double s = 0.0;
int c = 0;
for(int k = st; k < i; k++)
{
s += MathAbs(HAClose[k] - HAOpen[k]);
c++;
}
return(c > 0 ? s / c : 0.0);
}
int GetCandleColorIndex(const int i)
{
double range = HAHigh[i] - HALow[i];
bool bull = IsBullishHA(i);
bool bear = IsBearishHA(i);
if(!bull && !bear)
return(COL_NEUTRAL);
if(CandleMode == COLOR_STANDARD)
return(bull ? COL_BULL : COL_BEAR);
if(CandleMode == COLOR_TREND_BASED)
{
if(range <= 0.0)
return(bull ? COL_BULL : COL_BEAR);
double lowerWick = MathMin(HAOpen[i], HAClose[i]) - HALow[i];
double upperWick = HAHigh[i] - MathMax(HAOpen[i], HAClose[i]);
if(bull)
return((lowerWick <= STRONG_WICK_FRAC * range) ? COL_STRONG_BULL : COL_BULL);
else
return((upperWick <= STRONG_WICK_FRAC * range) ? COL_STRONG_BEAR : COL_BEAR);
}
double body = MathAbs(HAClose[i] - HAOpen[i]);
double avgBody = AvgHABody(i, MOM_BODY_WINDOW, g_firstBar);
if(avgBody > 0.0 && body >= 1.2 * avgBody)
return(bull ? COL_STRONG_BULL : COL_STRONG_BEAR);
return(bull ? COL_BULL : COL_BEAR);
}
void ComputeHABar(const int i,
const double &open[], const double &high[],
const double &low[], const double &close[])
{
double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0;
double haOpen = (HAOpen[i - 1] + HAClose[i - 1]) / 2.0;
double haHigh = MathMax(high[i], MathMax(haOpen, haClose));
double haLow = MathMin(low[i], MathMin(haOpen, haClose));
HAOpen[i] = haOpen;
HAClose[i] = haClose;
HAHigh[i] = haHigh;
HALow[i] = haLow;
}
void InitHASeed(const int firstBar,
const double &open[], const double &high[],
const double &low[], const double &close[])
{
double haClose = (open[firstBar] + high[firstBar] + low[firstBar] + close[firstBar]) / 4.0;
double haOpen = (open[firstBar] + close[firstBar]) / 2.0;
HAClose[firstBar] = haClose;
HAOpen[firstBar] = haOpen;
HAHigh[firstBar] = MathMax(high[firstBar], MathMax(haOpen, haClose));
HALow[firstBar] = MathMin(low[firstBar], MathMin(haOpen, haClose));
}
double GetVisualATR(const int i,
const double &high[], const double &low[], const double &close[],
const int firstBar)
{
int p = VisualATRPeriod;
if(p < 1) p = 1;
int st = i - p + 1;
if(st < firstBar) st = firstBar;
if(st < 1) st = 1;
double sum = 0.0;
int n = 0;
for(int k = st; k <= i; k++)
{
double tr = high[k] - low[k];
double a = MathAbs(high[k] - close[k - 1]);
double b = MathAbs(low[k] - close[k - 1]);
if(a > tr) tr = a;
if(b > tr) tr = b;
sum += tr;
n++;
}
double atr = (n > 0) ? sum / n : (high[i] - low[i]);
ATRBuf[i] = atr;
return(atr);
}
bool IsMacdPeak(const int i, const int lookback, const int firstBar, const int lastBar)
{
if(i - lookback < firstBar || i + lookback > lastBar)
return(false);
for(int k = 1; k <= lookback; k++)
{
if(MacdHistBuf[i] <= MacdHistBuf[i - k] || MacdHistBuf[i] <= MacdHistBuf[i + k])
return(false);
}
return(true);
}
bool IsMacdTrough(const int i, const int lookback, const int firstBar, const int lastBar)
{
if(i - lookback < firstBar || i + lookback > lastBar)
return(false);
for(int k = 1; k <= lookback; k++)
{
if(MacdHistBuf[i] >= MacdHistBuf[i - k] || MacdHistBuf[i] >= MacdHistBuf[i + k])
return(false);
}
return(true);
}
void ComputeMACDDivergence(const int rates_total,
const int firstBar,
const int lastClosed,
const double &high[],
const double &low[],
const double &close[])
{
ArrayResize(MacdFastBuf, rates_total);
ArrayResize(MacdSlowBuf, rates_total);
ArrayResize(MacdSignalBuf, rates_total);
ArrayResize(MacdHistBuf, rates_total);
ArrayResize(BullDivConfirmed, rates_total);
ArrayResize(BearDivConfirmed, rates_total);
for(int i = 0; i < rates_total; i++)
{
MacdFastBuf[i] = 0.0;
MacdSlowBuf[i] = 0.0;
MacdSignalBuf[i] = 0.0;
MacdHistBuf[i] = 0.0;
BullDivConfirmed[i] = false;
BearDivConfirmed[i] = false;
}
if(!RequireMACDDivergenceConfirmation)
return;
int fast = MACDFastEMA;
int slow = MACDSlowEMA;
int signal = MACDSignalEMA;
int pivotLookback = DivergencePivotLookback;
int searchBars = DivergenceSearchBars;
if(fast < 1) fast = 1;
if(slow < 1) slow = 1;
if(signal < 1) signal = 1;
if(pivotLookback < 1) pivotLookback = 1;
if(searchBars < 1) searchBars = 1;
if(lastClosed < firstBar + pivotLookback * 2 + 2)
return;
double fastAlpha = 2.0 / ((double)fast + 1.0);
double slowAlpha = 2.0 / ((double)slow + 1.0);
double signalAlpha = 2.0 / ((double)signal + 1.0);
for(int i = firstBar; i <= lastClosed; i++)
{
double price = close[i];
if(i == firstBar)
{
MacdFastBuf[i] = price;
MacdSlowBuf[i] = price;
MacdSignalBuf[i] = 0.0;
MacdHistBuf[i] = 0.0;
continue;
}
MacdFastBuf[i] = fastAlpha * price + (1.0 - fastAlpha) * MacdFastBuf[i - 1];
MacdSlowBuf[i] = slowAlpha * price + (1.0 - slowAlpha) * MacdSlowBuf[i - 1];
double macdMain = MacdFastBuf[i] - MacdSlowBuf[i];
MacdSignalBuf[i] = signalAlpha * macdMain + (1.0 - signalAlpha) * MacdSignalBuf[i - 1];
MacdHistBuf[i] = macdMain - MacdSignalBuf[i];
}
int lastPivot = lastClosed - pivotLookback;
for(int i = firstBar + pivotLookback; i <= lastPivot; i++)
{
if(IsMacdTrough(i, pivotLookback, firstBar, lastClosed))
{
int prevTrough = -1;
int oldest = i - searchBars;
if(oldest < firstBar + pivotLookback)
oldest = firstBar + pivotLookback;
for(int j = i - 1; j >= oldest; j--)
{
if(IsMacdTrough(j, pivotLookback, firstBar, lastClosed))
{
prevTrough = j;
break;
}
}
if(prevTrough >= 0 && low[i] < low[prevTrough] && MacdHistBuf[i] > MacdHistBuf[prevTrough])
BullDivConfirmed[i + pivotLookback] = true;
}
if(IsMacdPeak(i, pivotLookback, firstBar, lastClosed))
{
int prevPeak = -1;
int oldest = i - searchBars;
if(oldest < firstBar + pivotLookback)
oldest = firstBar + pivotLookback;
for(int j = i - 1; j >= oldest; j--)
{
if(IsMacdPeak(j, pivotLookback, firstBar, lastClosed))
{
prevPeak = j;
break;
}
}
if(prevPeak >= 0 && high[i] > high[prevPeak] && MacdHistBuf[i] < MacdHistBuf[prevPeak])
BearDivConfirmed[i + pivotLookback] = true;
}
}
}
bool RecentMACDDivergenceConfirmed(const int i, const bool bullish)
{
if(!RequireMACDDivergenceConfirmation)
return(true);
int window = DivergenceConfirmWindow;
if(window < 0)
window = 0;
int first = i - window;
if(first < g_firstBar)
first = g_firstBar;
for(int k = i; k >= first; k--)
{
if(bullish && BullDivConfirmed[k])
return(true);
if(!bullish && BearDivConfirmed[k])
return(true);
}
return(false);
}
void ClearSignalBuffers(const int from, const int to)
{
for(int i = from; i <= to; i++)
{
BuyCircle[i] = EMPTY_VALUE;
SellCircle[i] = EMPTY_VALUE;
BuyArrow[i] = EMPTY_VALUE;
SellArrow[i] = EMPTY_VALUE;
}
}
void ClearAllBuffers(const int total)
{
for(int i = 0; i < total; i++)
{
HAOpen[i] = EMPTY_VALUE;
HAHigh[i] = EMPTY_VALUE;
HALow[i] = EMPTY_VALUE;
HAClose[i] = EMPTY_VALUE;
HAColor[i] = 0.0;
ATRBuf[i] = 0.0;
BuyCircle[i] = EMPTY_VALUE;
SellCircle[i] = EMPTY_VALUE;
BuyArrow[i] = EMPTY_VALUE;
SellArrow[i] = EMPTY_VALUE;
}
}
void ResetSignalState()
{
g_buyPending = false;
g_buyRefHigh = 0.0;
g_buyBarsLeft = 0;
g_sellPending = false;
g_sellRefLow = 0.0;
g_sellBarsLeft = 0;
}
void FireAlert(const int dir, const string typeText,
Показано первые 50% кода (символов: 17485)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.