DEAL_ENTRY_TYPE, или вопрос по прочтению истории.

 

Я пишу дополнения к роботам, класс читающий историю сделок. Во время написания, возник вопрос, Если позиция закрывается по типу DEAL_ENTRY_OUT_BY, то ее ID (DEAL_POSITION_ID) все еще будет соответствовать ID сделки которая открыла ее ?

Для большей понятности, приложу скрин. Имеется ввиду, что с момента открытия, ID у сделки всегда один и тот же. И в момент закрытия позиции (ордер на закрытие или разворот) ID то же остается таким же как и в момент открытия. Однако, если вдруг мне понадобится написать советника, который будет закрывать встречным ордером, то type будет как раз как я понимаю DEAL_ENTRY_OUT_BY. И в данном случае, ID сделки на закрытие останется таким же как и на открытие ??? или же все таки изменится ??? 

Вот тут говорится об ID: (https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer)

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

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией. 

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен."


Исходя из чего я понимаю что ID должен остаться неизменен, однако так ли оно будет ??? Может быть кто нибудь уже сталкивался, либо просто более компетентен в этом вопросе ?


На скрине все показано более графически. 

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
Файлы:
 
AndreyKrivcov:

Я пишу дополнения к роботам, класс читающий историю сделок. Во время написания, возник вопрос, Если позиция закрывается по типу DEAL_ENTRY_OUT_BY, то ее ID (DEAL_POSITION_ID) все еще будет соответствовать ID сделки которая открыла ее ?

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

 
AndreyKrivcov:

***


Как заработает рынок, можете поэкспериментировать с открытием, закрытием ... и попутно запуская скрипт History Deals and Orders. Данный скрипт выводит всю  информацию из торговой истории о сделке и ордере её породившему:

Пример текстового файла:

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|144059549           |160789141           |2017.08.02 10:35:46 |1501670146218       |DEAL_TYPE_SELL      |DEAL_ENTRY_IN       |0                   |DEAL_REASON_CLIENT  |160789141          
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.01                |1.18265             |0.00                |0.00                |0.00                |EURUSD              |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|160789141           |2017.08.02 10:35:46 |ORDER_TYPE_SELL     |ORDER_STATE_FILLED  |2017.08.02 10:35:46 |2017.08.02 10:35:46 |1501670146217       |1501670146218       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |160789141           |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|0.01                |0.00                |1.18265             |0.00000             |0.00000             |1.18265             |0.00000            
|Symbol              |Comment                                  |Extarnal id        
|EURUSD              |                                         |                   

Deal:
|Ticket              |Order               |Time                |Time msc            |Type                |Entry               |Magic               |Reason              |Position ID        
|144059588           |160789184           |2017.08.02 10:35:55 |1501670155724       |DEAL_TYPE_BUY       |DEAL_ENTRY_OUT      |0                   |DEAL_REASON_CLIENT  |160789141          
|Volume              |Price               |Commission          |Swap                |Profit              |Symbol              |Comment                                  |External ID        
|0.01                |1.18276             |0.00                |0.00                |-0.09               |EURUSD              |                                         |                   
Order:
|Ticket              |Time setup          |Type                |State               |Time expiration     |Time done           |Time setup msc      |Time done msc       |Type filling       
|160789184           |2017.08.02 10:35:55 |ORDER_TYPE_BUY      |ORDER_STATE_FILLED  |2017.08.02 10:35:55 |2017.08.02 10:35:55 |1501670155724       |1501670155724       |ORDER_FILLING_FOK  
|Type time           |Magic               |Reason              |Position id         |Position by id     
|1970.01.01 00:00:00 |0                   |ORDER_REASON_CLIENT |160789141           |0                  
|Volume initial      |Volume current      |Open price          |sl                  |tp                  |Price current       |Price stoplimit    
|0.01                |0.00                |1.18276             |0.00000             |0.00000             |1.18276             |0.00000            
|Symbol              |Comment                                  |Extarnal id        
|EURUSD              |                                         |
 
Vladimir Karputov:

Как заработает рынок, можете поэкспериментировать с открытием, закрытием

А тестер для чего тогда?!

 
fxsaber:

А тестер для чего тогда?!


Если в тестере, то тогда к скрипту нужно прикручивать класс CTrade, прописывать условия - когда зайти, когда выйти ... А вот если дождаться открытия рынка, тогда можно открывать/закрывать/перекрывать вручную и попутно запускать скрипт. Всё должно быть как можно проще.

 
Vladimir Karputov:

Если в тестере, то тогда к скрипту нужно прикручивать класс CTrade, прописывать условия - когда зайти, когда выйти ... А вот если дождаться открытия рынка, тогда можно открывать/закрывать/перекрывать вручную и попутно запускать скрипт. Всё должно быть как можно проще.

Мудрите. Вот скрипт (CTrade прикрутить Вам не сложно, а мне так проще)
#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0));

  ExpertRemove();
}

#define TOSTRING(A) #A + " = " + (string)(A) + " "

void OnDeinit( const int )
{
  if (HistorySelect(0, INT_MAX))  
    for (int i = 0; i < HistoryDealsTotal(); i++)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      Print(TOSTRING(Ticket) + TOSTRING(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)) +
            EnumToString((ENUM_DEAL_ENTRY)HistoryDealGetInteger(Ticket, DEAL_ENTRY)) + " " + 
            EnumToString((ENUM_DEAL_TYPE)HistoryDealGetInteger(Ticket, DEAL_TYPE)));
    }  
}

Результат

2017.11.03 00:00:00   Ticket = 1 HistoryDealGetInteger(Ticket,DEAL_POSITION_ID) = 0 DEAL_ENTRY_IN DEAL_TYPE_BALANCE
2017.11.03 00:00:00   Ticket = 2 HistoryDealGetInteger(Ticket,DEAL_POSITION_ID) = 2 DEAL_ENTRY_IN DEAL_TYPE_SELL
2017.11.03 00:00:00   Ticket = 3 HistoryDealGetInteger(Ticket,DEAL_POSITION_ID) = 3 DEAL_ENTRY_IN DEAL_TYPE_BUY
2017.11.03 00:00:00   Ticket = 4 HistoryDealGetInteger(Ticket,DEAL_POSITION_ID) = 3 DEAL_ENTRY_OUT_BY DEAL_TYPE_SELL
2017.11.03 00:00:00   Ticket = 5 HistoryDealGetInteger(Ticket,DEAL_POSITION_ID) = 2 DEAL_ENTRY_OUT_BY DEAL_TYPE_BUY

И это все! Ничего дожидаться не нужно. Для ответа на подобные вопросы всегда достаточно написать несколько строк для тестера.

 
fxsaber:
Мудрите. Вот скрипт (CTrade прикрутить Вам не сложно, а мне так проще)

Результат

И это все! Ничего дожидаться не нужно. Для ответа на подобные вопросы всегда достаточно написать несколько строк для тестера.


Пишите на MQL5. Я старый код не смотрю. Выкиньте уже этот якорь со своей шеи - легче дышать будете.

 
Vladimir Karputov:

Пишите на MQL5. Я старый код не смотрю. Выкиньте уже этот якорь со своей шеи - легче дышать будете.

Напишите в своем стиле, а там сравним всем форумом, чей якорь толще.

 
fxsaber:

Напишите в своем стиле, а там сравним всем форумом, чей якорь толще.

Не спорь с модератором. У барабашки и толще и больше.))))

 
Alexey Viktorov:

Не спорь с модератором. У барабашки и толще и больше.))))

Тут по всем пунктам уступаю, однозначно. Но не совсем понимаю, как получается заниматься портированием старых кодов под СБ.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

DEAL_ENTRY_TYPE, или вопрос по прочтению истории.

Vladimir Karputov, 2017.11.19 17:39

Пишите на MQL5. Я старый код не смотрю. Выкиньте уже этот якорь со своей шеи - легче дышать будете.


А из "старого" только это

OrderCloseBy(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0), OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0));

Наверное, можно правильнее.

 
fxsaber:

Тут по всем пунктам уступаю, однозначно. Но не совсем понимаю, как получается заниматься портированием старых кодов под СБ.


А из "старого" только это

Наверное, можно правильнее.


Возможно уже говорил, хотя и не факт, что слово в слово. Мысль такая: "форум это не место где меряются пипками, форум В ПЕРВУЮ ОЧЕРЕДЬ - несёт образовательную нагрузку. Главная цель форума - ДОСТУПНО и НАГЛЯДНО (по возможности по шагам) провести пользователя от начала поставленной задачи к её завершению".

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

Вышел из дискуссии.

Причина обращения: