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

 
МК, почему вы не добавляете нормальные функции для бинарного поиска в стандартную библиотеку? ArrayBsearch применима лишь в простых случаях, когда типы простые и не нужен пользовательский компаратор. Шаблоны есть, сделать обвертку над c++::std::lower/upper_bound. Пока приходиться писать самому, что ненормально (почти польностью скопировал с cppreference).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

В процессе возникло пара вопросов:
1. Почему нельзя написать operator() у Comp (почему-то запрещено)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. Почему нельзя передать prvalue в функцию принимающую константную ссылку, вроде обычная практика?
lower_bound(ar, 6, cmp) ); // ошибка
ЗЫ: и ещё очень раздражает это предупреждение: "struct has no members, size assigned to 1 byte "
 
coderex:

Все у них там нормально, размещение заявки нужно контролировать через OnTradeTransaction, кстати если напрямую подключиться к бирже через Plaza2 то ситуация такая же - нужно контролировать приход сообщений о размещении заявки. А в МТ4 данная функция синхронная, но такой же вариант есть и в МТ5, только в этом случае у вас логика будет останавливаться пока функция не получит ответ.

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

Чтобы контролировать заявку, нужно ЗАПОМИНАТЬ сам факт ее размещения. Класс скидывайте.
 
fxsaber:
Очень прошу Вас выложить что-нибудь в кодобазу! Для образовательных целей.

Не могу по причине на которую вы сами указывали https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Недавно не cмог локализовать ошибку, потратил много времени, чтобы сформировать исходный код в сервисдеск - в итоге ничего не получилось из-за множества перекрестных ссылок (одно тянет за собой другое в геометрической прогрессии) - отправил .ex5

В образовательных целях могу предложить задачу: не вводя дополнительных переменных упростить h() так, чтобы f() вызывалась в любом случае единожды 

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Ошибка при компиляции

(*) В общем случае в шаблоне (1) вместо T возможна подстановка как A->(2), так и const A->(3).

Это почему? Шаблон с const не может принимать не-const - это нарушает контракт.

 
A100:

В образовательных целях могу предложить задачу: не вводя дополнительных переменных упростить h() так, чтобы f() вызывалась в любом случае единожды 

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

Это почему? Шаблон с const не может принимать не-const - это нарушает контракт.

Шаблон он не сам по себе (в отличии от функции) - его задача выполнить замену (по аналогии с #define). Если по итогам замены противоречий нет (а их там нет) то шаблон со своей задачей справился. По крайней мере я пробовал компилировать это в С++ и компилятор не выдавал ошибок или предупреждений 
 
fxsaber:
Это не совсем упрощение. В исходном варианте MACRO+2*f+g1+g2=5 - у вас: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

Кто-нибудь сталкивался с подобной проблемой? "Баг" терминала или мой?

А что возвращает GetLastError() ?
 
fxsaber:

MT5-OrderSend НЕ полностью синхронизирован - с торговым окружением синхронизации нет. Это значит, что показания истории не соответствуют реальному положению вещей.

Ни о каком timeout и речи быть не может. Надежного решения проблемы нет, т.к. вопросами синхронизации приходится заниматься на уровне терминала, а не сервера.

Фактически, MT5-пользователи столкнулись с тем, с чем сталкивались разработчики бриджей на MT4.

Если отправляется OrderSend, то надо ЗАПОМНИТЬ (вот здесь потенциальная уязвимость), что это сделано. Далее не обращать внимание на текущую историю (торговое окружение), пока не придет соответствующее сообщение в OnTrade. Как только оно прийдет, ЗАПОМНЕННОЕ нужно ЗАБЫТЬ.

Когда нет ЗАПОМНЕННЫХ данных, можно доверять истории, как в MT4. 

MT4-OrderSend ПОЛНОСТЬЮ синхронизирован.
Интересно - по какой причине так сделано ...
Я понимаю, если мудрить с асинхронным OrderSendAsync, то можно обрабатывать и OnTrade и OnTradeTransaction. C OrderSend хотелось бы простого поведения, как в  MT4. Вызвал и на выходе получил уже измененные открытые позиции и историю.
Есть тонкий момент. Если запомнить текущее состояние в глобальной переменной и ожидание изменения состояния будет достаточно долго и трейдер умудрится успеть изменить параметры эксперта, то глобальные переменные обнулятся и состояние сбросится.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef MACRO
        }
#endif
                g2();
#ifndef MACRO
        }
#endif
}
Причина обращения: