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

 
expertboss:

конечно если было бы достаточно отсутсвия открытого ордера или ордеров по определенному инструменту

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

 я пробовал писать с OrdersTotal когда он "0" и когда Orders < или >до закрытия (работа с одним ордером) по всякому  все равно проблема оставалась работает - работает потом пропустит работает пропустит в общем не получилось

    if (Orders!=OrdersTotal()){if(OrdersTotal()<Orders){Orders=OrdersTotal();

Сейчас и функцию переделал на цикл из примеров учебника: 

    while(true){   RefreshRates();         // Цикл закрытия орд.

              if (OrdersTotal()==0){Print (" Нечего удалять ");break;} // Если орд. нет выход из цикла закр

                  price = MarketInfo (OrderSymbol(),MODE_ASK);

                  Print("Попытка закрыть SE   ",LotSE,". Ожидание ответа..");

                  Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие  BU  

              if (Ans==true) {Print ("Закрыт ордер SE ",LotSE);}// Получилось :)

              if (Fun_Error(GetLastError())==1) // Обработка ошибок

                   continue; // Повторная попытка

   break;} // Выход из while

 

 Работает в тестере. Но логика такова , что нельзя работать советнику пока нет достоверной информации о ЗАКРЫТОМ ордере то что Вы посоветовали прописал осталось только подождать "тиков" от сервера 

 

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

Да надо думать, пока просматривал советника пришла еще мысль , кажется даже попроще , она только не решает вопрос

""""встанет как вкопанный .что тогда делать ?"""""  :мысль - раз послан сигнал на закрытие ордера из while с обработкой ошибок и задержек на всякий случай , то он обязательно уйдет,    Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие  BU  

 значит должен обязательно(?) прийти ответ  

вот здесь    if (Ans==true) { ......  Closing =true; .......      Print ("Закрыт ордер BU ",LotBU);}// Получилось :)


присваиваем  Closing =true;     и ждем наверху       if(Closing==false)  return(0);     как только процедура закрытия закончится и прийдет ответ не взирая на тики полагаю сразу на верху будет ждать Closing==false с ретурном

 Что-то я совсем запарился а зачем тогда он нужен будет этот Closing==false с ретурном? надо наверно перерывчик сделать, мозги кипят! 

 
expertboss:

Да надо думать, пока просматривал советника пришла еще мысль , кажется даже попроще , она только не решает вопрос

""""встанет как вкопанный .что тогда делать ?"""""  :мысль - раз послан сигнал на закрытие ордера из while с обработкой ошибок и задержек на всякий случай , то он обязательно уйдет,    Ans=OrderClose (OrderTicket(),OrderLots(),price,3,0);// Закрытие  BU  

 значит должен обязательно(?) прийти ответ  

вот здесь    if (Ans==true) { ......  Closing =true; .......      Print ("Закрыт ордер BU ",LotBU);}// Получилось :)

присваиваем  Closing =true;     и ждем наверху       if(Closing==false)  return(0);     как только процедура закрытия закончится и прийдет ответ не взирая на тики полагаю сразу на верху будет ждать Closing==false с ретурном

 Что-то я совсем запарился а зачем тогда он нужен будет этот Closing==false с ретурном? надо наверно перерывчик сделать, мозги кипят! 

 

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

у меня еще 22-00 но третьи сутки в придачу! на свежую голову надо будет все просмотреть. 

Александр.  

P.S.   //  ответ  "Ans="  с  сервера в справочнике написано  Ans=OrderClose (Orde

 

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

 if (Ans==true) { ......  Closing =true; .......      Print ("Закрыт ордер BU ",LotBU);}// Получилось :)

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

не пойдет ---  ручная торговля в пролете 

 
expertboss:

у меня еще 22-00 но третьи сутки в придачу! на свежую голову надо будет все просмотреть. 

Александр.  

P.S.   //  ответ  "Ans="  с  сервера в справочнике написано  Ans=OrderClose (Orde

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

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

 if (Ans==true) { ......  Closing =true; .......      Print ("Закрыт ордер BU ",LotBU);}// Получилось :)

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

не пойдет ---  ручная торговля в пролете 

эта проблема решается если не использовать магический номер ордера . эксперт будет работать и с ордерами выставленные вручную и со своми тоже. если нет то используйте номер магический.
 
Boeing747:
в случае успешной отправки приказа на закрытие сделки, функция OrderClose()  заканчивает свою работу после того, как дождется ответа с сервера ....по логике так и должно быть поскольку эта функция выдает два ответа после завершения своей работы true либо false..например, если ее фунция ограничивалась только тем, чтобы отправить сигнал или приказ на сервер то после отправки эта функция всегда выдавала бы только один ответ true и, отсутсвие связи с сервером, как частный случай не в счет. поэтому после завершения работы функции  OrderClose(), когда она возвращает true , одновременно ( не дожидаясь тика ) появляется соответствующая запись в журнале и в базе закрытых и удаленных ордеров ..стало быть сразу же, после окончания работы функции ордерклоуз когда она возвращает true  уже можно заглянуть в базу закрытых ордеров и посмотреть не появился ли там наш ордер не выходя из цикла  while ( true ),  где происходит закрытие ордера
Мысль понял , а если его там нет,  то поспим  "Sleep(100);" немного не выходя из while и опять проверим , и так в принципе дождемся-таки его там и дальше в работу не надо будет вначале чего-то городить типа if(Closing==false)  return(0);. Надо проверять. Но для ручного закрытия все равно надо будет копаться в истории.
 
 
Boeing747:
эта проблема решается если не использовать магический номер ордера . эксперт будет работать и с ордерами выставленные вручную и со своми тоже. если нет то используйте номер магический.

Магик я не рассматривал по умолчанию, а вопрос в том что сигнал на закрытие происходит не из эксперта и он не знает в этом случае что пошел сигнал на закрытие. Опять же "искать в журнале " что там появился новый удаленный ордер.
 
expertboss:
Мысль понял , а если его там нет,  то поспим  "Sleep(100);" немного не выходя из while и опять проверим , и так в принципе дождемся-таки его там и дальше в работу не надо будет вначале чего-то городить типа if(Closing==false)  return(0);. Надо проверять. Но для ручного закрытия все равно надо будет копаться в истории.
 

Здесь просьба есть к Вам: не соображу как добавить этот "Sleep(100);"  в обработке ошибок свои номера ошибок, а мне как добавить свой номер ошибки. Может как по другому. Эта функция опять из учебника.

 int Fun_Error(int Error)                       // Ф-ия обработ ошибок

  {

   // Error                                    // Номер ошибки   

   if(Error==0)return(0);                      // Нет ошибки

      

                

//--------------------------------------------------------------- 3 --

      switch(Error)

     {                                          // Преодолимые ошибки            

      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");

         Sleep(1000);                           // Простое решение

         return(1);                             // Выход из функции

      case 135:Alert("Цена изменилась. Пробуем ещё раз..");

         RefreshRates();                        // Обновим данные

         return(1);                             // Выход из функции

      case 136:Alert("Нет цен. Ждём новый тик..");

         while(RefreshRates()==false)           // До нового тика

            Sleep(1);                           // Задержка в цикле

         return(1);                             // Выход из функции

      case 137:Alert("Брокер занят. Пробуем ещё раз..");

         Sleep(1000);                           // Простое решение

         return(1);                             // Выход из функции

      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");

         Sleep(500);                            // Простое решение

         return(1);                             // Выход из функции

         // Критические ошибки

      case  2: Alert("Общая ошибка.");

         return(0);                             // Выход из функции

      case 133:Alert("Торговля запрещена.");

         return(0);                             // Выход из функции

      case 134:Alert("Недостаточно денег для совершения операции.");

         return(0);                             // Выход из функции

      default: Alert("Возникла ошибка ",Error); //Другие варианты   

          return(0);                            // Выход из функции

     }

  }


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