Особенности языка mql5, тонкости и приёмы работы - страница 19

 
Artyom Trishkin:

Каким образом можно определить время открытия последней позиции, время закрытия последней позиции?

Да и вообще, хотелось бы знать общие принципы и алгоритмы получения информации по открытым/закрытым позициям на mql5‌.

Что необходимо учитывать, какие особенности существуют на данный момент?

Дело в том, что я использую MQL4-синтаксис, который в 1000 раз легче и понятнее MQL5-синтаксиса при работе с торговой частью.

В‌ы отлично знаете, как легко в три строчки и понятно для каждого решается Ваша задача на MQL4. Поэтому именно так и решаю.

Д‌ля ответа на все вопросы по MQL5 заглядываю в исходник библиотеки. Там были учтены все нюансы, что мне известны.

Н‌а данный момент можно констатировать, что Hedge и Netting-позиции сильно отличаются. Например, в Netting можно на протяжении месяцев иметь всегда только одну позицию, при этом постоянно торговать. Поэтому Netting-позиции в штатном понимании MT5 - это нечто непродуманное и, соответственно, неудобное. Поэтому для того же Netting возможно создание своей сущности позиций. На том же MT4 можно вполне иметь Netting-позиции, но с гораздо более понятным взаимодействием.

О‌ткройте позу на 1 лот. Затем закройте на 0.99 и на столько же долейте. И так несколько раз.

H‌edge удобен не тем, что можно иметь разнонаправленные позиции, а тем, что может быть несколько позиций по одному символу ОДНОГО направления. Вот именно такую работу с позициями в Netting-системах вижу удобной. А не то, что в MT5.

В идеале, при работе на Netting-счетах у Вас всегда должна быть таблица, полностью соответствующая MT4-стейтментам. Потому что только такие таблицы дают сразу понимание, что и как происходило на торговом счете. А не MT5-стейтменты.

Ч‌то же касается MT5-Hedge, то там все просто. CloseBy, правда, не копал. Поэтому не знаю.

 
fxsaber:
Не всегда возможно узнать SL/TP-уровни закрытой позиции.

Из цитаты так же следует, что TP позиции в MT5 - всегда маркет-ордер. Не закладывайетсь на лимитный аналог - см. выше.

А вот это уже интересно... Столкнулся с необходимостью точно знать что последняя закрытая позиция закрыта по тейк-профит.

Есть какая-либо возможность это точно узнать?‌

 
Artyom Trishkin:

А вот это уже интересно... Столкнулся с необходимостью точно знать что последняя закрытая позиция закрыта по тейк-профит.

Есть какая-либо возможность это точно узнать?‌

Делаю как посоветовали:

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool IsClosedByTP (const string symbol)
{
  //--- Получим комментарий последней сделки на указанном символе
  string last_comment = LastDealComment (symbol);
  //--- Если в комментарии есть строка "tp"
  if(StringFind (last_comment, "tp", 0) > -1)
    return (true);
  //--- Если нет строки "tp"
  return (false);
}
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool IsClosedBySL (const string symbol)
{
  //--- Получим комментарий последней сделки на указанном символе
  string last_comment = LastDealComment (symbol);
  //--- Если в комментарии есть строка "sl"
  if(StringFind (last_comment, "sl", 0) > -1)
    return (true);
  //--- Если нет строки "sl"
  return (false);
}
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string LastDealComment (const string symbol)
{
  int    total_deals  = 0;  // Всего сделок в списке выбранной истории
  string deal_symbol  = ""; // Символ сделки
  string deal_comment = ""; // Комментарий сделки
                            //--- Если история сделок получена
  if(HistorySelect (0, TimeCurrent ()))
  {
    //--- Получим количество сделок в полученном списке
    total_deals = HistoryDealsTotal ();
    //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
    for(int i = total_deals - 1; i >= 0; i--)
    {
      //--- Получим комментарий сделки
      deal_comment = HistoryDealGetString (HistoryDealGetTicket (i), DEAL_COMMENT);
      //--- Получим символ сделки
      deal_symbol = HistoryDealGetString (HistoryDealGetTicket (i), DEAL_SYMBOL);
      //--- Если символ сделки и текущий символ равны, остановим цикл
      if(deal_symbol == symbol)
        break;
    }
  }
  //---
  return (deal_comment);
}

 
Andrey Dik:

Делаю как посоветовали:‌

Хорошо, а как узнать, что последняя сделка привела к закрытию или развороту позиции?

Если позиция закрыта, или развёрнута, то тогда и имеет смысл проверять её данные, которые потребуются для логики советника: объём, факт закрытия по тейку или стопу, и пр...

Иначе, если у последней сделки обнаружен факт закрытия по тейку, но позиция осталась, то нет смысла проверять данные по последней закрытой позиции (она ведь ещё есть).

Вообще конечно сложновато быстро переключиться на логику МТ5-ордерной системы после четвёрочной - уж больно много вопросов появляется при обдумывании логики поведения советника, которая завязана на данные о последней закрытой позиции - в четвёрке всё прозрачно - позиция имеет свой тип, и она последняя - подходит - берём данные и используем. Но тут ... хэдж, неттинг... и нужно чтобы одинаковый результат был ... и поехали думки вразнос...‌

 
Artyom Trishkin:

Хорошо, а как узнать, что последняя сделка привела к закрытию или развороту позиции?

1. Если позиция закрыта, или развёрнута, то тогда и имеет смысл проверять её данные, которые потребуются для логики советника: объём, факт закрытия по тейку или стопу, и пр...

2. Иначе, если у последней сделки обнаружен факт закрытия по тейку, но позиция осталась, то нет смысла проверять данные по последней закрытой позиции (она ведь ещё есть).

Вообще конечно сложновато быстро переключиться на логику МТ5-ордерной системы после четвёрочной - уж больно много вопросов появляется при обдумывании логики поведения советника, которая завязана на данные о последней закрытой позиции - в четвёрке всё прозрачно - позиция имеет свой тип, и она последняя - подходит - берём данные и используем. Но тут ... хэдж, неттинг... и нужно чтобы одинаковый результат был ... и поехали думки вразнос...‌

1. Проверить тип сделки, IN, OUT или IN/OUT

2. Если позиция закрылась по SL или TP, то её уже нет, закрылась она, проверять тип сделки не нужно.

 
Andrey Dik:

1. Проверить тип сделки, IN, OUT или IN/OUT

2. Если позиция закрылась по SL или TP, то её уже нет, закрылась она, проверять тип сделки не нужно.

Это справедливо для неттинга? Или для хеджа тоже? Разве на хеджевом счёте не может быть несколько позиций в одну сторону? Или всё же позиция - она одна, и .... А что "и"? ... Блин... сам не знаю что "и"... Вопросов много, ответы пока не укладываются в голове.
 
Artyom Trishkin:
Это справедливо для неттинга? Или для хеджа тоже? Разве на хеджевом счёте не может быть несколько позиций в одну сторону? Или всё же позиция - она одна, и .... А что "и"? ... Блин... сам не знаю что "и"... Вопросов много, ответы пока не укладываются в голове.

‌Для хеджа тоже.

За несколько лет у меня мозг заточился под нетинг.‌ Ордер->Сделка->Позиция. Сделок может быть много в позиции (при хедже только одна сделка, гуру поправьте если не так), по типу сделки можно определить что произошло с позицией.

В хедже конечно проще в понимании, но сложнее в сопровождении. ИМХО конечно.‌

 
Andrey Dik:

‌Для хеджа тоже.

За несколько лет у меня мозг заточился под нетинг.‌ Ордер->Сделка->Позиция. Сделок может быть много в позиции (при хедже только одна сделка, гуру поправьте если не так), по типу сделки можно определить что произошло с позицией.

В хедже конечно проще в понимании, но сложнее в сопровождении. ИМХО конечно.‌

Ясно, благодарю. Разберусь.
 
Artyom Trishkin:

А вот это уже интересно... Столкнулся с необходимостью точно знать что последняя закрытая позиция закрыта по тейк-профит.

Есть какая-либо возможность это точно узнать?‌

Когда находишь последнюю сделку DEAL_ENTRY_OUT и выбираешь всю историю позиции HistorySelectByPosition в этом списке есть, для hadge счетов 2 сделки и 2 ордера, открытие позиции и закрытие её. Ордер на основании которого произошло закрытие содержит ORDER_PRICE_OPEN. Дальше проверяешь тип позиции и тип ордера по которому было закрытие... Если ордер имеет противоположный тип, значит это было закрытие. Соответственно цена ордера и есть искомая цена, с небольшим уточнением: Если профит ордера > 0 то это цена ТР, если-же < 0 то позиция закрылась по SL.

Полагаться на комментарий к ордеру, я-бы не стал.‌

 
Alexey Viktorov:

Когда находишь последнюю сделку DEAL_ENTRY_OUT и выбираешь всю историю позиции HistorySelectByPosition в этом списке есть, для hadge счетов 2 сделки и 2 ордера, открытие позиции и закрытие её. Ордер на основании которого произошло закрытие содержит ORDER_PRICE_OPEN. Дальше проверяешь тип позиции и тип ордера по которому было закрытие... Если ордер имеет противоположный тип, значит это было закрытие. Соответственно цена ордера и есть искомая цена, с небольшим уточнением: Если профит ордера > 0 то это цена ТР, если-же < 0 то позиция закрылась по SL.

Полагаться на комментарий к ордеру, я-бы не стал.‌

А трал SL ? Как будешь определять, что закрылось по тралу SL в плюсе?
Причина обращения: