Как принудительно проверить журнал ?

 

Здравствуйте.

Возможность отследить в истории какой ордер закрылся последним и как,можно например функцией Кима  GetTypeLastClosePos() (спасибо ему)

или так - if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){реализация своего кода;}

но вот задача : удалился ордер,на его данных реализуется дальнейшая установка ордера, а с сервера еще не пришел ответ что ордер закрылся(соображает) , в  это время приходит тик и программа подставляет данные предыдущего, чего не хотелось бы. не могу сообразить как запретить выполнении программы пока не пришел ответ о "настоящем" последнем ордере.  По типу послал - OrderClose () ,ждешь пока придет true - можно. Я так делал, все равно пропускает.    А  что делать если его руками удалил? Провал?  Может есть такая возможность чтобы проверять журнал в нужный момент?

Александр. 

 
expertboss:

Здравствуйте.

Возможность отследить в истории какой ордер закрылся последним и как,можно например функцией Кима  GetTypeLastClosePos() (спасибо ему)

или так - if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){реализация своего кода;}

но вот задача : удалился ордер,на его данных реализуется дальнейшая установка ордера, а с сервера еще не пришел ответ что ордер закрылся(соображает) , в  это время приходит тик и программа подставляет данные предыдущего, чего не хотелось бы. не могу сообразить как запретить выполнении программы пока не пришел ответ о "настоящем" последнем ордере.  По типу послал - OrderClose () ,ждешь пока придет true - можно. Я так делал, все равно пропускает.    А  что делать если его руками удалил? Провал?  Может есть такая возможность чтобы проверять журнал в нужный момент?

Александр. 

я бы поробовал так : запоминаем номер тикера последней сделки ( можно хранить в массиве ) и в процессе работы программы сравниваем этот тикер с запрашиваемым через MODE_HISTORY . если обнаружится несовпадение значит пришел ответ о закрытии ордера и только тогда true -можно 
 
Boeing747:
я бы поробовал так : запоминаем номер тикера последней сделки ( можно хранить в массиве ) и в процессе работы программы сравниваем этот тикер с запрашиваемым через MODE_HISTORY . если обнаружится несовпадение значит пришел ответ о закрытии ордера и только тогда true -можно 

=====================================
..... если обнаружится несовпадение значит пришел....

======================================

Простите не понял   может .... совпадение ......

За идею спасибо большое, передумываешь кучу вариантов - начинаешь сам зацикливаться. :) 

с Ув. Александр. 

 
expertboss:

=====================================
..... если обнаружится несовпадение значит пришел....

======================================

Простите не понял   может .... совпадение ......

именно несовпадение.  покажу на простом примере   

intstart()

{

 

 

  if (  x != n )

{

x = n; 

//----установка нового ордера  

}

// n это номер тикера последней сделки , x статичная переменная

 

 return;

 
Boeing747:

именно несовпадение.  покажу на простом примере   

intstart()

{

 

 

  if (  x != n )

{

x = n; 

//----установка нового ордера  

}

// n это номер тикера последней сделки , x статичная переменная

 

 return;

Тяжело доходит - но понял тонкости Еще раз спасибо!

Александр.

 
expertboss:

Тяжело доходит - но понял тонкости Еще раз спасибо!

Александр.

 

 

напишите мне ту часть кода которую вы бы хотели как нибудь исправить . если я правильно понял у вас выдает ошибку что торговый поток занят да ? то есть вы бы хотели закрыть ту часть кода отвечающего за закрытие одера от тиков пока действует условие на закрытие ордера ?
 
Boeing747:
напишите мне ту часть кода которую вы бы хотели как нибудь исправить . если я правильно понял у вас выдает ошибку что торговый поток занят да ? то есть вы бы хотели закрыть ту часть кода отвечающего за закрытие одера от тиков пока действует условие на закрытие ордера ?
то есть нужно  закрыть функцию закрытия ордера OrderClose() от следующих тиков пока не закроется ордер ?
 

 ============================================================================

 то есть нужно  закрыть функцию закрытия ордера OrderClose() от следующих тиков пока не закроется ордер ?

 ============================================================================

 Все правильно только я хотел закрыть весь советник с начала. (использую эмуляцию тиков)  https://forum.mql4.com/ru/52121 и как вариант 

 https://forum.mql4.com/ru/36412 

 

 Эта первая версия что я написал -----  и ниже как исправил  }else{ вроде должно получиться Исправления по смыслу подходят проверить пока не могу тиков нет. от сервера

 

 

 int start()
    {
//    не пропускать выполение пока не появиться в истории  искомый "Tiket" 

   i=OrdersHistoryTotal()-1;    //   (или можно перебором всего журнала)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){
   if(OrderSymbol()==Symbol() &&    ... OrderTicket()== Tiket ...    && OrderMagicNumber()== Magic){

   return();

   }}                              

    ВОТ ЗДЕСЬ ЖЕ НАДО ЧТОБЫ БЫЛО .... совпадение .....
  единственное что не додумал верхняя функция не пропустит если совпадение 
  надо как-то сделать   -  }else{

=========================================================
//  тело программы
=========================================================
//   проверка присутствия ордера

  for (i=0;i<OrdersTotal();i++){if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
  if (OrderSymbol()!=Symbol()) continue;   
   if (OrderType()==OP_SELL && OrderMagicNumber()== Magic) {// если открыт ордер в продажу
         Tiket     = OrderTicket(); // запоминаем тикет

// . . . . . . . . .  . .. 

   if (....) Close_Sell_lot();

return();


void Close_Sell_lot(){
  if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua)) // закрытие 0.1 лота 

      {Print(" Зак.орд.#= ",OrderTicket(),"Ошибка #= ",GetLastError());RefreshRates();}

 ==========================================================

 исправления ----------------------------------------

 for (i=0;i<OrdersHistoryTotal();i++){

    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){

    if(OrderSymbol()==Symbol() && OrderMagicNumber()== Magic){

    if(Tiket!=OrderTicket()){return(0);}}}}

----------------------------------------------

 

 


 
система эта понадобилась чтобы иследовать последний закрытый ордер и на результатах продолжать торговлю но при проверке оказалось что последние ордера пропускаются потому что еще не пришли результаты с сервера о закрытии, соответственно советник обрабатывал предпоследний и выдавал не корректную информацию.  Сейчас, как думаю, советник проигнорирует тики пока не придет достоверный ответ что вот этот "тикет" тот самый последний с ним и продолжай. по этому наверно и не сообразил почему  надо "несовпадение " , а не  .... совпадение ......
 
expertboss:

 ============================================================================

 то есть нужно  закрыть функцию закрытия ордера OrderClose() от следующих тиков пока не закроется ордер ?

 ============================================================================

 Все правильно только я хотел закрыть весь советник с начала. (использую эмуляцию тиков)  https://forum.mql4.com/ru/52121 и как вариант 

 https://forum.mql4.com/ru/36412 

 

 Эта первая версия что я написал -----  и ниже как исправил  }else{ вроде должно получиться Исправления по смыслу подходят проверить пока не могу тиков нет.

 

 

 int start()
    {
//    не пропускать выполение пока не появиться в истории  искомый "Tiket" 
   i=OrdersHistoryTotal()-1;    //   (или можно перебором всего журнала)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){
   if(OrderSymbol()==Symbol() &&    ... OrderTicket()== Tiket ...    && OrderMagicNumber()== Magic){
   return();
   }}                              
    ВОТ ЗДЕСЬ ЖЕ НАДО ЧТОБЫ БЫЛО .... совпадение .....
  единственное что не додумал верхняя функция не пропустит если совпадение 
  надо как-то сделать   -  }else{
=========================================================
//  тело программы
=========================================================
//   проверка присутствия ордера
  for (i=0;i<OrdersTotal();i++){if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
  if (OrderSymbol()!=Symbol()) continue;   
   if (OrderType()==OP_SELL && OrderMagicNumber()== Magic) {// если открыт ордер в продажу
         Tiket     = OrderTicket(); // запоминаем тикет
// . . . . . . . . .  . .. 
   if (....) Close_Sell_lot();
return();
void Close_Sell_lot(){
  if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua)) // закрытие 0.1 лота 

      {Print(" Зак.орд.#= ",OrderTicket(),"Ошибка #= ",GetLastError());RefreshRates();}

 ==========================================================

 

 for (i=0;i<OrdersHistoryTotal();i++){

    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true){

    if(OrderSymbol()==Symbol() && OrderMagicNumber()== Magic){

    if(Tiket!=OrderTicket()){return(0);}}}}

 

 

хорошо. попробую придумать что нибудь. ни разу не сталкивался с такой задачей .. но все равно часть верхнего когда эсперта должна постоянно мониторить список ордеров в экаунт хистори или в списке действующих ордеров . то есть не получиться полностью закрыть код эксперта от тиков начиная сразу же от int start()  ..конечно если было бы достаточно отсутсвия открытого ордера или ордеров по определенному инструменту для условия прекращения подачи тиков в нижнюю часть кода то было бы проще реализовать такой код... а пока не закроется ордер функцией OrderClose можно было бы поместить ее в тело цикла while куда не будут проникать следующие тики пока не будет закрыт ордер  и куда можно внедрить функцию обработки ошибок..не хотите опробовать такой вариант для начала? мне кажется он проще и не надо будет работать с экаунт хистори и тем более не понадобиться считывать журнал  
 
Boeing747:
хорошо. попробую придумать что нибудь. ни разу не сталкивался с такой задачей .. но все равно часть верхнего когда эсперта должна постоянно мониторить список ордеров в экаунт хистори или в списке действующих ордеров . то есть не получиться полностью закрыть код эксперта от тиков начиная сразу же от int start()  ..конечно если было бы достаточно отсутсвия открытого ордера или ордеров по определенному инструменту для условия прекращения подачи тиков в нижнюю часть кода то было бы проще реализовать такой код... а пока не закроется ордер функцией OrderClose можно было бы поместить ее в тело цикла while куда не будут проникать следующие тики пока не будет закрыт ордер  и куда можно внедрить функцию обработки ошибок..не хотите опробовать такой вариант для начала? мне кажется он проще и не надо будет работать с экаунт хистори и тем более не понадобиться считывать журнал  

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

    

Причина обращения: