Выпущена бета-версия MetaTrader 4 Build 582 с обновленным языком MQL4 и Маркетом приложений - страница 39

 
Renat:

1. Новый режим без переоткрытия соединения работает только с новыми серверами. Попробуйте на MetaQuotes-Demo. Для старых серверов поддерживается старый режим для совместимости.

2. Время в логах точное на момент событий. Отображение логов в окне работает в режиме ленивого обновления.


1 спасибо


2 не понимаю но почему то теряю примерно 500 мс на выполнение чтения из файла в памяти в цикле со слипом 2 мс

через микого к примеру могу показать как это происходит и код эксперта тоже в личном сообщении

в 509 такого эффекта не было

использую MemMapLib.mqh

точнее от команды чтения и до отправки приказа на сервер

в лог журнала вижу что первое сообщение

23:22:03.985 '6790864': instant order buy 0.10 GBPUSD at 1.65815 sl: 0.00000 tp: 0.00000

еще вот давно такого не видел (хотя это при обновлении серверной части надеюсь уйдет)

23:24:38.404 '6790864': order #221406644 sell 0.10 GBPUSD closing at 1.65826 failed [Trade context is busy]
23:24:38.404 '6790864': order #221406644 sell 0.10 GBPUSD closing at 1.65826 failed [Trade context is busy]
 
olyakish:

Пропал запрос на модификацию

По логу эксперта видно что была попытка модифицировать отложку в 23,43,30 а по логу терминала этой записи нет да и время затраченное на модификацию меньше дискретности счетчика GetTickCount
По логу эксперта видно, что физически команда не прошла дальше эксперта. Скорее всего из-за неверных параметров ордер был отклонен на первичных проверках терминала.

23:43:30 refresh_2_01 GBPUSD,H1: 30Отправляем запрос
... тут должна быть команда modify
23:43:30 refresh_2_01 GBPUSD,H1: (0)Ошибка=no error OrderTicket=221407418 30После отправки запроса время выполнени=0

Что нужно сделать:

1) Никогда не вызывать Order функции без сохранения их результатов. Именно тут ваша главная ошибка. То есть result=OrderModify(). Не надейтесь, что можете потом GetLastError вызвать. Да и с GetlastError ошибка - он вызывается сильно после операции с ордером. А именно, после GetTickCount.

2) Выводите в лог все важные параметры перед посылкой запроса. Так сразу будет ясно, где проблема.

 

К сожалению, без кода не помогу. Пишите в сервисдеск с приложением файлов, пожалуйста.

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

 
Renat:

К сожалению, без кода не помогу. Пишите в сервисдеск с приложением файлов, пожалуйста.

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

В эксперте из файловых есть только вот это

CMemMapFile chmemLocal;
CMemMapFile chmemGlobal;
uchar hreadLocal[16],hreadGlobal[16];
... инициализация файлов
  
 while(true && hmemLocal>0 && hmemGlobal>0 && IsExpertEnabled())
     {
      chmemGlobal.Seek(0,SEEK_SET);
      chmemLocal.Seek(0,SEEK_SET);
      long r=chmemGlobal.Read(hreadLocal,16);
      long rG=chmemLocal.Read(hreadGlobal,16);

сдвиг и чтение 16 байт сильно грузить проц в цикле 2 мс ?


а что будет если я в эксперте повешу его на внешнее событие ?

типа API SetEvent (hEvent1);

вместо while и соответственно когда нужно обновлюсь RefreshRates();

загрузка процессора в 100% или будет 0 как и другое ПО которое ждет события ?


Renat:

2) Выводите в лог все важные параметры перед посылкой запроса. Так сразу будет ясно, где проблема.


Просто эксперт взят из 509 там стабильно работало вот и удивился пропажей запроса. Сейчас буду переделывать на новые условия
 
Renat:

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

Разъясните, пожалуйста. В моем понимании FileFlush должна очистить буфер файла в операционной системе, переписав его содержимое в буфер контроллера жесткого диска. А здесь, что, она еще и из контроллера на магнитные пластины переписывает?
 
Vlad143:
Разъясните, пожалуйста. В моем понимании FileFlush должна очистить буфер файла в операционной системе, переписав его содержимое в буфер контроллера жесткого диска. А здесь, что, она еще и из контроллера на магнитные пластины переписывает?

Поддерживаю, хотелось бы прояснить
 
Вопрос по Маркету, можно ли будет выкладывать бесплатные приложения без регистрации в качестве продавца - как в Сигналах сделано. Спасибо.
 
Логи терминала сильно похудели. Зачем?
 

Метаквоты, скажите, какая цель преследовалась при запрете компиляции строковых массивов для передачи в DLL? Что за цель такая? Чтобы побольше проблем было? Чтобы жизнь мёдом не казалась? Особенно в переходный период.

Почему вы напридумывали разных ненужных базовых структур, а о передачи строк в массивах, как раньше было, не подумали? Почему бы не сделать такую базовую структуру? Почему бы, как раньше, не оставить передачу типа string в массиве, как ту самую структуру? Это совсем не сложное изменение компилятора. Не сложнее ООП. Но лучше, пусть это будут указатели.

Когда прочитал анонс, понял, что передачу массива структур типа MqlStr больше не будет. Подумал, что наконец-то будет передача массивов указателей на строки, как в нормальных языках. Как же, размечтался... Запретить запретили и ничего взамен не предоставили. Пипец! Зато о полной совместимости, как заклинание... Мне бы дажу в голову бы не пришла такая подлянка. Ни за что не догадался бы!

Пришлось поизучать MQL5. Приближенный к С++... :(
Вробе бы и С++, но обязательно с какими-то подвывертами и ограничениями. После, которых писать ничего не хочется.
Это больше походит на С== (четыри минус). На больше не тянет.

 
Rann:
Логи терминала сильно похудели. Зачем?
В смысле?
Причина обращения: