Здравствуй,
У меня есть скользящий показатель скользящих средних, который выдает предупреждение каждый раз, когда скользящие средние пересекаются.
Я бы хотел, чтобы индикатор выдавал предупреждение только тогда, когда только что произошел крест (т. Е. На текущем баре). Однако, с этим индикатором, каждый раз, когда я открываю MT4 или переключаюсь между таймфреймами, я получаю предупреждения, хотя крест произошел 2-3 бара назад.
Вот копия приведенного ниже кода. Большое спасибо.
#property indior_chart_window
#property indior_buffers 2
#property indior_color1 DarkGoldenrod
#property indior_color2 FireBrick
double CrossUp [];
double CrossDown [];
extern int FasterEMA = 1;
extern int SlowerEMA = 50;
extern bool SoundON = true;
double alertTag;
двойной контроль = 2147483647;
// ----------------------------------------------- -------------------
//| Пользовательская функция инициализации индикатора |
// ----------------------------------------------- -------------------
int init ()
{
//---- индикаторы
SetIndexStyle (0, DRAW_ARROW, EMPTY, 1);
SetIndexArrow (0, 233);
SetIndexBuffer (0, CrossUp);
SetIndexStyle (1, DRAW_ARROW, EMPTY, 1);
SetIndexArrow (1, 234);
SetIndexBuffer (1, CrossDown);
//----
Возвращение (0);
}
// ----------------------------------------------- -------------------
//| Пользовательская функция деинициализации индикатора |
// ----------------------------------------------- -------------------
int deinit ()
{
//----
//----
Возвращение (0);
}
// ----------------------------------------------- -------------------
//| Пользовательская функция итерации индикатора |
// ----------------------------------------------- -------------------
int start () {
int limit, i, counter;
double speedEMAnow, slowerEMAnow, быстрееEMAprevious, slowerEMArerevious, fastEMAafter, slowerEMAafter;
double Range, AvgRange;
int counted_bars = IndiorCounted ();
//---- проверить возможные ошибки
if (counted_barslt; 0) return (-1);
//---- последний подсчитанный балл будет пересчитан
if (counted_barsgt; 0) counted_bars--;
предел = Bars-counted_bars;
для (i = 0; i lt; = limit; i ) {
Счетчик = я;
Диапазон = 0;
AvgRange = 0;
for (counter = i; counterlt; = i 9; counter )
{
AvgRange = AvgRange MathAbs (высокий [счетчик] -Low [счетчик]);
}
Диапазон = AvgRange10;
fastEMAnow = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i);
fastEMAprevious = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i 1);
fastEMAafter = iMA (NULL, 0, FasterEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
slowerEMAnow = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i);
slowerEMAprevious = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i 1);
slowerEMAafter = iMA (NULL, 0, SlowerEMA, 0, MODE_EMA, PRICE_CLOSE, i-1);
if ((быстрееEMAnow gt, slowerEMAnow) (быстрееEMAprevious lt; slowerEMAprevious) (быстрееEMAafter gt; slowerEMAafter)) {
CrossUp [i] = Low [i] - Диапазон * 0,5;
}
else if ((более быстрыйEMAnow lt; slowerEMAnow) (более быстрыйEMAprevious gt; slowerEMAprevious) (быстрее EMAafter lt; slowerEMAafter)) {
CrossDown [i] = High [i] Range * 0.5;
}
if (SoundON == true i == 1 CrossUp [i]] CrossDown [i] alertTag! = Time [0]) {
Предупреждение (MACD 0 cross DOWN on, Symbol (),, Period ());
alertTag = Время [0];
SendNotifiion (MACD 0 cross DOWN on _Symbol);
}
if (SoundON == true i == 1 CrossUp [i] lt; CrossDown [i] alertTag! = Time [0]) {
Предупреждение (MACD 0 переходят вверх, Символ (),, Период ());
alertTag = Время [0];
SendNotifiion (MACD 0 скрещивается на _Symbol);
}
}
Возвращение (0);
}