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

 
Sergey Dzyublik:

А вы проверяли данное утверждение на практике? Просто может оказаться все наоборот.

Теоретизирую здесь. Не проверял. Но передача по ссылке string видится целесообразной.

 
Sergey Dzyublik:

Возможен вариант использования:

что-то вы дичь какую-то предлагаете.

судя по сигнатуре и вашему описанию, терминал должен по функции вызвать обработку следующего события, а затем вернуть управление в программу в точку вызова handlenextevent?

а если во время обработки опять будет вызов handlenextevent?

а что случается в события которые не попадают под фильтр в параметрах? пропускаются? меняют очередность?

у скриптов вообще нету очереди событий, зачем ее добавлять на костылях если есть советники и индикаторы?

 
TheXpert:

1) что-то вы дичь какую-то предлагаете.
2) судя по сигнатуре и вашему описанию, терминал должен по функции вызвать обработку следующего события, а затем вернуть управление в программу в точку вызова handlenextevent?
3) а если во время обработки опять будет вызов handlenextevent?
4) а что случается в события которые не попадают под фильтр в параметрах? пропускаются? меняют очередность?


1) Мое дело предложить, а дичь ли это, или нет - решать не вам, а разработчикам, им чуть-чуть виднее...
2) Все верно. Если меня интересует обработка конкретного события, а не всех имеющихся в системе, было бы не плохо предоставить возможность обработать только данный тип событий, оставив обработку остальных событий в обычном режиме.
3) Если во время обработки опять будет вызов HandleNextEvent - вызвать и обработать. Единственное что может быть - это переполнение стека, но это проблема пользователя и его кода, а не разработчиков.
4) События, которые не попадают под фильтр, остаются в той же последовательности и будут вызваны, когда пользователь вернет управление в систему, как обычно.


 
TheXpert:

у скриптов вообще нету очереди событий, зачем ее добавлять на костылях если есть советники и индикаторы?

Здесь пример скрипта, который асинхронно открывает и закрывает свои позиции/ордера.

// Максимально быстро все закрывает. Возврат, когда действие подтверждено.
bool CloseAll()
{
  uint RequestID[];
  
  for (int i = ArrayResize(RequestID, OrdersTotal()) - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      // Отправили асинхронный приказ
      RequestID[i] = (OrderType() <= OP_SELL) ? OrderCloseAsync(OrderTicket(), OrderLots(), OrderClosePrice(), 100) : OrderDeleteAsync(OrderTicket());
  
  return(Transactions.Waiting(RequestID)); // Дождались ответа от сервера на все асинхронные приказы
}
TradeTransactions
TradeTransactions
  • www.mql5.com
Асинхронные торговые приказы обладают огромным преимуществом - высокая скорость при массовой отправке. Однако, распространению таких приказов мешает некоторое неудобство - данные о результате приказа возможно увидеть только в OnTradeTransaction. Такое обстоятельство заставляет обывателя строить событийную модель своей ТС, если хочется...
 
Sergey Dzyublik:

1) Мое дело предложить, а дичь ли это, или нет - решать не вам, а разработчикам, им чуть-чуть виднее...

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

 
fxsaber:

Вопрос по оптимизации. В Тестере на каждом тике нужно получить тик для дальнейшей работы. Делаю это так.

Понятно, что этот вариант будет медленнее:

Но еще тормозит SymbolInfoTick, потому что string-параметр передается не по ссылке.

Возможно ли иметь штатные SymbolInfo*-перегрузки, где string передается по ссылке?

А лучше, конечно, иметь

В Оптимизаторе эти функции вызываются десятки миллиардов раз.

вызов функции Symbol() ВСЕГДА разворачивается в доступ к глобальной переменной _Symbol, как и Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

вызов функции Symbol() ВСЕГДА разворачивается в доступ к глобальной переменной _Symbol, как и Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

А передача string по ссылке?

 
fxsaber:

А передача string по ссылке?

Видимо причина в одной из нерешаемых проблем в MQL - передача литерала в качестве параметра по const ref. 

 
fxsaber:

Возможно ли иметь штатные SymbolInfo*-перегрузки, где string передается по ссылке?

А как они помогут?

int SymbolInfoTick( string  symbol ) { return 1; }
int SymbolInfoTick( string& symbol ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol ));
}

Все равно возвращается(вызывается) 1, а не 2

 
fxsaber:

А передача string по ссылке?

Строка передаётся по ссылке.

Мы уже давно перешли на "copy_on_write строки" -> при копировании одной строки в другую контент не копируется сразу (как это было раньше), увеличивается количество ссылок на буфер строки
Например, количество ссылок увеличивается при передаче строки по значению, в качестве параметра и уменьшается после вызова.

Когда строка меняется, проверятся счётчик ссылок на буфер и если ссылок больше одной, то изменяемая строка "отцепляется" от старого буфера и ей выделяется новый.