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

 
crleo #:
... Решил установить себе один торговый ассистент на мт5 на macOS ...

У меня нет компьбтера на MacOS, но я нашел один пост (там была похожая проблема в той ветке) -

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

после обновления не запускается платформа.

MetaQuotes, 2023.06.09 23:10

На Маке надо удалить старую инсталляцию на Wine 6.0 и переустановить новый пакет с Wine 7.7

Ссылка на инсталлятор внизу страницы справа.

 

Странно, что релогин не приводит к отправке события Init в эксперты (MT4). Но при этом в журнале

Automated trading disabled because the account has been changed

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

 
fxsaber #:

Пример 1% случаев, когда не в конце окажется и buy/sell.

  1. Асинхронно отправляется Buy-приказ.
  2. Асинхронно отправляется BuyLimit-приказ.
  3. Как только появился BuyLimit-тикет, делается его удаление.

В этом случае часто будет происходить ситуация, когда Buy-приказ будет не в конце таблицы ордеров.


Давайте разберем, что это обозначает. Пусть в таблице истории ордеров 1000 записей - ордера с индексами (HistoryOrderGetTicket) от 0 до 999.

Вот произошло событие п.3 выше - BuyLimit удалился и попал в таблицу истории ордеров. Он имеет индекс 1000 - его тикет отдается вызовом HistoryOrderGetTicket(1000).


Теперь произошло срабатывание Buy-приказа из п.1 - Buy-приказ попал в таблицу истории ордеров. Вы думаете, что его индекс 1001?

-Нет, его индекс 1000! Т.е. HistoryOrderGetTicket(1000) возвращал одно значение (BuyLimit-ticket), а через некоторое время - другое (Buy-ticket).


Интересна реакция не MQ, а форумчан. Либо это "красноречивое молчание", либо пофигизм.

Можно ли утверждать обратное?

То есть, если HistoryOrderGetTicket(prevTotal - 1) не изменился, значит ли это, что ордера добавлены в конец и можно брать их оттуда? Или не факт?


Я думаю, вы поняли. Детектить таким образом факт перетасовывания истории. И анализировать всю историю заново только если она перетасована

 

Доброе время суток.

Хотел кое-что актуальное предложить. В настройках MetaEditor не нашел полных шаблонизированных настроек для "шапки" создаваемых файлов исходного кода (я про #property и т.д. , хотя при создании есть Author и Link).

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

В чем польза - в каждом новом советнике или индикаторе или скрипте будет автоматически с #property добавляться например предопределенное кастомное уведомление об отказе от ответственности все такое. Вообще, это положено делать всем, но почти никто не утруждает себя той юридически традиционной процедурой. А если в MetaEditor будет возможность настроить генерируемую шапку с #property для интеграции в каждый создаваемый советник и т.д. - будет очень удобно.

Спасибо за внимание.

 
Vladislav Boyko #:

Можно ли утверждать обратное?

То есть, если HistoryOrderGetTicket(prevTotal - 1) не изменился, значит ли это, что ордера добавлены в конец и можно брать их оттуда? Или не факт?

Факт.


Я думаю, вы поняли. Детектить таким образом факт перетасовывания истории. И анализировать всю историю заново только если она перетасована

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

В общем, до релиза не дошел, на который мог бы положиться. Удручает, что разработчики молчком, а потому запросто могут что-то поменять. После недавнего бага HistorySelect вынуждены будут менять что-то в логике этой функции, а потому прежние алгоритмы могут снова перестать работать.

К сожалению, все несколько не так с коммуникацией с MQ, как хотелось бы.

 

Ошибка при выполнении:

int i=0;
void f1() { if (!i++) Print(1); }
void f2() { if (!i++) Print(2); }
void OnStart()
{
    if (1)
#define MACRO    /*
комментарий
  */f1();
    f2();
}

Результат:   1

Ожидалось: 2

 
A100 #:


Результат:   1

Ожидалось: 2

Вроде, и должно быть "1"
 
Sergey Gridnev #:
Вроде, и должно быть "1"

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

int i=0;
void f1() { if (!i++) Print(1); }
void f2() { if (!i++) Print(2); }
void OnStart()
{
    if (1)
#define MACRO     f1();
    f2();
}
и не перепутайте с другим примером. Здесь ошибка именно в комментарии /**/, а там была ошибка при переносе строки \

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2023.06.01 10:42

Кстати перенос строки на #define - с ошибкой работает. Пример с ним ошибки при выполнении:

#define unsignedint    double
#define MACRO unsigned\
int
void OnStart()
{
    Print(sizeof(MACRO));
}

Результат:   4

Ожидалось: 8

 
A100 #:

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

и не перепутайте с другим примером. Здесь ошибка именно в комментарии /**/, а там была ошибка при переносе строки \
Согласен
 
A100 #:

Подсказка: комментарий /**/ - это пробел. Заменяем - получаем ожидаемый результат:

Никогда не встречал внутри макроса какое-либо комментирование. Для того, чтобы удалить кусок из макроса, не комментировал, а удалял код внутри него.

Результат:   4

Ожидалось: 8

Перенос строки должен сшивать два слова? Это же текстовая замена, как в notepad.

Причина обращения: