Разделение открытых позиций на группы - страница 9

 
Sergey Voytsekhovsky:

Если я Вас правильно понял, то вот так будет правильнее. Как более опытный товарищ, подскажите плиз, с целью отлова новорожденных позиций такой фильтр сработает ??? Или может есть более верный вариант ???

Это к Алексею - я не работаю с OnTradeTransaction() по некоторым причинам.

 
Alexey Viktorov:

Тем самым предлагаешь отодвинуть другие сообщения взад? Пусть о них никто не вспоминает? Не правильно это.

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

Ну вот ты выделил красным, что ты не знаешь. А проблема-то в чём была? Как она проявлялась? И что за новый метод?

А насчёт сообщений об ошибках: "правильно-не-правильно", но если хочешь сообщить о ней, то сообщишь. А если нет желания, то и нет желания. И отгораживаться типа "даю людям поговорить о своём" - это отмазка.

 
Sergey Voytsekhovsky:

Если я Вас правильно понял, то вот так будет правильнее. Как более опытный товарищ, подскажите плиз, с целью отлова новорожденных позиций такой фильтр сработает ??? Или может есть более верный вариант ???

На мой взгляд эта строка

         if(trans.type != TRADE_TRANSACTION_ORDER_DELETE)

лишняя. А вообще, я сейчас пересматриваю работу OnTradeTransaction на такой вариант

  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)

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

В общем я сторонник писать под конкретную задачу. А в СБ нагромоздили универсальности которая требует дополнительных, иногда совершенно не нужных переменных.

 
Artyom Trishkin:

Ну вот ты выделил красным, что ты не знаешь. А проблема-то в чём была? Как она проявлялась? И что за новый метод?

А насчёт сообщений об ошибках: "правильно-не-правильно", но если хочешь сообщить о ней, то сообщишь. А если нет желания, то и нет желания. И отгораживаться типа "даю людям поговорить о своём" - это отмазка.

Где-то на старых дисках у меня остались старые терминалы. Если найду покажу старую библиотеку и новую. Тогда будет предметный разговор. А так, я помню, ты нет и о чём тогда говорить? Как объяснить, показать чего сейчас нету.
 
Alexey Viktorov:

На мой взгляд эта строка

лишняя. А вообще, я сейчас пересматриваю работу OnTradeTransaction на такой вариант

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

В общем я сторонник писать под конкретную задачу. А в СБ нагромоздили универсальности которая требует дополнительных, иногда совершенно не нужных переменных.

Крайне благодарен за указание правильного направления. Сделал так (ниже, вроде работает):

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//---
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) // открылась позиция
            {
               int SizeArrayPosition = ArraySize(ArrayPosition);
               ArrayResize(ArrayPosition,SizeArrayPosition+1);
               
               if(PositionSelectByTicket(trans.position)){
               ArrayPosition[SizeArrayPosition].ticket_pos = trans.position;
               ArrayPosition[SizeArrayPosition].open_price = trans.price;
               ArrayPosition[SizeArrayPosition].open_tyme  = (datetime)PositionGetInteger(POSITION_TIME);
               ArrayPosition[SizeArrayPosition].type       = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
               ArrayPosition[SizeArrayPosition].kod_clana  = 0;
               
               Print("\n"
               "Открылась новая позиция: ticket = ",ArrayPosition[SizeArrayPosition].ticket_pos);}}}
  }

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

 
Sergey Voytsekhovsky:

Крайне благодарен за указание правильного направления. Сделал так (ниже, вроде работает):

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

Я-бы добавил ещё проверку на символ и магик

    if(PositionSelectByTicket(trans.position) && PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == magick)
     {
      if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN)

Вот кусок из моего кода где отлавливается закрытие позиции.

    if(!PositionSelectByTicket(trans.position))
     {
      HistorySelectByPosition(trans.position);
      ulong ordTicket = HistoryOrderGetTicket(0);
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {

Можно ещё разделить по причинам закрытия из перечисления ENUM_DEAL_REASON

Вот в другом советнике

    if(!PositionSelectByTicket(trans.position))
     {
      if(trans.symbol == _Symbol && HistorySelectByPosition(HistoryDealGetInteger(trans.deal, DEAL_POSITION_ID)))
       {
        int dealTotal = HistoryDealsTotal();
        long posMagic = 0;
        ulong dealTicketIN = HistoryDealGetTicket(0);
        if(HistoryDealGetInteger(dealTicketIN, DEAL_ENTRY) == DEAL_ENTRY_IN)
          posMagic = HistoryDealGetInteger(dealTicketIN, DEAL_MAGIC);
        if(posMagic == magick)
         {
          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
           {

В первом случае мне нужен ордер, во втором достаточно сделки. В общем когда что нужней, то и буду писать.

 
Alexey Viktorov:

Я-бы добавил ещё проверку на символ и магик

Вот кусок из моего кода где отлавливается закрытие позиции.

Можно ещё разделить по причинам закрытия из перечисления ENUM_DEAL_REASON

Вот в другом советнике

В первом случае мне нужен ордер, во втором достаточно сделки. В общем когда что нужней, то и буду писать.

Добрый вечер. Ваша отзывчивость и внимание делают мне честь. Крайне признателен. как говорит молодежь - респект и уважуха.

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

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

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)

Сейчас засяду и попробую вывести на принт все что он выдает в потоке. в качестве генератора позиций будет мой советник, он уже умеет активно накидывать позиции и не менее активно их закрывать. останется только потом разобраться какое, из кучи сообщений, однозначно информирует о закрытии позиции. Останется найти эту позицию (тикет позиции) в массиве/структуре и удалить. Вот как-то так. 

А в качестве печатной машинки попробую использовать код примера из справочника, в разделе про эту функцию, он там называется:

//|                                    OnTradeTransaction_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Пример слушателя событий TradeTransaction"

 
Sergey Voytsekhovsky:

Добрый вечер. Ваша отзывчивость и внимание делают мне честь. Крайне признателен. как говорит молодежь - респект и уважуха.

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

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

Сейчас засяду и попробую вывести на принт все что он выдает в потоке. в качестве генератора позиций будет мой советник, он уже умеет активно накидывать позиции и не менее активно их закрывать. останется только потом разобраться какое, из кучи сообщений, однозначно информирует о закрытии позиции. Останется найти эту позицию (тикет позиции) в массиве/структуре и удалить. Вот как-то так. 

А в качестве печатной машинки попробую использовать код примера из справочника, в разделе про эту функцию, он там называется:

Всегда приятно поделиться своими небольшими знаниями с человеком который на основе этих советов что-то самостоятельно выясняет из документации. © И.А. Крылов. Кукушка хвалит Петуха, за то, что хвалит он Кукушку. )))

Если советник пишется исключительно для себя, конечно можно допускать какие-то вольности. Считаете не обязательным проверять символ и магик, значит не надо.

По поводу выделенного:

Есть всё, и тикет позиции, и тикет ордера, и тикет сделки. И даже не составляет труда вытащить сделку и\или ордер открывающий позицию. Всё это в структуре MqlTradeTransaction


    if(!PositionSelectByTicket(trans.position)) // Если позицию выбрать не получилось, значит она закрыта
     {
      HistorySelectByPosition(trans.position); // Получим список ордеров и сделок относящихся к этой, конкретной позиции
      ulong ordTicket = HistoryOrderGetTicket(0); // Получили тикет ордера который породил сделку и позицию.
      if(HistoryOrderGetInteger(ordTicket, ORDER_MAGIC) == magick && HistoryOrderGetString(ordTicket, ORDER_SYMBOL) == _Symbol)
       {
 
Если позицию выбрать не получилось, значит она закрыта 
Ой-ли? 
 
Алексей Тарабанов:

Алексей, это всё относится исключительно к обработке события OnTradeTransaction

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

          ulong dealTicketOUT = HistoryDealGetTicket(1);
          if(HistoryDealGetInteger(dealTicketOUT, DEAL_ENTRY) == DEAL_ENTRY_OUT)
И надо учитывать, что разговор идёт о счёте hadge где позиция, как правило, имеет только по два ордера и две сделки.