собственно сабж:
если по шагам, то такие вопросы:
1. как узнать, что ранее открытая позиция уже закрылась?
2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?
PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать
когда позиция открыта, все работает - вопросов, пока не возникло , кока не решил только проблемы вопросов 1 и 2
1. полностью закрыта позиция тогда, когда а) позиции нет среди открытых б) сумма лотов сделок DEAL OUT равна сумме лотов DEAL IN, на хедже просто, на неттинге чуть замороченней, ещё надо учитывать перевороты.
2. просуммировать прибыль всех DEAL OUT по этой позиции.
1. полностью закрыта позиция тогда, когда а) позиции нет среди открытых б) сумма лотов сделок DEAL OUT равна сумме лотов DEAL IN, на хедже просто, на неттинге чуть замороченней, ещё надо учитывать перевороты.
2. просуммировать прибыль всех DEAL OUT по этой позиции.
код нужен, логику представляю, но в код за сутки так и не смог превратить
поиском по форуму, много обсуждений более 5-тилетней давности. в кодобазе все с использованием СБ и OnTradeTransaction
datetime dt=TimeCurrent(); if(HistorySelect(OnInit_time,dt)) for(int i=HistoryDealsTotal()-1; i>=0; i--) { CDealInfo Deal; CPositionInfo Position; if(!Deal.SelectByIndex(i)) continue; ulong ticket=Deal.Ticket(); ulong ordticket=HistoryDealGetInteger(ticket,DEAL_ORDER); long type=Deal.DealType(); Position.SelectByTicket(Deal.PositionId()); int entry=Deal.Entry(); if(entry==DEAL_ENTRY_OUT && Deal.Symbol()==Symbol() && (Deal.Magic()==MagicNo || Position.Magic()==MagicNo) && DealsTicketArray.SearchLinear(ticket)<0 && DealsTicketArray.Add(ticket) ) { profit+=Deal.Profit(); } }можно и попроще, у Сабера видел через выбор истории по позиции HistorySelectByPosition
HistorySelectByPosition
- www.mql5.com
Чем не подходит https://www.mql5.com/ru/docs/trading/historyselectbyposition ?
подходит, но не разобрался как узнать, что позиция закрыта и соответственно вопрос возник
вот набросал по схеме, что @Aleksey Mavrin предложил , не уверен, что все правильно сделал
if(HistorySelectByPosition(pos_id)) // если позиция закрыта { for(int i = HistoryDealsTotal() - 1; i >= 0; i--) { ulong ticket = HistoryDealGetTicket(i); if(HistoryDealGetInteger(ticket, DEAL_TYPE) == DEAL_ENTRY_OUT) profit += HistoryDealGetDouble(ticket, DEAL_PROFIT); } } else // если позиция открыта { if(!PositionSelectByTicket(pos_ticket)) { Print("Err : ", GetLastError()); return; } profit+=PositionGetDouble(POSITION_PROFIT); }
можно и попроще, у Сабера видел через выбор истории по позиции HistorySelectByPosition
HistorySelectByPosition
ОК, хоть что то, с чего начать!
подходит, но не разобрался как узнать, что позиция закрыта и соответственно вопрос возник
вот набросал по схеме, что @Aleksey Mavrin предложил , не уверен, что все правильно сделал
ОК, хоть что то, с чего начать!
вариант норм, но учти, что позиция может быть одновременно и открыта, и частично закрыта (в истории есть аут сделки)
что именно в этом случае покажет
PositionGetDouble(POSITION_PROFIT);
, я не поверял . но у тебя одна ветка if только отработает
вариант норм, но учти, что позиция может быть одновременно и открыта, и частично закрыта (в истории есть аут сделки)
исключено, это конечный автомат у меня - открыть/закрыть ордер
и группа ордеров - группа конечных автоматов
изучаю вариант исключительно для тестера
в МТ4-style все работает как часы, структура примерно такая:
for(int i = ArraySize(WORKORDERS) - 1; i >= 0; i--) { //--- O_STATUS_CLOSE if(WORKORDERS[i].status == O_STATUS_CLOSE) { } //--- O_STATUS_READY if(WORKORDERS[i].status == O_STATUS_READY) { } //--- O_STATUS_OPEN if(WORKORDERS[i].status == O_STATUS_OPEN && OrderSelect(WORKORDERS[i].ticket, SELECT_BY_TICKET)) { WORKORDERS[i].profit = OrderProfit();// + OrderCommission() + OrderSwap(); if(OrderCloseTime() > 0) WORKORDERS[i].status = O_STATUS_CLOSE; } //--- calc profit profit += WORKORDERS[i].profit; }
но решил уже "добить" изучение MQL5 - хочу оценить скорость/возможности, да и только ордерную систему МТ5 не изучил до конца - спать не дает спокойно )))
всё же поправить надо, т.к. сделки -ин в истории есть когда позиция еще открыта
нужен код для тестера... максимально быстро=работающий код, для хэдж-счетов
с открытием позиции (с помощью справки), разобрался - открывает и возвращает тикет позиции, с закрытием (как отложенных ордеров, так и позиции) - тоже проблем нет
одна не решенная проблема - первый пост
собственно сабж:
если по шагам, то такие вопросы:
1. как узнать, что ранее открытая позиция уже закрылась?
2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?
PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать
когда позиция открыта, все работает - вопросов, пока не возникло , только не решил только проблемы вопросов 1 и 2
UPD: нужна реализация (код) для хэдж-счета
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
собственно сабж:
если по шагам, то такие вопросы:
1. как узнать, что ранее открытая позиция уже закрылась?
2. как зная POSITION_TICKET или POSITION_IDENTIFIER максимально простым способом узнать прибыль позиции по закрытии?
PS: интересует реализация для тестера (максимально простой и быстрый код), варианты с OnTradeTransaction пока не хочу использовать
когда позиция открыта, все работает - вопросов, пока не возникло , только не решил только проблемы вопросов 1 и 2
UPD: нужна реализация (код) для хэдж-счета