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

 
Vitya:
Может PositionTotal() нужно?

А причём тут позиция если я спрашиваю у OrdersTotal() сколько на данный момент есть выставленных ордеров,

при чём запрашиваю эту информацию в OnTrade(), те момент когда ордер существует никак не может быть пропущен.

Но по факту получается что этот самый момент всё же каким то образом упускается, и запросы проходят когда либо ордера ещё нет, либо когда уже нет.

А вот момента когда он есть никак в OnTrade() не отлавливается, или как вариант OrdersTotal() безбожно врёт.

 

Чтоб небыло нареканий на кривоту кода вот МетаКвотовский код, с моей доработкой скрипта в советник.

Добавлена функция OnTrade() и код скрипта вынесен в OnInit().

Ни один принт не вывел сообщение что есть ордер.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

На это могу ответить только статьей Торговые события в MetaTrader 5:

Заключение

Все операции в торгово-аналитической платформе MetaTrader 5 производятся асинхронно и отсылка сообщений обо всех изменениях на торговом счете производятся независимо друг от друга. Поэтому не нужно пытаться отслеживать одиночное событие по правилу "Один запрос - Одно торговое событие". Если требуется точно определить что именно изменилось по приходу события Trade, то нужно на каждом вызове обработчика OnTrade анализировать все сделки, позиции и ордера и сравнивать с тем состоянием, что было до его появления.
Это означает, что ордер, который Вы пытаетесь отловить, наверняка уже нужно искать с помощью HistoryOrdersTotal
 
Rosh:

На это могу ответить только статьей Торговые события в MetaTrader 5:

Это означает, что ордер, который Вы пытаетесь отловить, наверняка уже нужно искать с помощью HistoryOrdersTotal

Собственно этой статьёй и руководствуюсь. Хочу докопаться до ответа на вопрос: как так получается, что торговое событие пропускает момент, когда ордер выставлен но ещё не исполнен?

Торговые события генерируются сервером в следующих случаях:

  • изменение в действующих ордерах,
  • изменения в позициях,
  • изменения в сделках,
  • изменения в торговой истории.

Я подозреваю что OrderTotal() бочит. Но доказать это с данным функционалом не могу.

Хотя как вариант не отвергаю что OrderTotal() берёт данные не там где я думаю (ну то есть не на сервере).

 
Urain:

Собственно этой статьёй и руководствуюсь. Хочу докопаться до ответа на вопрос: как так получается, что торговое событие пропускает момент, когда ордер выставлен но ещё не исполнен?

Просто к моменту прихода события Trade ордер уже выставлен и уже исполнен. Поэтому нет его среди действующих, он уже попал в историю.
 
Rosh:
Просто к моменту прихода события Trade ордер уже выставлен и уже исполнен. Поэтому нет его среди действующих, он уже попал в историю.

Да, да, у меня мысли плавают вокруг этого ответа.

Я бы ответил так, на момент выставления ордера, сервером генерируется событие "традес" и отсылается терминалу, когда терминал его получает, то в коде делается запрос о количестве ордеров, но к моменту прихода этого запроса на сервер, сервер уже исполнил этот ордер.

Другого объяснения у меня нет.

 
Urain:
 

Торговые события генерируются сервером в следующих случаях:

  • изменение в действующих ордерах,
  • изменения в позициях,
  • изменения в сделках,
  • изменения в торговой истории. 

Я подозреваю, что OrderTotal() бочит. Но доказать это с данным функционалом не могу.  

Правильно ли я понял, что к списку действующих ордеров Вы относите как действующие отложенные ордера, так и ордера на открытие позиции?

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
papaklass:

Что это означает?

Что-то типа "После завершения работы программы часть использованной памяти не была освобождена". В частности, аналогичное сообщение возникает, когда программа с помощью оператора new создает динамический объект, но впоследствии не удаляет его оператором delete.
 
papaklass:
... во вкладке "Эксперты" появляется это сообщение. Это не ошибка, а предупреждение. Предупреждение о чем?

Ну, я про "ошибку" и не говорил. Пусть будет "предупреждение". Свою версию с примером уже высказал. Посмотрите ещё обсуждение вот отсюда (про утечку строк - читать до конца страницы): https://www.mql5.com/ru/forum/1111/page345#comment_54616

Может, придётся в СД обратиться, с подробностями Вашей ситуации. 

 

Обнаружил "непонятку".

Почему компилятору не нравится дефайн второй переменной b?

И вообще, как разрулить подобную ситуацию?

#property script_show_inputs

// m[a].Column[b]
input int A=11;
input int B=3;

#define a A
//#define b B // тут раскоментировать
#define b 3   // тут закоментировать

// размер одного элемента 4 байта
struct ArrWe
{
  float Column [b];
};

void OnStart()
{
  ArrWe m[11]; // тут вместо "11" хочу использовать "a"
  Print("Размер структуры ArrWe ",sizeof(ArrWe));
  Print("Количество элементов 1-го измерения ",sizeof(m)/sizeof(ArrWe));
  Print("Количество элементов 2-го измерения ",sizeof(ArrWe)/4);   
  Print("Размер массива из 11 ArrWe ",sizeof(m));
}