У меня странный случай, который я не могу понять. Я разработал собственный индикатор, который рассчитывает индекс, по которому я буду принимать торговые решения. Индикатор использует три периода времени, чтобы проверить, является ли тренд устойчивым или нет. Первый - одна минута, второй - 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
}
пс: boolIncl1Min всегда верно..