как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться
- В MQL4 по комментариям и сравнении цены закрытия со СЛ / ТП, хотя точного соответствия может не быть из-за проскальзываний. Да и комментарии не всегда дают правильный результат, бывает их переписывают по разным причинам.
- В MQL5 через DEAL_REASON (DEAL_REASON_SL / DEAL_REASON_FP) - это точнее и надежнее чем в MQL4
как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться
как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться
Вы не полностью выложили суть проблемы. Если у ордера стоплосс не двигается в торгах, то при срабатывании стопа у ордера гарантированно будет отрицательный профит. Но если в процессе торга стоп переехал в ноль или в зону положительного профита, то понадобятся пляски с бубном. Мы можем из истории вынуть цену закрытия ордера. Если она относительно точно совпадает с ценой установки тейка, то ордер закрыт по тейку. Если ордер закрыт с профитом, но цена закрытия значительно отличается от цены установки тейка, то ордер закрыт по стоплоссу, или закрыт принудительным приказом закрытия.
P.S.
А вообще, ни проще ли работать с тикетом ордера? Ордер открылся - вносим его тикет в массив. Ордер с зазадным тикетом исчез - удаляем это тикет из массива.
Вы не полностью выложили суть проблемы. Если у ордера стоплосс не двигается в торгах, то при срабатывании стопа у ордера гарантированно будет отрицательный профит. Но если в процессе торга стоп переехал в ноль или в зону положительного профита, то понадобятся пляски с бубном. Мы можем из истории вынуть цену закрытия ордера. Если она относительно точно совпадает с ценой установки тейка, то ордер закрыт по тейку. Если ордер закрыт с профитом, но цена закрытия значительно отличается от цены установки тейка, то ордер закрыт по стоплоссу, или закрыт принудительным приказом закрытия.
P.S.
А вообще, ни проще ли работать с тикетом ордера? Ордер открылся - вносим его тикет в массив. Ордер с зазадным тикетом исчез - удаляем это тикет из массива.
Я так хочу, после закрытия ордера найти его по тикету и удалить из массива…! Только как его в массиве найти, когда не понятно когда он закрылся!
Постарайтесь изучить работу OnTradeTransaction()
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
Если какая либо позиция закрывается, открывается или ещё что-то с ней происходит все эти действия обрабатываются в OnTradeTransaction(). Остаётся только их отфильтровать. На какие реагировать, а какие пропустить мимо. Вот тут и отловите закрытие по SL/TP и потом в отсортированном массиве находите индекс который соответствует этой позиции и её удаляете.
Вот был совет
- В MQL4 по комментариям и сравнении цены закрытия со СЛ / ТП, хотя точного соответствия может не быть из-за проскальзываний. Да и комментарии не всегда дают правильный результат, бывает их переписывают по разным причинам.
- В MQL5 через DEAL_REASON (DEAL_REASON_SL / DEAL_REASON_FP) - это точнее и надежнее чем в MQL4
Только там очепятка.
И ещё: Я не сразу обратил внимание на «…отображаемого в журнале, только хвосты от них остаются!…» Это не хвосты, а сделки с которыми и надо работать.
Как вариант.
Не выставлять SL и TP вовсе. Или делать их чуть больше, с припуском, на случай форсмажора.
А закрывать ордера вручную(программно) при достижении нужных значений.
Я так хочу, после закрытия ордера найти его по тикету и удалить из массива…! Только как его в массиве найти, когда не понятно когда он закрылся!
ничего не понятно, но очень интересно ;-)
что вы держите в массиве и что-то в нём всё время ищите? там только тикет что-ли..а зачем
когда в своих массивах и структурах можно и нужно держать всю необходимую информацию
образно:
MyOrder *TRADE[]; // массив содержит все мои (робота) ордера и позиции, с необходимым дополнениями
bool SyncTRADE(); // синхронизирует данные терминала и массив. Вызывает обработчики OnOrderOpen OnOrderClose Modifed и.т.п
void CheckSyncTRADE(); // проверяет необходимость синхронизации (по истечении времени, изменилась маржа, кол-во ордеров/позиций и т.п.), и вызывает SyncTRADE
// события связанные с ордерами и позициями
void OnOrderClose(MyOrder &order,int reason); // для примера - обработчик "позиция закрылась". Вызовет метод order.OnClose(reason)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Открываемые позиции записываются в массив для дальнейшей работы с ними по разным условия...
При условии закрытия позиции по SL или TP как удалить хвосты из массива от этой сделки?