Нажатие на обновление иногда приводит к различным результатам пользовательского индикатора
У меня странный случай, который я не могу понять. Я разработал собственный индикатор, который рассчитывает индекс, по которому я буду принимать торговые решения. Индикатор использует три периода времени, чтобы проверить, является ли тренд стабильным или нет. Первый - одна минута, второй - 5 минут и, наконец, 30 минут. Я рассчитываю соответствующий бар для проверки больших периодов времени, чтобы они соответствовали минутному бару.
Мое тестирование показывает, что числа рассчитаны правильно.
Этот индикатор прикреплен к одноминутному графику. Много раз я буду щелкать правой кнопкой мыши и выбирать обновление, и индикатор будет меняться в течение последних 5 - 10 минут! Я не могу найти причину, почему это сделало бы это. Я пробовал нажимать кнопку "Обновить" после каждой минуты, а иногда она менялась, а иногда нет. Однако, даже если я нажимаю после каждой минуты на графике, иногда изменения будут через 5-10 минут назад.
Не могли бы вы мне помочь?
Я включил мой код для вашей помощи:
int start() // Special function start()
{
int i, // Bar index
iLook = 0,
iCurrMinute = 0,
iMinFloor = 0,
iMinsAdd = 0,
Counted_bars, // Number of counted bars
iCalcVal,
iTrendConsistency;
double EMA_1min_10_current, EMA_1min_10_prev,
EMA_5min_10_current, EMA_5min_10_prev,
EMA_30min_10_current, EMA_30min_10_prev,
EMA_1min_20_current, EMA_1min_20_prev,
EMA_5min_20_current, EMA_5min_20_prev,
EMA_30min_20_current, EMA_30min_20_prev,
dblMinRemain = 0;
datetime dtBarTime;
//--------------------------------------------------------------------
Counted_bars=IndicatorCounted(); // Number of counted bars
i=Bars-Counted_bars-1; // Index of the first uncounted
while(i>=0) // Loop for uncounted bars
{
iCalcVal = 0;
iTrendConsistency = 0;
dtBarTime = iTime(NULL,PERIOD_M1,i);
// Calculate trend consistency
if (boolIncl1Min)
{
iLook = i;
EMA_1min_10_current = iMA(NULL,PERIOD_M1,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_1min_10_prev = iMA(NULL,PERIOD_M1,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);
EMA_1min_20_current = iMA(NULL,PERIOD_M1,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_1min_20_prev = iMA(NULL,PERIOD_M1,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);
if (EMA_1min_10_current > EMA_1min_20_current) iTrendConsistency++;
if (EMA_1min_10_current < EMA_1min_20_current) iTrendConsistency--;
if (EMA_1min_10_current > EMA_1min_10_prev) iTrendConsistency++;
if (EMA_1min_10_current < EMA_1min_10_prev) iTrendConsistency--;
if (EMA_1min_20_current > EMA_1min_20_prev) iTrendConsistency++;
if (EMA_1min_20_current < EMA_1min_20_prev) iTrendConsistency--;
if (iClose(NULL,PERIOD_M1,iLook) > EMA_1min_10_current) iTrendConsistency++;
if (iClose(NULL,PERIOD_M1,iLook) < EMA_1min_10_current) iTrendConsistency--;
}
if (boolIncl5Min)
{
iLook = i;
if (boolIncl1Min) iLook = iBarShift(NULL,PERIOD_M5,dtBarTime,true);
EMA_5min_10_current = iMA(NULL,PERIOD_M5,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_5min_10_prev = iMA(NULL,PERIOD_M5,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);
EMA_5min_20_current = iMA(NULL,PERIOD_M5,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_5min_20_prev = iMA(NULL,PERIOD_M5,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);
if (EMA_5min_10_current > EMA_5min_20_current) iTrendConsistency++;
if (EMA_5min_10_current < EMA_5min_20_current) iTrendConsistency--;
if (EMA_5min_10_current > EMA_5min_10_prev) iTrendConsistency++;
if (EMA_5min_10_current < EMA_5min_10_prev) iTrendConsistency--;
if (EMA_5min_20_current > EMA_5min_20_prev) iTrendConsistency++;
if (EMA_5min_20_current < EMA_5min_20_prev) iTrendConsistency--;
if (iClose(NULL,PERIOD_M5,iLook) > EMA_5min_10_current) iTrendConsistency++;
if (iClose(NULL,PERIOD_M5,iLook) < EMA_5min_10_current) iTrendConsistency--;
}
if(boolIncl30Min)
{
iLook = i;
if (boolIncl1Min) iLook = iBarShift(NULL,PERIOD_M30,dtBarTime,true);
EMA_30min_10_current = iMA(NULL,PERIOD_M30,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_30min_10_prev = iMA(NULL,PERIOD_M30,intMAShort,0,MODE_EMA,PRICE_CLOSE,iLook+1);
EMA_30min_20_current = iMA(NULL,PERIOD_M30,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook);
EMA_30min_20_prev = iMA(NULL,PERIOD_M30,intMAMedium,0,MODE_EMA,PRICE_CLOSE,iLook+1);
if (EMA_30min_10_current > EMA_30min_20_current) iTrendConsistency++;
if (EMA_30min_10_current < EMA_30min_20_current) iTrendConsistency--;
if (EMA_30min_10_current > EMA_30min_10_prev) iTrendConsistency++;
if (EMA_30min_10_current < EMA_30min_10_prev) iTrendConsistency--;
if (EMA_30min_20_current > EMA_30min_20_prev) iTrendConsistency++;
if (EMA_30min_20_current < EMA_30min_20_prev) iTrendConsistency--;
if (iClose(NULL,PERIOD_M30,iLook) > EMA_30min_10_current) iTrendConsistency++;
if (iClose(NULL,PERIOD_M30,iLook) < EMA_30min_10_current) iTrendConsistency--;
}
Trend_Consistency[i]= iTrendConsistency;
i--; // Calculating index of the next bar
}
ps: boolIncl1Min всегда верно..
1 ответ
В конце концов я понял ответ, который ускользал от меня в течение нескольких дней! Условие для либо 5-минутного, либо 30-минутного графика изменяется во время самого последнего бара. Минутные бары записывают условия 5 и 30 минут каждую минуту. Если я нажму кнопку "Обновить", прошедшие бары теперь будут твердыми и, следовательно, могут быть окончательно рассчитаны.
Код потребуется для обновления прошлых баров, если эти условия изменятся, если вы захотите его иметь.
Спасибо, что решили помочь мне.