Вы упустили суть. Пост, на который вы ссылаетесь, был о том, КАК получить сигнал от советника, вы, очевидно, не можете получить его, просто получив значения последних 2 свечей, вам нужен третий.
Невозможно иметь ранний сигнал, потому что для обнаружения дивергенции вам нужен пик/корыто, а для этого вам нужна дополнительная свеча, которая закрывается. Поэтому, когда свеча 0 только что открылась, это означает, что свеча 1 уже закрыта, и это позволяет подтвердить пик/корыто на свече 2. Если кто-то хочет модифицировать индикатор, чтобы использовать неподтвержденные пики/корыта для получения раннего сигнала, то это можно сделать, но я не буду помогать в этом, потому что это плохая идея, так как вы получите много плохих сигналов.
Что можно было бы сделать, так это рисовать сигнал на свече 1 или даже на свече 0, но это ничего не изменит, и я решил рисовать сигнал на свече, которая действительно показывает пик/корыто.
Я изменил код, и вы правы. Вы получаете ложные движения перед фактической дивергенцией. Спасибо за ваше время на это.
Вы упустили суть. Пост, на который вы ссылаетесь, был о том, КАК получить сигнал от советника, вы, очевидно, не можете получить его, просто получив значения последних 2 свечей, вам нужен третий.
Невозможно иметь ранний сигнал, потому что для обнаружения дивергенции вам нужен пик/корыто, а для этого вам нужна дополнительная свеча, которая закрывается. Поэтому, когда свеча 0 только что открылась, это означает, что свеча 1 закрыта, и это позволяет подтвердить пик/корыто на свече 2. Если кто-то хочет модифицировать индикатор, чтобы использовать неподтвержденные пики/корыта для получения раннего сигнала, то это можно сделать, но я не буду помогать в этом, потому что это плохая идея, так как вы получите много плохих сигналов.
Что можно было бы сделать, так это рисовать сигнал на свече 1 или даже на свече 0, но это ничего не изменит, и я решил рисовать сигнал на свече, которая действительно показывает пик/корыто.
Возможно, вы также упустили один момент.
В случае с графиками ренко текущий бар (в основном) уже закрыт, поэтому вам нужно на одну свечу меньше. Или я что-то упускаю?
Привет, Алена, очень хороший индикатор, он хорошо работает даже без настройки параметров. Хорошо, что в нем есть оповещения, но мне не хватает одной вещи - возможности отправлять push-уведомления на телефон. То же сообщение, которое появляется на всплывающем оповещении, чтобы оно отправлялось на мой телефон. Можете ли вы добавить эту функцию? Это было бы очень любезно с вашей стороны.
Сигнал подается при закрытии свечи, 1 свеча в прошлом (2, если считать открытую свечу, а не 3). Это нормально и так должно работать. Дивергенция основана на исследовании экстремума (верх/низ). Если у вас есть способ определить экстремум на текущей свече, я предлагаю вам изучить программирование и предоставить нам, бесплатно, эту замечательную инновацию.
Привет, Ален. Очень хороший индикатор. Он делает правильные сигналы.
BTW в части "//--- Bearish divergence is found" должно было быть "divergenceStyle" вместо "STYLE_SOLID".
Индикатор полностью не перерисовывается. Для своей цели я решил сделать небольшую модификацию, чтобы сделать последний бар индикатора перерисовываемым, а также сигнал дивергенции.
Индикатор будет показывать сигнал дивергенции на предыдущем баре, обязательно перерисовываемый. Это будет полезно на быстрых таймфреймах, чтобы использовать сигнал непосредственно перед закрытием бара.
Я сделал изменения:
- удалил всю часть "//--- индикатор обновляется только на новой свече, кроме полного перерисовывания"
- "start=prev_calculated-2;" был заменен на "start=prev_calculated-1;"
- В части "//--- основной цикл вычислений" "for(int shift=start; shift<rates_total-2; shift++)" изменен на "for(int shift=start; shift<rates_total-1; shift++)".
Сигнал дивергенции теперь появляется на предыдущем баре, но замирает в момент появления и не следует за линией индикатора на этом баре.
Я изменил эту часть и решил проблему. Возможно, это можно было сделать лучше и проще, но это работает. Стрелки переместились на 1 бар вперед. Линии без стрелок - неподтвержденные сигналы.
//--- индикатор обновляется только на новой свече, за исключением полного перерисовывания// static datetime lastCandleTime=0;// if(lastCandleTime==time[rates_total-1])// return(rates_total);// else// lastCandleTime=time[rates_total-1];//--- был изменен первый расчет или количество баровint start;
if(prev_calculated<=0)
{
start=slowEMA;
ArrayInitialize(bullishDivergence,EMPTY_VALUE); // буферы расхождений должны быть инициализированыArrayInitialize(bearishDivergence,EMPTY_VALUE);
}
else
{
start=prev_calculated-1;
bullishDivergence[rates_total-1]=EMPTY_VALUE;
bearishDivergence[rates_total-1]=EMPTY_VALUE;
}
//--- количество данных (буферов macd) для копирования int toCopy=rates_total-prev_calculated+(prev_calculated<=0 ? 0 : 1);
//--- не все данные могут быть рассчитаныint calculated=BarsCalculated(macdHandle);
if(calculated<rates_total)
{
Print("Not all data of macdHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- получить основной буфер MACDif(IsStopped()) return(0); //Проверка наличия флага остановкиif(CopyBuffer(macdHandle,MAIN_LINE,0,toCopy,macdBuffer)<=0)
{
Print("Getting MACD Main is failed! Error : ",GetLastError());
return(0);
}
//--- получить сигнальный буфер MACDif(IsStopped()) return(0); //Проверка наличия флага остановкиif(CopyBuffer(macdHandle,SIGNAL_LINE,0,toCopy,signalBuffer)<=0)
{
Print("Getting MACD Signal is failed! Error : ",GetLastError());
return(0);
}
//--- основной цикл вычисленийfor(int shift=start; shift<rates_total; shift++)
{
int currentExtremum,lastExtremum;
bool isBullishDivergence,isBearishDivergence;
string divergenceMsg;
ENUM_LINE_STYLE divergenceStyle=0;
//--- Поймать бычье расхождение
isBullishDivergence=false;
if(macdBuffer[shift-1]<=macdBuffer[shift-2] &&
macdBuffer[shift-1]<macdBuffer[shift-3] &&
macdBuffer[shift-1]<macdBuffer[shift])
//--- если текущий macd main является дном (ниже, чем 2 предыдущих и 1 следующий)
{
currentExtremum=shift;
lastExtremum=GetIndicatorLastTrough(shift);
//--- if(macdBuffer[currentExtremum-1]>macdBuffer[lastExtremum] &&
low[currentExtremum-1]<low[lastExtremum])
{
isBullishDivergence=true;
divergenceMsg="Classical bullish divergence on: ";
divergenceStyle=STYLE_SOLID;
}
//--- if(macdBuffer[currentExtremum-1]<macdBuffer[lastExtremum] &&
low[currentExtremum-1]>low[lastExtremum])
{
isBullishDivergence=true;
divergenceMsg="Reverse bullish divergence on: ";
divergenceStyle=STYLE_DOT;
}
//--- Обнаружена бычья дивергенцияif(isBullishDivergence)
{
bullishDivergence[currentExtremum]=macdBuffer[currentExtremum]-ARROWS_DISPLACEMENT;
//---if(drawPriceTrendLines==true)
DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum-1],time[lastExtremum],low[currentExtremum-1],low[lastExtremum],Green,divergenceStyle);
//---if(drawIndicatorTrendLines==true)
DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum-1],time[lastExtremum],macdBuffer[currentExtremum-1],macdBuffer[lastExtremum],Green,divergenceStyle);
//---if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum-1]!=lastAlertTime)
DisplayAlert(divergenceMsg,time[currentExtremum-1]);
}
}
//--- Поймать медвежье расхождение
isBearishDivergence=false;
if(macdBuffer[shift-1]>=macdBuffer[shift-2] &&
macdBuffer[shift-1]>macdBuffer[shift-3] &&
macdBuffer[shift-1]>macdBuffer[shift])
//--- если текущий macd main является вершиной (выше, чем 2 предыдущих и 1 следующий)
{
currentExtremum=shift;
lastExtremum=GetIndicatorLastPeak(shift);
//--- if(macdBuffer[currentExtremum-1]<macdBuffer[lastExtremum] &&
high[currentExtremum-1]>high[lastExtremum])
{
isBearishDivergence=true;
divergenceMsg="Classical bearish divergence on: ";
divergenceStyle=STYLE_SOLID;
}
if(macdBuffer[currentExtremum-1]>macdBuffer[lastExtremum] &&
high[currentExtremum-1]<high[lastExtremum])
{
isBearishDivergence=true;
divergenceMsg="Reverse bearish divergence on: ";
divergenceStyle=STYLE_DOT;
}
//--- Обнаружена медвежья дивергенцияif(isBearishDivergence)
{
bearishDivergence[currentExtremum]=macdBuffer[currentExtremum]+ARROWS_DISPLACEMENT;
//---if(drawPriceTrendLines==true)
DrawTrendLine(TRENDLINE_MAIN,time[currentExtremum-1],time[lastExtremum],high[currentExtremum-1],high[lastExtremum],Red,divergenceStyle);
//---if(drawIndicatorTrendLines==true)
DrawTrendLine(TRENDLINE_INDICATOR,time[currentExtremum-1],time[lastExtremum],macdBuffer[currentExtremum-1],macdBuffer[lastExtremum],Red,divergenceStyle);
//---if(displayAlert==true && shift>=rates_total-3 && time[currentExtremum-1]!=lastAlertTime)
DisplayAlert(divergenceMsg,time[currentExtremum-1]);
}
}
}
//--- возвращаем значение prev_calculated для следующего вызоваreturn(rates_total);
}
//+------------------------------------------------------------------+//| Поиск последней впадины|//+------------------------------------------------------------------+int GetIndicatorLastTrough(int shift)
{
for(int i=shift-6; i>=2; i--)
{
if(signalBuffer[i] <= signalBuffer[i-1] && signalBuffer[i] <= signalBuffer[i-2] &&
signalBuffer[i] <= signalBuffer[i+1] && signalBuffer[i] <= signalBuffer[i+2])
{
for(int j=i; j>=2; j--)
{
if(macdBuffer[j] <= macdBuffer[j-1] && macdBuffer[j] < macdBuffer[j-2] &&
macdBuffer[j] <= macdBuffer[j+1] && macdBuffer[j] < macdBuffer[j+2])
return(j);
}
}
}
return(0);
}
//+------------------------------------------------------------------+//| Поиск последнего пика|//+------------------------------------------------------------------+int GetIndicatorLastPeak(int shift)
{
for(int i=shift-6; i>=2; i--)
{
if(signalBuffer[i] >= signalBuffer[i-1] && signalBuffer[i] >= signalBuffer[i-2] &&
signalBuffer[i] >= signalBuffer[i+1] && signalBuffer[i] >= signalBuffer[i+2])
{
for(int j=i; j>=2; j--)
{
if(macdBuffer[j] >= macdBuffer[j-1] && macdBuffer[j] > macdBuffer[j-2] &&
macdBuffer[j] >= macdBuffer[j+1] && macdBuffer[j] > macdBuffer[j+2])
return(j);
}
}
}
return(0);
}
//+------------------------------------------------------------------+//| ENUM_TRENDLINE_TYPE используется в DrawTrendLine |//+------------------------------------------------------------------+
когда дивергенция нулевая линия ниже также ценообразование HL дно (цена, если не сделано снова LL) гистограмма любой другой 5 30 60 240 тф 3 тф подписаны на плодотворный
Вы упустили суть. Пост, на который вы ссылаетесь, был о том, КАК получить сигнал от советника, вы, очевидно, не можете получить его, просто получив значения последних 2 свечей, вам нужен третий.
Невозможно иметь ранний сигнал, потому что для обнаружения дивергенции вам нужен пик/корыто, а для этого вам нужна дополнительная свеча, которая закрывается. Поэтому, когда свеча 0 только что открылась, это означает, что свеча 1 уже закрыта, и это позволяет подтвердить пик/корыто на свече 2. Если кто-то хочет модифицировать индикатор, чтобы использовать неподтвержденные пики/корыта для получения раннего сигнала, то это можно сделать, но я не буду помогать в этом, потому что это плохая идея, так как вы получите много плохих сигналов.
Что можно было бы сделать, так это рисовать сигнал на свече 1 или даже на свече 0, но это ничего не изменит, и я решил рисовать сигнал на свече, которая действительно показывает пик/корыто.
Вы упустили суть. Пост, на который вы ссылаетесь, был о том, КАК получить сигнал от советника, вы, очевидно, не можете получить его, просто получив значения последних 2 свечей, вам нужен третий.
Невозможно иметь ранний сигнал, потому что для обнаружения дивергенции вам нужен пик/корыто, а для этого вам нужна дополнительная свеча, которая закрывается. Поэтому, когда свеча 0 только что открылась, это означает, что свеча 1 закрыта, и это позволяет подтвердить пик/корыто на свече 2. Если кто-то хочет модифицировать индикатор, чтобы использовать неподтвержденные пики/корыта для получения раннего сигнала, то это можно сделать, но я не буду помогать в этом, потому что это плохая идея, так как вы получите много плохих сигналов.
Что можно было бы сделать, так это рисовать сигнал на свече 1 или даже на свече 0, но это ничего не изменит, и я решил рисовать сигнал на свече, которая действительно показывает пик/корыто.
Возможно, вы также упустили один момент.
В случае с графиками ренко текущий бар (в основном) уже закрыт, поэтому вам нужно на одну свечу меньше. Или я что-то упускаю?
Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий
macd divegence
ENEZA PETER MKIRAMWENI, 2021.09.12 12:26
помогите пожалуйста с этим индикатором он выводит алерт после трех баров я хочу выводить алерт сразу после 1 бара
Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий
Индикаторы: Дивергенция MACD
Alain Verleyen, 2013.11.05 19:14
Так дружелюбно.
Сигнал подается при закрытии свечи, 1 свеча в прошлом (2, если считать открытую свечу, а не 3). Это нормально и так должно работать. Дивергенция основана на исследовании экстремума (верх/низ). Если у вас есть способ определить экстремум на текущей свече, я предлагаю вам изучить программирование и предоставить нам, бесплатно, эту замечательную инновацию.
Спасибо за ваш вклад.
Я изменил эту часть и решил проблему. Возможно, это можно было сделать лучше и проще, но это работает. Стрелки переместились на 1 бар вперед. Линии без стрелок - неподтвержденные сигналы.
когда дивергенция нулевая линия ниже также ценообразование HL дно (цена, если не сделано снова LL) гистограмма любой другой 5 30 60 240 тф 3 тф подписаны на плодотворный
Здравствуйте, Ален,
Большое спасибо за этот замечательный индикатор!
Я пытаюсь использовать значения Data Window этого индикатора внутри советника (см. вложение).
Я использую ту же логику для всех четырех индексов, но мне удается получить правильные значения только для двух последних (Main и Signal).
Для первых двух я всегда вижу фиксированное число
в то время как, согласно приложенному примеру, один из них должен иметь правильное значение, а другой - 0/пустой
Вы знаете, почему у меня такая проблема?
Спасибо