Ошибки, баги, вопросы - страница 3209

 
Sergey Gridnev #:
Тут нет переопределения.
Чтобы не путаться, используйте сцификатор override в случаях, когда собираетесь что-то переопределить в потомке, и компилятор выдаст ошибку, если в родителе нет такого метода.

Да, я ошибся в термине. Здесь перегрузка, как выше сказали.

Просто для обычных методов перегрузка "закрывает" (непомню правильный терами) видимость одноименных методов предка, т.е. к ним нужно обращаться через полное имя класса::метод.

В моем примере, если бы здесь был не оператор, а метод, то компилятор выдает предупреждение. Мне кажется, что для оператора= было бы полезно такое же предупреждение.

 

Ошибка и невозможность использовать сервис.

Как видно из скриншота - код не содержит ничего подозрительного.

Однако сервер ответил ошибкой. После чего Едитор бомбардирует его запросами на коннект - хотя я уже не пытаюсь использовать этот сервис.

Это вообще можно исправить?

Мое окружение:

 
Доброго времени суток! Из 20 свечей нужно выбрать 3 с большими ценами. Свечу с максимальной  ценой определяю прям по учебнику
   index = iHighest(Symbol(), TF, MODE_HIGH, 20, 1);
   if(index != -1)
      price_max1 = High[index];//Максимальная цена
   else
      PrintFormat("Ошибка вызова iHighest. Код ошибки=%d", GetLastError());

Для второй по цене свечи использую цикл

for(i = 1; i < 20; i++)
     {
      high = iHigh(Symbol(), TF, i);
      if(i == 1)
        {
         if(high == price_max1)
            continue;
         else
            price_max2 = high;
        }
      else
        {
         if(high == price_max1)
            continue;
         else
            if(high >= price_max2)
               price_max2 = high;
                 
        }
     }
Print("MAX цена №2 = ", price_max2);
Как найти третью свечу с большей ценой (price_max3)? Ещё один цикл лепить? Он ещё объёмней получается, ведь теперь нужно исключить из результата уже две свечи с ценами price_max1 и price_max2. В целом как-то все коряво и громоздко получается. Нельзя ли сделать выборку price_max1, price_max2 и price_max3 за один цикл? Или ещё как-то проще?
 
Oleksandr Nozemtsev #:
Доброго времени суток! Из 20 свечей нужно выбрать 3 с большими ценами. Свечу с максимальной  ценой определяю прям по учебнику

Для второй по цене свечи использую цикл

Как найти третью свечу с большей ценой (price_max3)? Ещё один цикл лепить? Он ещё объёмней получается, ведь теперь нужно исключить из результата уже две свечи с ценами price_max1 и price_max2. В целом как-то все коряво и громоздко получается. Нельзя ли сделать выборку price_max1, price_max2 и price_max3 за один цикл? Или ещё как-то проще?

Интересная задача.

Я не проверял, но пошёл-бы таким путём…

  1. CopyHigh двадцати баров.
  2. ArrayMaximum из этого массива
  3. ArrayRemove найденного индекса
  4. ArrayMaximum из остатка от массива
  5. Ещё раз ArrayRemove 
  6. И ещё раз ArrayMaximum 
Когда и куда сохранять полученные значения дело каждого.
 
Alexey Viktorov #:

Интересная задача.

Я не проверял, но пошёл-бы таким путём…

  1. CopyHigh двадцати баров.
  2. ArrayMaximum из этого массива
  3. ArrayRemove найденного индекса
  4. ArrayMaximum из остатка от массива
  5. Ещё раз ArrayRemove 
  6. И ещё раз ArrayMaximum 
Когда и куда сохранять полученные значения дело каждого.

Погоди, зачем? Сортировать массив по убыванию/возрастанию и брать три свечи с краю - в зависимости от направления сортировки.

 
Artyom Trishkin #:

Погоди, зачем? Сортировать массив по убыванию/возрастанию и брать три свечи с краю - в зависимости от направления сортировки.

И то верно. Но ведь мы лёгких путей не ищем…

Я видимо в подсознании думал об индексе свечи на графике… А после сортировки индексы потеряются.
 
Alexey Viktorov #:

И то верно. Но ведь мы лёгких путей не ищем…

Я видимо в подсознании думал об индексе свечи на графике… А после сортировки индексы потеряются.

Да, потеряются. Тоже подумал об этом. Но цены-то есть - можно по ценам и свечу найти в истории того отрезка, из которого брали выборку. Проблема при двух и более одинаковых ценах.

Но тогда создавать объект из свечи и пихать его в массив объектов - там можно будет сортировать по любому признаку без потери остальных данных.

 
ArraySortStruct2_Define(high) // https://www.mql5.com/ru/forum/170952/page222#comment_40289584

void OnStart()
{
  MqlRates Rates[];
  
  CopyRates(_Symbol, PERIOD_CURRENT, 0, 20, Rates);
  
  ArraySortStruct2(Rates, high); // Сортировка по high
  
  ArrayPrint(Rates);
}
 
fxsaber #:

ArraySortStruct2(Rates, high) - это mql5? А как в 4й версии отсортировать по хаям? 

 

bild 3323

Почему поведение индикаторов и советников отличается при инициализации?

При инициализации индикатора (первый запуск, смена любого input-параметра, смена TF-чарта) происходит сброс ВСЕХ глобальных переменных индикатора. С какой целью так сделано? Я понимаю сброс буферов индикаторов, но зачем сбрасывать глобальные переменные? Это чрезвычайно неудобно, так как нет возможности сохранять рабочую информацию в переменных.

При инициализации советника всё происходит как и ожидается, глобальные переменные остаются в сохранности.

Убедительная просьба к разработчикам, сделайте пожалуйста поведение индикаторов при инициализации так как в советниках.

Коды индикатора и советника в качестве доказательства:

#property indicator_chart_window

input int      Input1 = 1;

int a = 0;
int b = 0;

int OnInit()
{
  if (a != Input1)
  {
    Print ("a!");
    a = Input1;
  }
  if (b == 0)
  {
    Print ("b!");
    b = 100;
  }
  Print (a, " ", b);
  return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  return(rates_total);
}
input int      Input1 = 1;

int a = 0;
int b = 0;

int OnInit()
{
  if (a != Input1)
  {
    Print ("a!");
    a = Input1;
  }
  if (b == 0)
  {
    Print ("b!");
    b = 100;
  }
  Print (a, " ", b);
  return(INIT_SUCCEEDED);
}
Причина обращения: