Я пишу дополнения к роботам, класс читающий историю сделок. Во время написания, возник вопрос, Если позиция закрывается по типу DEAL_ENTRY_OUT_BY, то ее ID (DEAL_POSITION_ID) все еще будет соответствовать ID сделки которая открыла ее ?
Напишите короткий скрипт для проверки. По-памяти, ID CloseBy-сделки остается прежним. Новая позиция получает новый ID. Поэтому в такой ситуации сделку открытия новой позиции не найти через его ID. Но это мало кого волнует.
***
Как заработает рынок, можете поэкспериментировать с открытием, закрытием ... и попутно запуская скрипт 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 | |
Как заработает рынок, можете поэкспериментировать с открытием, закрытием
А тестер для чего тогда?!
А тестер для чего тогда?!
Если в тестере, то тогда к скрипту нужно прикручивать класс 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
И это все! Ничего дожидаться не нужно. Для ответа на подобные вопросы всегда достаточно написать несколько строк для тестера.
Мудрите. Вот скрипт (CTrade прикрутить Вам не сложно, а мне так проще)
Результат
И это все! Ничего дожидаться не нужно. Для ответа на подобные вопросы всегда достаточно написать несколько строк для тестера.
Пишите на MQL5. Я старый код не смотрю. Выкиньте уже этот якорь со своей шеи - легче дышать будете.
Пишите на MQL5. Я старый код не смотрю. Выкиньте уже этот якорь со своей шеи - легче дышать будете.
Напишите в своем стиле, а там сравним всем форумом, чей якорь толще.
Напишите в своем стиле, а там сравним всем форумом, чей якорь толще.
Не спорь с модератором. У барабашки и толще и больше.))))
Не спорь с модератором. У барабашки и толще и больше.))))
Тут по всем пунктам уступаю, однозначно. Но не совсем понимаю, как получается заниматься портированием старых кодов под СБ.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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));
Наверное, можно правильнее.
Тут по всем пунктам уступаю, однозначно. Но не совсем понимаю, как получается заниматься портированием старых кодов под СБ.
А из "старого" только это
Наверное, можно правильнее.
Возможно уже говорил, хотя и не факт, что слово в слово. Мысль такая: "форум это не место где меряются пипками, форум В ПЕРВУЮ ОЧЕРЕДЬ - несёт образовательную нагрузку. Главная цель форума - ДОСТУПНО и НАГЛЯДНО (по возможности по шагам) провести пользователя от начала поставленной задачи к её завершению".
Поэтому решение в три строки (образно) не может быть информативным. Скорее такое решение в три строки (образно) оставит больше вопросов, чем ответов и ещё больше запутает пользователя изучающего MQL5 язык.
Вышел из дискуссии.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я пишу дополнения к роботам, класс читающий историю сделок. Во время написания, возник вопрос, Если позиция закрывается по типу 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 должен остаться неизменен, однако так ли оно будет ??? Может быть кто нибудь уже сталкивался, либо просто более компетентен в этом вопросе ?
На скрине все показано более графически.