MQL4 отслеживание закрытия ордера по TP - страница 2

 
Ihor Herasko #:

Не воспроизводится.

Вывод:

  ты что, никогда не торговал что-ли ?????

 
adamsm1th #:

А как мне поможет анализ открытых позиций, если ордер после достижения tp становится закрытым?

Вы не указали что нужно делать. Это комент на случай, если Вы заложник неправильной постановки задачи. Предположил, что цель это менеджмент советника, так вот он обычно делается по открытым позициям.
 
Maxim Kuznetsov #:

  ты что, никогда не торговал что-ли ?????

Переход на личности. 

 
adamsm1th #:

А ну так я и изначально планировал в onTimer, как и описал в вопросе. Ответили, что каждая секунда будет редко.

ордертотал в начале кода в онтике - если кол ордеров изменилось то смотрите в историю ордеров и по комменту ордера узнаёте был ли это тп, это будет похоже на функцию онтрейд или онтрейтранзакшн из мкл5
 
Aleksey Semenov #:
ордертотал в начале кода в онтике - если кол ордеров изменилось то смотрите в историю ордеров и по комменту ордера узнаёте был ли это тп, это будет похоже на функцию онтрейд или онтрейтранзакшн из мкл5

как и предыдущему оратору : 

1) OrdersTotal и OrdersHistoryTotal много чего внутри себя делают помимо того что возвращают кол-во. Они долго работают и вообще нужны для инициализации цикла прохода по ордерам, а не выявления признака "пора/не_пора". Когда активная торговля, много ордеров, несколько роботов, можно нехорошо встрять.

2) OrdersTotal() может не поменятся сразу. Ваш ордер закрытый по TP остаётся в пуле TRADES, у него просто будет OrderCloseTime() != 0. И только потом переедет в History. То есть темп вы потеряете и протормозите с реакцией на событие

3) OrdersTotal() может вообще не поменятся. Ордер закрылся по TP, а где-то другой открылся. 

проверяйтесь по более быстрым и надёжным признакам : AccountBalance, AccountMargin. При закрытиях рыночных баланс и маржа изменятся. Для надёжности - дополнить редким таймером и (для 5-ки) в OnTrade ставить флажок "пора перепроверить"

свои ордера/позиции надо помнить и если_что_то_случилось (баланс/маржа/просто_пора) то проверять конкретно их, а не весь пул ордеров. 

PS/ в OnTick надо только торговать. Тогда всё будет хорошо и шанс REQUOTE/NO_PRICE резко поубавится. Все остальные проверки, тесты, сигналы - всё в низкий приоритет (когда совсем нечего делать) и на таймер

 
Maxim Kuznetsov #:

как и предыдущему оратору : 

1) OrdersTotal и OrdersHistoryTotal много чего внутри себя делают помимо того что возвращают кол-во. Они долго работают и вообще нужны для инициализации цикла прохода по ордерам, а не выявления признака "пора/не_пора". Когда активная торговля, много ордеров, несколько роботов, можно нехорошо встрять.

2) OrdersTotal() может не поменятся сразу. Ваш ордер закрытый по TP остаётся в пуле TRADES, у него просто будет OrderCloseTime() != 0. И только потом переедет в History. То есть темп вы потеряете и протормозите с реакцией на событие

3) OrdersTotal() может вообще не поменятся. Ордер закрылся по TP, а где-то другой открылся. 

проверяйтесь по более быстрым и надёжным признакам : AccountBalance, AccountMargin. При закрытиях рыночных баланс и маржа изменятся. Для надёжности - дополнить редким таймером и (для 5-ки) в OnTrade ставить флажок "пора перепроверить"

свои ордера/позиции надо помнить и если_что_то_случилось (баланс/маржа/просто_пора) то проверять конкретно их, а не весь пул ордеров. 

PS/ в OnTick надо только торговать. Тогда всё будет хорошо и шанс REQUOTE/NO_PRICE резко поубавится. Все остальные проверки, тесты, сигналы - всё в низкий приоритет (когда совсем нечего делать) и на таймер

Пункт 1 и 2 — Это вы от fxsaber`a заразились?

Пункт 3 — Абсолютно согласен. Такую ситуацию представить можно, следовательно можно и нарваться.

 
Alexey Viktorov #:

Пункт 1 и 2 — Это вы от fxsaber`a заразились?

Пункт 3 — Абсолютно согласен. Такую ситуацию представить можно, следовательно можно и нарваться.

А можно представить локирование, при котором баланс не изменится?

 
Artyom Trishkin #:

А можно представить локирование, при котором баланс не изменится?

можно представить и локирование, но маржа изменится. Чтобы при рыночных открытиях/закрытиях не изменились ни баланс ни маржа - фантастичная ситуация, и на то редкий таймер

и пункт 1,2 это практика..

 
Maxim Kuznetsov #:

как и предыдущему оратору : 

1) OrdersTotal и OrdersHistoryTotal много чего внутри себя делают помимо того что возвращают кол-во. Они долго работают и вообще нужны для инициализации цикла прохода по ордерам, а не выявления признака "пора/не_пора". Когда активная торговля, много ордеров, несколько роботов, можно нехорошо встрять.

Будет воспроизводимый пример, тогда можно и дискутировать. В 5-ке - да, бывают накладки из-за асинхронности процессов, там ставка на скорость, но не в 4-ке, в которой все синхронизировано, но работает медленнее. Кроме того: причем здесь OrdersTotal()?

2) OrdersTotal() может не поменятся сразу. Ваш ордер закрытый по TP остаётся в пуле TRADES, у него просто будет OrderCloseTime() != 0. И только потом переедет в History. То есть темп вы потеряете и протормозите с реакцией на событие

3) OrdersTotal() может вообще не поменятся. Ордер закрылся по TP, а где-то другой открылся. 

Опять OrdersTotal(). Не было о ней речи.


проверяйтесь по более быстрым и надёжным признакам : AccountBalance, AccountMargin. При закрытиях рыночных баланс и маржа изменятся. Для надёжности - дополнить редким таймером и (для 5-ки) в OnTrade ставить флажок "пора перепроверить"

свои ордера/позиции надо помнить и если_что_то_случилось (баланс/маржа/просто_пора) то проверять конкретно их, а не весь пул ордеров. 

Это просто другой путь, который никак не отменяет OrdersHistoryTotal(). К тому же, пока по тестам выходит, что история ордеров выигрывает. 

PS/ в OnTick надо только торговать. Тогда всё будет хорошо и шанс REQUOTE/NO_PRICE резко поубавится. Все остальные проверки, тесты, сигналы - всё в низкий приоритет (когда совсем нечего делать) и на таймер

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

 
adamsm1th:
Необходимо в код внедрить логику моментального отслеживания ордера, который был закрыт сам по TP, а не принудительно.
Была идея каждую итерацию таймера (1 сек) пробегать по всем закрытым ордерам и искать последний закрытый ордер у которого 
OrderClosePrice() >= OrderTakeProfit().
Какие у вас есть предложения?
typedef bool (*CLOSE_REASON)( void ); 

bool IsCloseTP( void )
{
  return((OrderType() <= OP_SELL) &&
         ((::StringFind(OrderComment(), "[tp]") >= 0) ||
          (OrderTakeProfit() && (OrderType() ? (OrderClosePrice() <= OrderTakeProfit())
                                             : (OrderClosePrice() >= OrderTakeProfit())))));
}

bool IsCloseReason( const CLOSE_REASON Reason )
{
  static int PrevTotal = OrdersHistoryTotal();
  
  bool Res = false;
  const int Total = OrdersHistoryTotal();
  
  for (int i = Total; !Res && (i-- > PrevTotal);)
    Res = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && Reason();
    
  PrevTotal = Total;
    
  return(Res);
}

int OnInit() { return(!EventSetMillisecondTimer(100)); }

void OnTimer()
{
  if (IsCloseReason(IsCloseTP))
  {
    Alert("Take profit worked! See the log for details.");
    OrderPrint();
  }
}
Причина обращения: