Имя пользователя:

Пароль:



MQL5 - вопросы программирования

Подписчиков: coder-ex

MQL5 - вопросы программирования

Номер сообщения:#21  Непрочитанное сообщение coder-ex » 03 авг 2016, 18:23

Серега, будешь смеяться, я полтора месяца потратил в этом году на тестирование и создание серии методов используя OnTrade и OnTradeTransaction в своей библиотеке классов. Но потом столкнулся на потере (иногда) ответов с торгового сервера либо сервера биржи. Потом вел диалог полмесяца с MetaQuotes и они тогда мне и разъяснили (наконец то снизошли и рассказали всю правду :) ), что оказывается программы в среде МТ5 выполняются в одном исполняемом потоке, а событийная система у них имеет одну общую очередь и общая она на все функции. В итоге я удалил все семейство этих методов из своей библиотеки. И вот уже несколько дней (исключая поездки на отдых) по новой все тестирую и пришел к выводу, что !!! нафига я все удалял, нужно было чуть по другому все написать и не было бы этих пулеметных очередей из одинаковых запросов.
В общем теперь занят созданием флагов, сами методы на бумаге восстановил. Долбанные разработчики, нафига всем втирают, что у них там многопотоковая система в МТ5, а OnTrade и OnTradeTransaction типа калбеки. Они может и калбеки, но какой от них толк в едином потоке исполнения.
Ошибки пофиксю в Grabber`e, допишу методы под биржевое исполнение и полностью уйду в проект под Linux, а то столько времени отнимает эта вся вакханалия с костылями.
Кстати на будущее, OnTradeTransaction порождает несколько вызовов OnTrade и нет точного числа, сами разработчики об этом поведали. Единственное для чего они ее разработали - включение минимальной задержки на 1-3 тика, но это можно сделать и одним флагом.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL5 - вопросы программирования

Номер сообщения:#22  Непрочитанное сообщение Pyyx » 04 авг 2016, 14:52

coder-ex писал(а):

Серега, будешь смеяться, я полтора месяца потратил в этом году на тестирование и создание серии методов используя OnTrade и OnTradeTransaction в своей библиотеке классов. Но потом столкнулся на потере (иногда) ответов с торгового сервера либо сервера биржи. Потом вел диалог полмесяца с MetaQuotes и они тогда мне и разъяснили (наконец то снизошли и рассказали всю правду :) ), что оказывается программы в среде МТ5 выполняются в одном исполняемом потоке, а событийная система у них имеет одну общую очередь и общая она на все функции.

coder-ex писал(а):

Кстати на будущее, OnTradeTransaction порождает несколько вызовов OnTrade и нет точного числа, сами разработчики об этом поведали. Единственное для чего они ее разработали - включение минимальной задержки на 1-3 тика, но это можно сделать и одним флагом.

Ну это не новость, это даже в справке написано.
Цитата:
Один торговый запрос, отправленный из терминала вручную или через торговые функции OrderSend()/OrderSendAsync(), может порождать на торговом сервере несколько последовательных торговых транзакций. При этом очередность поступления этих транзакций в терминал не гарантирована, поэтому нельзя свой торговый алгоритм строить на ожидании поступления одних торговых транзакций после прихода других. Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

Все равно при использовании любой стратегии скальпеля, для исключения дятлонизма сервера, тебе придется прописывать дополнительные функции проверки или ответа сервера на запрос, или же проверки и исключения повторяющихся запросов.
:tipa:
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

MQL5 - вопросы программирования
Аватар пользователя
Pyyx
.
.
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 11 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

MQL5 - вопросы программирования

Номер сообщения:#23  Непрочитанное сообщение coder-ex » 04 авг 2016, 14:58

Мы не ищем легких путей %) Сперва создаем потом удаляем, потом снова то же самое создаем :men:
Но OnTrade использовать по любому не буду, это абсурдная функция для быстрых стратегий, она только усложнит архитектуру робота, проще на 1-3 тика задержать флагом.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL5 - вопросы программирования

Номер сообщения:#24  Непрочитанное сообщение coder-ex » 11 авг 2016, 19:52

После продолжительного тестирования, пришел к выводу, что восстановить потерю событий в потоке терминал МТ5 <-> сервер МТ5 <-> биржевой сервер (если есть) не получится ни какими костылями, но восстановить некоторые торговые запросы получается. Вот тестовый модуль:
test_OpenClosePos.ex5

прим.: пункты в настройках для 4-х знака с множителем х10, для 5-ти знака вычисляются автоматически с множителем х1.
Если нужен будет код то выложу позже, как только приведу библиотеку в порядок.
У вас нет доступа для просмотра вложений в этом сообщении.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL5 - вопросы программирования

Номер сообщения:#25  Непрочитанное сообщение Pyyx » 13 авг 2016, 13:25

coder-ex писал(а):

После продолжительного тестирования, пришел к выводу, что восстановить потерю событий в потоке терминал МТ5 <-> сервер МТ5 <-> биржевой сервер (если есть) не получится ни какими костылями, но восстановить некоторые торговые запросы получается. Вот тестовый модуль:
test_OpenClosePos.ex5

прим.: пункты в настройках для 4-х знака с множителем х10, для 5-ти знака вычисляются автоматически с множителем х1.
Если нужен будет код то выложу позже, как только приведу библиотеку в порядок.

Костик что то ты здесь перемудрил,не знаю точно на чем ты здесь основываешься, и почему пытаешься использовать связку терминал МТ5 <-> сервер МТ5 <-> биржевой сервер (если есть), ведь сами разрабы МТ5 предупреждают, что потеря данных в событиях всегда будет присутствовать. Работай как все, вытягивай данные из PositionSelect(), OrderSelect(), ну и HistorySelect(), так точно не чего не потеряешь.
:D
Правильного выбора в реальности не существует — есть только сделанный выбор и его последствия.

MQL5 - вопросы программирования
Аватар пользователя
Pyyx
.
.
Сообщений: 950
Возраст: 36
Зарегистрирован: 64 месяцев и 11 дней
Откуда: Планета Земля
Национальный флаг:
Belarus
Благодарил (а): 331 раз.
Поблагодарили: 545 раз.
Имя: Сергей
Пункты репутации: 21
Молодой трейдерМолодой трейдерМолодой трейдер

MQL5 - вопросы программирования

Номер сообщения:#26  Непрочитанное сообщение coder-ex » 14 авг 2016, 12:22

Цитата:
и почему пытаешься использовать связку терминал МТ5 <-> сервер МТ5 <-> биржевой сервер (если есть)

Ну а как ты себе представляешь отправку торговых запросов и получение другой рыночной информации? Телепатически я не умею, есть схема, от которой ты не уйдешь. Меня эта цепочка событий в калбэке не устраивает, на Plaza2 все просто - получаешь поток, позиционируешь структуры и если что то потеряется, то и фиг с ним, типа качество связи страдает. Но там нет этой принудительной цепочки событий. На открытие позиции аж 4 события, на модификацию 2 и т.д. Я пытался убрать дублирование торговых запросов, но единственное чего добился, это повтор торгового запроса 1-2 раза. Для меня важно не налететь на штрафы биржи за неэффективные заявки, ведь в конечном итоге планирую робота запустить на бирже, а позиции заменить на лимитники, вот тут как раз и может случится каряга.
В общем теперь хоть поток контролируется и это главное. Видимо от МТ5 большего не добиться, будем работать над собственной платформой под Linux :tipa:
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL5 - вопросы программирования

Номер сообщения:#27  Непрочитанное сообщение coder-ex » 25 авг 2016, 19:15

Может кому будет интересно, в MQL5 введены указатели на функции (callback`и). Их преимущество в скорости доступа к функции - через указатель происходит быстрее. К тому же биржевые системы строят свои событийные модели именно на callback`ах.
Кто не в курсе как они работают, изучите тестовый пример, будут вопросы задавайте.
test_Callback.mq5
У вас нет доступа для просмотра вложений в этом сообщении.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL5 - вопросы программирования

Номер сообщения:#28  Непрочитанное сообщение coder-ex » 17 окт 2016, 17:36

Ни как не пойму MetaQuotes, зачем изобретать очередной "велосипед" если он уже есть %) Ну создали язык программирования на основе синтаксиса C++, но почему так упорно не хотят вводить все его парадигмы... К примеру ввели перегрузку и ввели оператор * (получение ссылки на переменную - разыменовывание указателя). Но блин почему не работает перегрузка * ))) этот код свободно работает в с++:
Код: выделить все · Развернуть
class Iterator
  {
   int m_value;
public:
   Iterator(const int val) : m_value(val) { }
   int operator*() { return m_value; }
  };

int main(int argc, char **argv) {
   Iterator *_it = new Iterator(5);
   
   int _val = **_it;
//---
   return 0;
}

но в mql не хочет. При этом сперва ответили обобщенно касаемо оператора *:
Цитата:
На данный момент оператор *(dereference/indirection) можно использовать только для указателей на объекты классов и это rvalue

Задал разработчикам вопрос более конкретно и получил ответ:
Цитата:
Потому что нет оператора преобразования Iterator::operator int() и/или глобального int iperator=(int,const Iterator &), которые, к сожалению, на данный момент не поддерживаются в MQL.

ну и в чем проблема ввести была не пойму ))) вот и пользуются кодеры mql гетерами из-за этих грабель...
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 16 месяцев и 4 дня
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

Пред.

Вернуться в Программное обеспечение



Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

  • Объявления
cron