Стоп лосс позиции после изменения - страница 2

 
Mihail Matkovskij:
Дополнил свой предыдущий ответ.
Все, что Вам нужно, это выбрать позицию, и сразу запросить ее СЛ. Это все. Никаких обращений ни к ордерам, ни к сделкам не требуется.
 
Alexey Kozitsyn:
Все, что Вам нужно, это выбрать позицию, и сразу запросить ее СЛ. Это все. Никаких обращений ни к ордерам, ни к сделкам не требуется.

В том то и дело, что выбираю открытую позицию и пытаюсь узнать её актуальный стоп лосс, с помощью следующего кода:

if(PositionSelectByTicket(Ticket){
      PositionSL = PositionGetDouble(POSITION_SL);
    }
Где, напоминаю, Ticket, это идентификатор открытой позиции. Но функция PositionSL = PositionGetDouble(POSITION_SL) даёт почему-то первоначальный стоп лосс, а не тот, который существует на данный момент. Что я, собственно и пытаюсь донести в данной теме.
 
Mihail Matkovskij:

В том, то и дело, что выбираю открытую позицию и пытаюсь узнать её актуальный стоп лосс, с помощью следующего кода:

Где, напоминаю, Ticket, это идентификатор открытой позиции. Но функция PositionSL = PositionGetDouble(POSITION_SL) даёт почему-то первоначальный стоп лосс, а не тот, который существует на данный момент. Что я, собственно и пытаюсь донести в данной теме.

Вот Вы сначала попробуйте выбрать позицию не по своему тикету, а по символу или индексу в списке позиций и запросить СЛ.

Вот если не получится - тогда будем думать дальше...

 
Mihail Matkovskij:
Но функция PositionSL = PositionGetDouble(POSITION_SL) даёт почему-то первоначальный стоп лосс, а не тот, который существует на данный момент. Что я, собственно и пытаюсь донести в данной теме.

Функция вызывается сразу после модификации? На обновление данных по изменениям в позах нужно время.

 
Alexey Kozitsyn:

Вот Вы сначала попробуйте выбрать позицию не по своему тикету, а по символу или индексу в списке позиций и запросить СЛ.

Вот если не получится - тогда будем думать дальше...

По символу выбирать не стал, так как на графике может быть много позиций. Сделал следующие:

void GetPositionSL(){
    if(Ticket <= 0) return;
    int pos_total = PositionsTotal();
    if(pos_total <= 0) return;
    for(int i = pos_total - 1; i >= 0; i--){
      if(PositionGetTicket(i) != Ticket) continue;
      PositionSL = PositionGetDouble(POSITION_SL);
      break;
    }
  }

Теперь, работает. Спасибо, Алексей!

Но не понимаю, почему при выборе позиции непосредственно по тикету это не работает, ведь, по идее, должно же? И почему нельзя получить актуальный СЛ из истории, как это сделано в MQL4?

 
Mihail Matkovskij:

По символу выбирать не стал, так как на графике может быть много позиций. Сделал следующие:

Спасибо, Алексей!

Но не понимаю, почему при выборе позиции, непосредственно, по тикету это не работает, ведь, по идее, должно же?

По идее - должно. Я бы рекомендовал Вам сделать распринтовку в случае получения некорректного СЛ. Т.е. получили "левый" СЛ - принт сохраненного тикета и тикетов всех существующих позиций.
 
Alexey Kozitsyn:
По идее - должно. Я бы рекомендовал Вам сделать распринтовку в случае получения некорректного СЛ. Т.е. получили "левый" СЛ - принт сохраненного тикета и тикетов всех существующих позиций.

С чем его сравнивать, чтобы узнать, корректный он или нет, если способ получения актуального СЛ всего один?

 
Mihail Matkovskij:

С чем его сравнивать, чтобы узнать, корректный он или нет, если способ получения актуального СЛ всего один?

Вы открыли позицию... получили ее тикет. Сохранили тикет. Дальше, при обращении к позиции по тикету (если обязательно нужно обращаться к позиции именно так)- смотрите, есть ли вообще позиция с таким тикетом. Если нет, смотрите, с какими тикетами есть вообще позиции по нужному символу/маджику.

Ищите где затык. Текущие стопы должны быть доступны без проблем.

 
Alexey Kozitsyn:

Вы открыли позицию... получили ее тикет. Сохранили тикет. Дальше, при обращении к позиции по тикету (если обязательно нужно обращаться к позиции именно так)- смотрите, есть ли вообще позиция с таким тикетом. Если нет, смотрите, с какими тикетами есть вообще позиции.

Ищите где затык. Текущие стопы должны быть доступны без проблем.

Думаю, данный способ получения СЛ должен работать корректно. Тем более, у меня в советнике пока только один ордер. С тикетом работаю, потому, что может понадобится доливка или сетка, тогда будет много позиций. Если, какую-то позицию нельзя выбрать по тикету, то значит она была закрыта, либо по стопу/тейку, либо пользователем. И искать её следует в истории с помощью события OnTrade. Но стоп лосс её все равно был записан функцией GetPositionSL() в OnTick, когда позиция была в рынке. Если одного тикета нет среди позиций, то функция завершится досрочно. Вроде, лагов быть не должно.

 
Vladimir Karputov:

А так понимаю идёт речь об этой проблеме:


Как это не отражаются? Все изменения можно отследить по истории. 

8272017.10.26 15:02modify1241.521.181151.181141.16115
8282017.10.26 15:35modify1241.521.181151.180141.16115
8292017.10.26 16:35modify1241.521.181151.179131.16115
8302017.10.26 16:40modify1241.521.181151.178131.16115
8312017.10.26 16:50modify1241.521.181151.177111.16115
8322017.10.26 17:48modify1241.521.181151.176111.16115
8332017.10.26 18:14modify1241.521.181151.175101.16115
8342017.10.26 19:47modify1241.521.181151.174101.16115
Причина обращения: