Обсуждение статьи "Ордерa, позиции и сделки в MetaTrader 5" - страница 2

 

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

  • списание и начисление средств;
  • начисление комиссий, свопов и налогов;
  • установка, удаление и модификация ордеров;
  • совершение сделок на основании ордеров;
  • открытие и закрытие позиций;
  • изменение объема и направления  позиций.

В перечне отсутствует такое торговое событие,  как "модификация уровней StopLoss и/или TakeProfit" у открытой позиции (SL & TP Modification). Или оно рассматривается как частный случай "совершения сделок на основании ордеров"?

 
Yedelkin:

В перечне отсутствует такое торговое событие,  как "модификация уровней StopLoss и/или TakeProfit" у открытой позиции (SL & TP Modification). Или оно рассматривается как частный случай "совершения сделок на основании ордеров"?

"Модификация уровней StopLoss и/или TakeProfit" у открытой позиции (SL & TP Modification)" ближе к
  • установка, удаление и модификация ордеров;
 
Rosh:
"Модификация уровней StopLoss и/или TakeProfit" у открытой позиции (SL & TP Modification)" ближе к

Я думал над этим вопросом. Но, фактически, говоря об "установке, удалении и модификации ордеров", речь идёт об установке, удалении и модификации отложенных ордеров. Модификация же уровней SL и/или TP у открытой позиции имеет несколько иную природу, поскольку соответствующие запросы относятся к категории "ордеров немедленного исполнения". Или я ошибаюсь в части "немедленного исполнения"?

 
Rosh:

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

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

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

Я уверен, что после прочтения статьи дальше все будет уже просто.

Рашид, я не умаляю полезность статьи.

Просто без жизненных примеров (тех, которые можно применить в написании советника) она кажется совсем уж справочной.

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

 

В статье есть такая часть:

"Для примера приведен скрипт, который ищет последний ордер за последний день и выводит по нему информацию. 

// --- определение границ требуемой торговой истории
   datetime end=TimeCurrent();                 // текущее серверное время
   datetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад
//--- запросим в кэш программы торговую историю за день
   HistorySelect(start,end);
//--- получим количество ордеров в истории
   int history_orders=HistoryOrdersTotal();
//--- получим тикет ордера из истории, имеющего последний индекс в списке
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
   if(order_ticket>0) // получили в кэш исторический ордер, работаем с ним
     {
      //--- статус ордера
      ENUM_ORDER_STATE state=(ENUM_ORDER_STATE)HistoryOrderGetInteger(order_ticket,ORDER_STATE);
      long order_magic      =HistoryOrderGetInteger(order_ticket,ORDER_MAGIC);
      long pos_ID           =HistoryOrderGetInteger(order_ticket,ORDER_POSITION_ID);
      PrintFormat("Ордер #%d: ORDER_MAGIC=#%d, ORDER_STATE=%d, ORDER_POSITION_ID=%d",
                  order_ticket,order_magic,EnumToString(state),pos_ID);

     }
   else              // неудачная попытка получения ордера

     {
      PrintFormat("Всего в истории %d ордеров, не удалось выбрать ордер"+
                  " с индексом %d. Ошибка %d",history_orders,history_orders-1,GetLastError());
     }

 В описании скрипта говорится, что ищется последний ордер, а в самом коде речь идёт о получении тикета, имеющего последний индекс в списке исторических  ордеров: 

//--- получим тикет ордера из истории, имеющего последний индекс в списке
   ulong order_ticket=HistoryOrderGetTicket(history_orders-1);
Т.е. подразумевается, что именно тикет с максимальным индексом относится к последнему ордеру. Но в материалах нигде не нашёл упоминания о том, что последний ордер всегда гарантированно будет иметь максимальный индекс в списке исторических  ордеров. ...Если, допустим, в списке окажется один ордер, то вопросов не возникает. Но при большем количестве  ордеров в списке - можно ли всегда полагаться на предложенный способ поиска последнего ордера? Иными словами, всегда ли последний исторический  ордер гарантированно будет иметь максимальный индекс в списке исторических  ордеров?
 

Добрый!

1) смотрел свойства позиции:

POSITION_PROFIT 

что это такое, в чем измеряется?

пример: 

double profit          =PositionGetDouble(POSITION_PROFIT); 

результат: 

Позиция #101470723 по EURUSD: POSITION_MAGIC=0, цена откр поз=1.30825, тек цена поз=1.30835, тип=POSITION_TYPE_BUY, профит=-2061584302, комментарий= 

 

профит=-2061584302 как это понимать?

2) Может кто точно, но просто объяснить как читать эту запись

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

 Возможно, сис функцией PositionGetInteger(POSITION_TYPE) для заранее выбранной позиции запросили значение свойства называемого POSITION_TYPE, но это значение возвращается в виде порядкового номера перечисления, и чтобы его представить в удобоваримом виде, мы получаем это удобоваримое значение уже из сис перечисления ENUM_POSITION_TYPE в переменную type, тип которой в это же самое время декларируется как ENUM_POSITION_TYPE? 

 

 В таком случае, правильно ли  я понимаю, что можно самому писать некий класс, который по смыслу станет функционалом, примерно:

инициализация текПозиция = тот некий класс; //в конструкторе которого выполнить считывание в буфер позиции, а также запомнить все параметры

 а дальше использовать:

текЦенаОткрытия=текПозиция.ЦенаОткрытия;

текНаправлениеПозиции=текПозиция.НаправлениеПозиции; 

текНаправлениеПозиции=текПозиция.НаправлениеПозиции;  

текПрофитПозиции=текПозиция.ПрофитПозиции;  

Спасибо! 

 
bivmail:
 

2) Может кто точно, но просто объяснить как читать эту запись

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

 Функция PositionGetInteger("идентификатор свойства") возвращает значение типа long. Если при этом "идентификатор свойства" имеет тип, отличный от типа long (например, идентификатор POSITION_TYPE имеет тип ENUM_POSITION_TYPE), то желательно привести значение, возвращаемое функцией PositionGetInteger(), к значению требуемого типа (т.е. к значению типа ENUM_POSITION_TYPE).

В Вашем примере объявляется переменная  type типа ENUM_POSITION_TYPE, которой присваивается значение типа ENUM_POSITION_TYPE, полученное в результате явного приведения значения типа long к значению типа ENUM_POSITION_TYPE.

Правила приведения значений числовых типов изложены в  Справочник MQL5 / Основы языка / Типы данных / Приведение типов / Приведение числовых типов 

Документация по MQL5: Торговые функции / PositionGetInteger
Документация по MQL5: Торговые функции / PositionGetInteger
  • www.mql5.com
Торговые функции / PositionGetInteger - Документация по MQL5
 

Цитата из статьи: "При потере подключения к торговому серверу терминал периодически предпринимает попытки восстановить связь".

С какой частотой осуществляются  попытки восстановить связь?

 
Раз в 5 секунд
 

Понял, спасибо.