Помогите найти ошибку - страница 2

 
khodakvv:

Владислав, Вы можете конкретно назвать места ошибок и как их исправлять. Почему появляется ошибка 4051 ?
Это ошибка исполнения: приведите лог - у меня Ваш советник просто вешает терминал. И все-таки посмотрите как правильно работать с ордерами.
 
VladislavVG:
Это ошибка исполнения: приведите лог - у меня Ваш советник просто вешает терминал. И все-таки посмотрите как правильно работать с ордерами.

У меня та же картина, хотя я поменял условия на тикет из булевых на целочисельные. Почему виснет ?
 
khodakvv:

У меня та же картина, хотя я поменял условия на тикет из булевых на целочисельные. Почему виснет ?

Поскольку нет отладчика - поставьте принты перед и после каждого логического блока или действия. Потом смотрим лог - место, где остановится будет видно.

ЗЫ Еще одно соображение while(true) - в данном случае не очень рациональная реализация. Возможно возникновение ситуаций, когда советник входит в бесконечный цикл, что похоже и происходит в Вашем случае.

 
VladislavVG:

Поскольку нет отладчика - поставьте принты перед и после каждого логического блока или действия. Потом смотрим лог - место, где остановится будет видно.

ЗЫ Еще одно соображение while(true) - в данном случае не очень рациональная реализация. Возможно возникновение ситуаций, когда советник входит в бесконечный цикл, что похоже и происходит в Вашем случае.


Владислав, помогите, пожалуйста, доработать советник, а то я в силу своей неопытности не понимаю, что нужно сделать
 
khodakvv:

Владислав, помогите, пожалуйста, доработать советник, а то я в силу своей неопытности не понимаю, что нужно сделать
Советник работает по следующему. 
1. В 15.00 по Киеву открывается сделка. 
 1.1 Если Close[0]>Close[1] на покупку 
 1.2 Если Close[0]<Close[1] наоборот. 
Закрытие в 00.00. 
Советник можно запускать каждый раз при формировании нового часового бара. Если сформировался новый часовой бар, то :

1. проверяем наличие ордеров открытых этим советником. *Для идентификации своих ордеров советники используют магикномер.

2. Проверяем текущее время

3. При наличии открытых ордеров проверяем время

3.1 День и время открытия ордера

3.2 Текущее время менее 00.00 дня, следующего за днем открытия ордера - выходим

3.3 Время равно или более 00.00 дня, следующего за днем открытия ордера - закрываем с текущей прибылью/убытком и переходим к п.4

4. Если нет открытых, проверяем время

4.1 Текущее время менее 15 часов дня - выходим

4.2 Текущее время более или равно 15 часов, но менее того периода, который Вы зададите как период для открытия ордеров - выставляем ордера, выходим.

 
VladislavVG:
Советник можно запускать каждый раз при формировании нового часового бара. Если сформировался новый часовой бар, то :

1. проверяем наличие ордеров открытых этим советником. *Для идентификации своих ордеров советники используют магикномер.

2. Проверяем текущее время

3. При наличии открытых ордеров проверяем время

3.1 День и время открытия ордера

3.2 Текущее время менее 00.00 дня, следующего за днем открытия ордера - выходим

3.3 Время равно или более 00.00 дня, следующего за днем открытия ордера - закрываем с текущей прибылью/убытком и переходим к п.4

4. Если нет открытых, проверяем время

4.1 Текущее время менее 15 часов дня - выходим

4.2 Текущее время более или равно 15 часов, но менее того периода, который Вы зададите как период для открытия ордеров - выставляем ордера, выходим.




я ведь по похожему алгоритму и делал но почему он тогда виснет ? Вы можете написать свой вариант кода ? Благодарю
 
khodakvv:

я ведь по похожему алгоритму и делал но почему он тогда виснет ? Вы можете написать свой вариант кода ? Благодарю

Я то могу. Только думаю, лучше Вам самостоятельно справиться. По пунктам алгоритма:

1. Где у Вас проверка наличия ордеров, выставленных советником ?

//+------------------------------------------------------------------+
//|                                                    2candles3.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
extern double lot = 1;
extern int slippage = 3, time = 3;
extern int take;
bool cantrade = true, isclosed = true;
int tiket, prof;                                           
//+------------------------------------------------------------------+
int start()
  {
//----
  if (OrdersTotal()==1)cantrade=false;
  
  
   if (TimeHour(TimeCurrent())==(15-time) && TimeMinute(TimeCurrent())== 32 && cantrade == true){
   
         if(TimeSeconds(TimeCurrent())==0 || TimeSeconds(TimeCurrent())==1 || TimeSeconds(TimeCurrent())==2){
            if(Close[1]>Close[2]){
               while(true){
                  tiket = OrderSend(Symbol(),OP_BUY,lot,Ask,slippage,0,0,NULL,0,0,Green);
                  prof=Ask+take*Point;
                  if (tiket == true){
                     isclosed = false;
                     break;}
                  if (tiket == false) { if (Fun_Error(GetLastError())==1)
                         {
                         continue;
                         }
                                       }
                  else {
                       return;
                       }
                }  
             } 
 //+------------------------------------------------------------------+           
   
            if(Close[1]<Close[2]){
               while(true){
               tiket = OrderSend(Symbol(),OP_SELL,lot,Bid,slippage,0,0,NULL,0,0,Red);
               prof=Bid-take*Point;
                  if (tiket == true){
                     isclosed = false;
                     break;}
                  if (tiket == false){ if (Fun_Error(GetLastError())==1)
                         {
                         continue;
                         }
                                     }     
                  else {
                      return;
                       }  
              }
           }
   
      }
  }    
      
    if (TimeHour(TimeCurrent())==(24-time) && TimeMinute(TimeCurrent())== 0 && isclosed == false){  
        if (TimeSeconds(TimeCurrent())==0 || TimeSeconds(TimeCurrent())==1 || TimeSeconds(TimeCurrent())==2){
             while(true){
               
                  if (OrderClose(tiket,lot,Ask,slippage,Red)){
 // Какой ордер закрываете ??????А если ордеров несколько ??????????
                     isclosed = true;cantrade=true;
                     break;}
                  if (OrderClose(tiket,lot,Ask,slippage,Red)==false){ if (Fun_Error(GetLastError())==1)
                        {
                        continue;
                        }
                                                                    }    
                  else {
                       return;
                       }
            }
        }
    }
    if(Ask>=prof || Bid<=prof){
    while(true){
               
                  if (OrderClose(tiket,lot,Ask,slippage,Red)){
                     isclosed = true;cantrade=true;
                     break;}
                  if (OrderClose(tiket,lot,Ask,slippage,Red)==false){ if (Fun_Error(GetLastError())==1)
                        {
                        continue;
                        }
                                                                    }    
                  else {
                       return;
                       }
            }
    }
//----
   return(0);
  }
//+------------------------------------------------------------------+
int Fun_Error(int Error)                        // Ф-ия обработ ошибок 
 {   switch(Error) 
     {                                          // Преодолимые ошибки 
       case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
                Sleep(3000);                    // Простое решение
                return(1);
       case 136:Alert("Нет цен. Ждём новый тик..");
                while(RefreshRates()==false)           // До нового тика
                            Sleep(1);                  // Задержка в цикле
                            return(1);                // Выход из функции 
       case 137:Alert("Брокер занят. Пробуем ещё раз..");
                Sleep(3000);                           // Простое решение
                return(1);                             // Выход из функции 
       case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
                Sleep(500);                            // Простое решение
                return(1);                             // Выход из функции
                // Критические ошибки
       case  2: Alert("Общая ошибка.");
                return(0);                             // Выход из функции
       case 64: Alert("Счет заблокирован.");
               return(0);                             // Выход из функции
       case 133:Alert("Торговля запрещена.");
                return(0);                             // Выход из функции
       case 134:Alert("Недостаточно денег для совершения операции.");
               return(0);
       default: Alert("Возникла ошибка ",Error);       // Другие варианты
                   return(0);                             // Выход из функции
     }  
     
  }
//+------------------------------------------------------------------+
 
VladislavVG:

Я то могу. Только думаю, лучше Вам самостоятельно справиться. По пунктам алгоритма:

1. Где у Вас проверка наличия ордеров, выставленных советником ?


А разве не OrdersTotal проверяет наличие ордера ? Ордер может быть только один
 
khodakvv:

А разве не OrdersTotal проверяет наличие ордера ? Ордер может быть только один

Проверяет, но чуть-чуть...
 
khodakvv:

Владислав, помогите, пожалуйста, доработать советник, а то я в силу своей неопытности не понимаю, что нужно сделать

ЗЫ Еще одно соображение while(true) - в данном случае не очень рациональная реализация. Возможно возникновение ситуаций, когда советник входит в бесконечный цикл, что похоже и происходит в Вашем случае.

...............................

1) Конечно - это же бесконечный цикл, так как из него нет выхода по break; поэтому и виснет.

while(выражение) . Если выражение истинно, то оператор выполняется до тех пор, пока выражение не станет ложным. Если выражение ложно, то управление передается следующему оператору.

2) if(ticket==false) это что такое при int tiket? Возможно это будет работать так- если тикет нечётный - if сработает, если чётный то нет.

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

3) Перед тем как закрывать ордера их нужно выбрать с помощью OrderSelect(tiket,SELECT_BY_TICKET),

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