работа с динамическим массиов

Всем привет!

Открываемые позиции записываются в массив для дальнейшей работы с ними по разным условия...

При условии закрытия позиции по SL или TP как удалить хвосты из массива от этой сделки?

как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться

  • В MQL4 по комментариям и сравнении цены закрытия со СЛ / ТП, хотя точного соответствия может не быть из-за проскальзываний. Да и комментарии не всегда дают правильный результат, бывает их переписывают по разным причинам.
  • В MQL5 через DEAL_REASON (DEAL_REASON_SL / DEAL_REASON_FP) - это точнее и надежнее чем в MQL4
Mikhail Gmyrov #:

как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться

tесли супер точность не нужна то сравнить фин результат( 0> ; 0<)
Mikhail Gmyrov #:

как удалять из массива через PositionClose разобрался, а как определить закрытую позицию по SL или TP не могу разобраться

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

P.S.

А вообще, ни проще ли работать с тикетом ордера? Ордер открылся - вносим его тикет в массив. Ордер с зазадным тикетом исчез - удаляем это тикет из массива.

Vitaly Murlenko #:

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

P.S.

А вообще, ни проще ли работать с тикетом ордера? Ордер открылся - вносим его тикет в массив. Ордер с зазадным тикетом исчез - удаляем это тикет из массива.

Я так хочу, после закрытия ордера найти его по тикету и удалить из массива…! Только как его в массиве найти, когда не понятно когда он закрылся! 

То есть, я закрываю позиции и удаляю их из массива когда выполняются условия! 
Условия = true; mt.close ищу по тикету и тут же их удаляю и они исчезают из массива!

А закрываемые по SL или TP позиции сами, без условий моих, закрываются и удаляются из массива, отображаемого в журнале, только хвосты от них остаются!
А как написать код чтобы удалить позиции закрытые по Sl или Tp не могу сообразить! 
Mikhail Gmyrov #:
Я так хочу, после закрытия ордера найти его по тикету и удалить из массива…! Только как его в массиве найти, когда не понятно когда он закрылся! 

То есть, я закрываю позиции и удаляю их из массива когда выполняются условия! 
Условия = true; mt.close ищу по тикету и тут же их удаляю и они исчезают из массива!

А закрываемые по SL или TP позиции сами, без условий моих, закрываются и удаляются из массива, отображаемого в журнале, только хвосты от них остаются!
А как написать код чтобы удалить позиции закрытые по Sl или Tp не могу сообразить! 

Постарайтесь изучить работу OnTradeTransaction()

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

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

Вот был совет 

Grigori.S.B #:
  • В MQL4 по комментариям и сравнении цены закрытия со СЛ / ТП, хотя точного соответствия может не быть из-за проскальзываний. Да и комментарии не всегда дают правильный результат, бывает их переписывают по разным причинам.
  • В MQL5 через DEAL_REASON (DEAL_REASON_SL / DEAL_REASON_FP) - это точнее и надежнее чем в MQL4

Только там очепятка.


И ещё: Я не сразу обратил внимание на «…отображаемого в журнале, только хвосты от них остаются!…» Это не хвосты, а сделки с которыми и надо работать. 

Как вариант.

Не выставлять SL и TP вовсе. Или делать их чуть больше, с припуском, на случай форсмажора.

А закрывать ордера вручную(программно) при достижении нужных значений.

Mikhail Gmyrov #:
Я так хочу, после закрытия ордера найти его по тикету и удалить из массива…! Только как его в массиве найти, когда не понятно когда он закрылся! 

То есть, я закрываю позиции и удаляю их из массива когда выполняются условия! 
Условия = true; mt.close ищу по тикету и тут же их удаляю и они исчезают из массива!

А закрываемые по SL или TP позиции сами, без условий моих, закрываются и удаляются из массива, отображаемого в журнале, только хвосты от них остаются!
А как написать код чтобы удалить позиции закрытые по Sl или Tp не могу сообразить! 

ничего не понятно, но очень интересно ;-)

что вы держите в массиве и что-то в нём всё время ищите? там только тикет что-ли..а зачем

когда в своих массивах и структурах можно и нужно держать всю необходимую информацию

образно:

MyOrder *TRADE[]; // массив содержит все мои (робота) ордера и позиции, с необходимым дополнениями

bool SyncTRADE(); // синхронизирует данные терминала и массив. Вызывает обработчики OnOrderOpen OnOrderClose Modifed и.т.п

void CheckSyncTRADE(); // проверяет необходимость синхронизации (по истечении времени, изменилась маржа, кол-во ордеров/позиций и т.п.), и вызывает SyncTRADE

// события связанные с ордерами и позициями

void OnOrderClose(MyOrder &order,int reason); // для примера - обработчик "позиция закрылась". Вызовет метод order.OnClose(reason)


PS/ странный мир, AI внедряют со страшной силой во все поля, а сделать нормальный редактор в форуме что-то мешает. Может есть такая религия ? где "cделать хорошо это грех, харам и вообще запрет"
Putnik #:

Как вариант.

Не выставлять SL и TP вовсе. Или делать их чуть больше, с припуском, на случай форсмажора.

А закрывать ордера вручную(программно) при достижении нужных значений.

В работе надо чтобы использовался трейлинг-стоп