Вопрос по функциям IsConnected() и IsTradeAllowed()

 

Здравствуйте! Такая ситуация:

Советник должен открывать позицию только по началу нового бара, (в моем случае в начале часа). А если была потеря 
связи и появление связи уже когда появился новый бар, т.е. в середине нового бара, то советник открывать позицию не 
должен.

Решил проверить функцию IsTradeAllowed(). При работающем советнике, за 5 минут до начала часа отключил интернет, а в 
5 минут нового часа включил. Советник благополучно открыл позицию в середине бара. Попробовал добавить функцию 
IsConnected() - та же ситуация.

В чем может быть причина?

Специально добавил вывод комментариев, чтобы проверить. Когда связь прервана, на экране должно появиться сообщение 
об этом. Но при разрыве связи, никаких комментариев на экране не появилось...
А после появления связи, советник должен записать время открытия последнего бара в переменную (static int prevtime) 
и на этом баре не открываться, а по переменной ориентироваться, чтобы открываться только в начале нового бара. 
Однако, как я понял, эти две функции были проигнорированы, потому как когда я подключил интернет уже в середине 
нового бара - сразу появилась надпись "Думаю!", т.е. советник начал анализ индикаторов, а дальше либо открытие...

Почему функции IsConnected() и IsTradeAllowed() были проигнорированы?

Вот участок кода:




int start()
 {

//---соединение клиентского терминала с сервером, по которому производится подкачка данных---

  if(!IsConnected())
    {
     Comment("Связь отсутствует!");
     while(!IsConnected())
       {
        Sleep(5000);
       }
     Sleep(5000);
     prevtime = iTime("EURUSD",PERIOD_H1,0);
     Comment("Связь возобновлена");
     return(0);
    }

//---эксперту разрешено торговать и поток для выполнения торговых операций свободен---

  if(!IsTradeAllowed())
    {
     Comment("Торговый поток занят!");
     while(!IsTradeAllowed())
       {
        Sleep(5000);
       }
     Sleep(5000);
     prevtime = iTime("EURUSD",PERIOD_H1,0);
     Comment("Торговый поток свободен");
     return(0);
    }

//------проверяем открытие нового бара------

  if(iTime("EURUSD",PERIOD_H1,0) == prevtime) return(0);
  prevtime = iTime("EURUSD",PERIOD_H1,0);
  Comment("Думаю!");

//------проверяем количество открытых ордеров, если открыто mkoo тогда выходим------

  if(OrdersTotal() > 0)
    {
     kvootkr = 0;
     total = OrdersTotal();
     for(i = 0; i < total; i++)
       {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == mn)
          {
           kvootkr++;
           if(kvootkr >= mkoo)
             {
              Comment("Открытых позиций достаточно. Отдыхаю");
              return(0);
             }
          } 
       }
     }


Что не так? Подскажите, плиз!



 
Virtuoso писал(а) >>

Что не так? Подскажите, плиз!

Функция start() срабатывает по приходу тика, а нет тика код не выполняется.

З.ы. А проверить работу функции можно зацикленным скриптом:

int start()
  {
//----
   while(true) {
      if(!IsConnected()) {
         Alert("No connected!");
         break;
      }
      Sleep(10000);
   }
//----
   return(0);
  }
 
Talex >>:

Функция start() срабатывает по приходу тика, а нет тика код не выполняется.

З.ы. А проверить работу функции можно зацикленным скриптом:

Спасибо! Это я как раз и не учел...

Не знаю, получится ли, но попробую тогда выкрутиться с помощью функции IsStopped().

int start()

 {


  while(!IsStopped())

   {
    while(!IsConnected())
     {

      .....

     }

    .....

    .....
   }
 

 

Может эти функции вообще не использовать, а сделать по другому:

prevtime = iTime("EURUSD",PERIOD_H1,0);
if Minute()>5 return(0);

После наступления новго часа проверять сколько минут этого часа уже прошло.

Всего то одна строчка)))

 

Вау! Вот уж действительно, все гениальное просто!

Класс, теперь все пойдет как надо :)

Спасибо, Xupypr!

 
Talex >>:

Функция start() срабатывает по приходу тика, а нет тика код не выполняется.

З.ы. А проверить работу функции можно зацикленным скриптом:

А что будет, если придет новый тик? Эксперт то его обрабатывать не будет, он же зациклен. Или я не правильно понимаю работу MT4 ?

 
KING >>:

А что будет, если придет новый тик? Эксперт то его обрабатывать не будет, он же зациклен. Или я не правильно понимаю работу MT4 ?

Как это не будет? ЗАЦИКЛЕН эксперт, значит все время будет что-то обрабатывать. Здесь только вопрос в правильном распределении вычислений в коде, чтобы эксперт не сильно грузил терминал и, в свою очередь, систему.

 
Scriptong >>:

Как это не будет? ЗАЦИКЛЕН эксперт, значит все время будет что-то обрабатывать. Здесь только вопрос в правильном распределении вычислений в коде, чтобы эксперт не сильно грузил терминал и, в свою очередь, систему.

То есть котировки, если будут новые, то будут доходить то эксперта? Я собственно чего спрашиваю, ведь пришел тик, началась работа start-а, пришел новый тик, опять. А тут получиться пришел тик, и старт работает пока свет не выключат. Наверно я правильно понял, что в случае такого бесконечного цикла, он не повлияет на работу эксперта. да?

 

Люди добрые подскажите пожалуйста как запустить прогу fubo ???? Вернее как открыть реальный счет ?? Если можно то подскажите как это сделать пошагово!! Заранее благодарен!!!!!!!!

 
KING писал(а) >>

То есть котировки, если будут новые, то будут доходить то эксперта? Я собственно чего спрашиваю, ведь пришел тик, началась работа start-а, пришел новый тик, опять. А тут получиться пришел тик, и старт работает пока свет не выключат. Наверно я правильно понял, что в случае такого бесконечного цикла, он не повлияет на работу эксперта. да?

Почитайте про

RefreshRates( )

Или используйте MarketInfo
 
Talex >>:

Почитайте про

RefreshRates()

Или используйте MarketInfo

Спасибо. Значит сразу после while, refreshrates(). Теперь понятно, хотя вызывает подозрения такая конструкция. Лучше бы сделали как-нибудь по-другому, чтобы это было известно эксперту, например связь разорвалась, и вместо тика эксперту передано такое-то значение, восстановлена передано другое.

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