Помогите найти ошибку

 
Советник работает по следующему. В 15.00 по Киеву открывается сделка. Если Close[0]>Close[1] на покупку и наоборот. Закрытие в 00.00. Компилятор не дает ошибок, но в одно время тестер показывает открытие нескольких ордеров, хотя должен открыться один. Помогите разобраться
Файлы:
2candles.mq4  5 kb
 
Обычно перед открытием позиции стоит проверить есть или нет открытые позиции
 
Vinin:
Обычно перед открытием позиции стоит проверить есть или нет открытые позиции


а какая ошибка в моем коде ?
 
khodakvv:


а какая ошибка в моем коде ?
в том и ошибка - нет проверки на наличие открытых позиций
 
abolk:
в том и ошибка - нет проверки на наличие открытых позиций

добавил функцию OrdersTotal для проверки наличия ордеров, выдает ошибку 4051недопустимое значение параметров функции. В чем проблема ?
Файлы:
2candles3.mq4  6 kb
 
khodakvv:

добавил функцию OrdersTotal для проверки наличия ордеров, выдает ошибку 4051недопустимое значение параметров функции. В чем проблема ?
//+------------------------------------------------------------------+
//|                                                    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);                             // Выход из функции      }          } //+------------------------------------------------------------------+

Компилируется без ошибок.

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().
Замечания.
При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены 
Bid (для продажи) или Ask (для покупки). Если операция проводится по финансовому инструменту, отличному от текущего, то для получения 
последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK. 
Нельзя использовать расчетную либо ненормализованную цену. Если запрашиваемой цены открытия не было в ценовом потоке либо запрашиваемая 
цена не нормализована в соответствии с количеством знаков после десятичной точки, то будет сгенерирована ошибка 129 (ERR_INVALID_PRICE). 
Если запрашиваемая цена открытия сильно устарела, то независимо от значения параметра slippage будет сгенерирована ошибка 138 (ERR_REQUOTE). 
Если же запрашиваемая цена устарела, но ещё присутствует в ценовом потоке, то позиция открывается по текущей цене и только в том случае, 
если текущая цена попадает в диапазон price+-slippage.

Цены StopLoss и TakeProfit не могут располагаться слишком близко к рынку. Минимальное расстояние стопов в пунктах можно получить, 
используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае ошибочных, а также ненормализованных стопов генерируется 
ошибка 130 (ERR_INVALID_STOPS).

При установке отложенного ордера цена открытия не может быть слишком близкой к рынку. Минимальное расстояние отложенной цены от текущей 
рыночной цены в пунктах также можно получить, используя функцию MarketInfo() с параметром MODE_STOPLEVEL. В случае неправильной цены 
открытия отложенного ордера будет сгенерирована ошибка 130 (ERR_INVALID_STOPS).

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке 
задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

На некоторых торговых серверах может быть установлен лимит на общее количество открытых и отложенных ордеров. При превышении этого лимита 
новая позиция открыта не будет (отложенный ордер не будет установлен), и торговый сервер вернет ошибку 148 (ERR_TRADE_TOO_MANY_ORDERS). 
Параметры:
symbol   -   Наименование финансового инструмента, с которым проводится торговая операция. 
cmd   -   Торговая операция. Может быть любым из значений торговых операций. 
volume   -   Количество лотов. 
price   -   Цена открытия. 
slippage   -   Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу). 
stoploss   -   Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности). 
takeprofit   -   Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности). 
comment   -   Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером. 
magic   -   Магическое число ордера. Может использоваться как определяемый пользователем идентификатор. 
expiration   -   Срок истечения отложенного ордера. 
arrow_color   -   Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике. 

Пример:
  int ticket;
  if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)
    {
     ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point,"My order #"+counter,16384,0,Green);
     if(ticket<0)
       {
        Print("OrderSend failed with error #",GetLastError());
        return(0);
       }
    }

 


Выделенные фрагменты в Вашем коде приводят к выводу о необходимости получения Вами хотя бы базовых знаний в области программирования, информатики, а так же изучения руководства или хотя бы учебника, особенно раздела работы с ордерами и кодов советников из примеров или базы кодов по МКЛ.

 
khodakvv:

добавил функцию OrdersTotal для проверки наличия ордеров, выдает ошибку 4051недопустимое значение параметров функции. В чем проблема ?

если внимательно проследить за алгоритмом то можно заматить, что открыт может быть не больше сем один ордер. Так в чем все-таки ошибки. Можете конкретно назвать ?
 
khodakvv:

если внимательно проследить за алгоритмом то можно заматить, что открыт может быть не больше сем один ордер. Так в чем все-таки ошибки. Можете конкретно назвать ?
Это то, что Вы хотели. Где ошибки в реализации - я отметил. Самая главная логическая ошибка: Вы неверно работаете с ордерами. Зачем Вам это рассказывать по сотому разу здесь, если на то есть учебник, есть руководство и куча работающих примеров. Посмотрите там как правильно работать с ордерами. К тому же, Вы неверно обрабатываете результат работы функции ОрдерСенд в результате чего возможна попытка закрытия ордера с несуществующим тикетом, поскольку -1!=0. Смотрите хелп - функция не возвращает переменную типа bool и сравнивать результат работы ОрдерСенд с truе\false неверно.
 
VladislavVG:
Это то, что Вы хотели. Где ошибки в реализации - я отметил. Самая главная логическая ошибка: Вы неверно работаете с ордерами. Зачем Вам это рассказывать по сотому разу здесь, если на то есть учебник, есть руководство и куча работающих примеров. Посмотрите там как правильно работать с ордерами. К тому же, Вы неверно обрабатываете результат работы функции ОрдерСенд в результате чего возможна попытка закрытия ордера с несуществующим тикетом, поскольку -1!=0. Смотрите хелп - функция не возвращает переменную типа bool и сравнивать результат работы ОрдерСенд с truе\false неверно.

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

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

я понял одну ошибку тикет не равно тру или фолс а сравнивать с нулем
 
Чтобы не создавать новую тему- напишу тут. Я когда-то видел срипт/советник или тп, в котором можно было задавать время, в которое можно/нельзя торговать основной МТС (закинуть его на отдельный график и он будет блокировать ордера вашей МТС в нужное время). Теперь мне он очень нужен, а найти не могу. Мож кто видел? Заранее спасибо.
Причина обращения: