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

 
Igor168 #:

Используя данный код, эксперт за одну миллисекунду отправляет сразу три сигнала по одной из указанных в коде валютных пар

Вы что то делаете не так. Всё работает как надо.

bar buy! EURUSDrfd 2024.11.04 21:03:06
bar buy! GBPUSDrfd 2024.11.04 21:03:06
bar buy! AUDUSDrfd 2024.11.04 21:03:06
bar buy! EURUSDrfd 2024.11.04 21:04:00
bar buy! GBPUSDrfd 2024.11.04 21:04:00
bar buy! AUDUSDrfd 2024.11.04 21:04:00
bar buy! EURUSDrfd 2024.11.04 21:05:01
bar buy! GBPUSDrfd 2024.11.04 21:05:01
bar buy! AUDUSDrfd 2024.11.04 21:05:01
bar buy! EURUSDrfd 2024.11.04 21:06:11
bar buy! GBPUSDrfd 2024.11.04 21:06:11
bar buy! AUDUSDrfd 2024.11.04 21:06:11
bar buy! EURUSDrfd 2024.11.04 21:07:00
bar buy! GBPUSDrfd 2024.11.04 21:07:00
bar buy! AUDUSDrfd 2024.11.04 21:07:00
//+------------------------------------------------------------------+
void OnTick()
  {
   string Symb[3] = {"EURUSDrfd", "GBPUSDrfd", "AUDUSDrfd"};
   if(NewBarBasket(Symb) == true)
      for(int i = 0; i < (int)Symb.Size(); i++)
         if(true)
            Print("bar buy! ", Symb[i], " ", TimeCurrent());
  }
//+------------------------------------------------------------------+
bool NewBarBasket(string& Symb[])
  {
   static datetime nextTime = 0;
   MqlTick tick;
   int res = 0;
   for(int i = 0; i < 3; i++)
      if(SymbolInfoTick(Symb[i], tick))
         if(tick.ask != 0 && tick.bid != 0)
            if(tick.time >= nextTime)
               res++;

   if(res == 3)
     {
      int perSec = PeriodSeconds(PERIOD_CURRENT);
      nextTime = tick.time - tick.time % perSec + perSec;
      return true;
     }
   return false;
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

Вы что то делаете не так. Всё работает как надо.

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

 
100% поднималась тема, но не помню, почему это не баг?
void Func( double ) {}
void Func( string ) {}

void OnStart()
{
  Func(0);  // 'Func' - ambiguous call to overloaded function
  Func(0.); // OK
}

Логично, вроде, int -> double.

 
fxsaber #:

Логично, вроде, int -> double.

Почему логично? Почему компилятор должен выбрать именно double, а не string?

 
fxsaber #:
почему это не баг

Если я правильно понимаю, то int --> double не относится даже к стандартному преобразованию (как и int --> string).

Поправьте, если я ошибаюсь

https://www.mql5.com/ru/docs/basis/function/functionoverload

Алгоритм выбора перегруженной функции

  1. Использовать строгое соответствие (если это возможно).
  2. Попробовать стандартное повышение типа.
  3. Попробовать стандартное преобразование типа.

Стандартное повышение типа лучше, чем остальные стандартные преобразования. Повышение - это преобразование float в double, а также bool, char, short или enum в int. Кроме того, к стандартным преобразованиям относятся преобразования массивов похожих целых типов. Похожими типами являются: bool, char, uchar, так как все три типа являются однобайтовыми целыми; двубайтовые целые short и ushort; 4-байтовые целые int, uint и color; long, ulong и datetime.

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

Если вы сомневаетесь, используйте явные преобразования для обеспечения строгого соответствия.

 
Vladislav Boyko #:

Почему логично?

Потому что числа. Если в C++ такая же байда - проехали.

 
fxsaber #:

Потому что числа. Если в C++ такая же байда - проехали.

Если:

void Func(double) 
{
}

void Func(char*) 
{
}

то:

Ошибка  C2668   Func: неоднозначный вызов перегруженной функции  

А если:

void Func(double) 
{
}

void Func(std::string) 
{
}

то тогда ок.

 
Подарите кто-нибудь vps на 1 день...
 
fxsaber #:

Потому что числа. Если в C++ такая же байда - проехали.

#include <iostream>

void Func( double ) {
    std::cout<<"Func(double) OK\n";
}
void Func( std::string ) {
    std::cout<<"Func(string) OK\n";
}
int main()
{
  Func(0);
  Func(0.);
}

Func(double) OK

Func(double) OK

 
Есть хороший индикатор,точнее прокладка...в него вписываешь наименование индикатора и номера буферов по которым нужны стрелки. Он даже может объединять два индикатора по которым нужна одна стрелка и звуковой сигнал. Но проблема в том,что сигнал раздается на каждый тик! Может кто поможет с этим,что бы сигнал выдавался только один раз в момент появления стрелки.
Файлы:
p9cmb4.mq4  17 kb