Что не так с советником ?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ilya Demidenko
50
Ilya Demidenko  
Здравствуйте !
Подскажите что не так с советником и как его исправить  .
Почему-то не тестируется ...
Писал сам .
Это мой дебют в этой области ,так что не судите строго )

extern double Lots       =0.01;     // Жестко заданное колич. лотов
extern double TakeProfit_1 =300;      // ТР для открываемого ордера
extern double TakeProfit_2 =600;      // ТР для открываемого ордера
extern int Otklonenie = 5;         // Отклонение от цены 
bool Work=true;
int start()
{
double Tip[];                         // Тип выбран. ордера (B=0,S=1) 
double MA_1;                                  //Первая скользящая средняя 
double MA_2;                                   //Вторая скользящая средняя
double MA_3;                                   //Третья скользящая средняя
double MA_4;                                   //Четвертая скользящая средняя 
double TP; 
double Ticket[];                          // Номер ордера 
double Ticket_1 ;
double Mas_Ord_Tek[5][8];               //Массив по текущего ордера
double Mas_Ord_Old[5][8];               //Массив старого ордера
double Lot[];                           //Кол-во лотов для закрытия
bool Cls_B_1=false;                     // Критерий для закрытия  Buy
bool Cls_S_1=false;                    // Критерий для закрытия  Sell
bool Opn_B_1=false;                     // Критерий для открытия  Buy
bool Opn_S_1=false;                    // Критерий для открытия  Sell
bool Ans  =false;                     // Ответ сервера после закрытия
 //---------------------------------------------------------------------------------
 // Предварит.обработка
 if(Work==false)                              // Критическая ошибка   |При нормальной работе эксперта Work всегда равно true,
     {                                                                //|в противном случае 
      Alert("Критическая ошибка. Эксперт не работает.");              //|Выдается ошибка и                                              
      return(true);                             // Выход из start()     |функция start прекращает работу  
     }
 //---------------------------------------------------------------------------------
 /*// Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер | Опрашиваются все имеющиеся рын. и отллож.  ордера 
     {                                                               //|от первого (int i=1) до последнего (i<=OrdersTotal())
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий |Выбор производится из источника открытых и отложенных ордеров (SELECT_BY_POS)
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм |Отсеиваются ордера открытые по другим парам (Если пары не совпадают, то включается оператор continue,тем самым заканчивая цикл for)
         if (OrderType()>1)                     // Попался отложенный  |Если >1-отложеный ордер, 
           {                                                         //|то         
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");//|выдается ошибка и 
            return(true);                       // Выход из start()    |закрывается функция start
           }
         Total++;                               // Счётчик рыночн. орд |Считаются ордера
         if (Total>3)                           // Не более одного орд |Если ордеров больше 3, то
           {
            Alert("Много рыночных ордеров. Эксперт не работает.");//|выдается сообщение и 
            return(true);                       // Выход из start()    |закрывается функция start
           }
*/
//============================================== Предопределения ==
   ArrayCopy(Mas_Ord_Old, Mas_Ord_Tek);                             //|Присвоение данных массива Mas_Ord_Old = Mas_Ord_Tek
                                                                                            // Сохраняем предыдущую историю    
   int Kol=0;                         // Обнуление счётчика ордеров   |Ордеров = 0
   ArrayInitialize(Mas_Ord_Tek,0);    // Обнуление массива            |массив Mas_Ord_Tek = 0
//=============================================== Анализ ордеров ==
   for (int i=0; i<OrdersTotal(); i++)// По всем ордерам терминала    |i=0;0<3;0++
     {
      if((OrderSelect(i, SELECT_BY_POS)==true) &&                   //|Ордер (1,Порядковый номер в спике)==true
          (OrderSymbol()==Symbol()))                                //Если есть следующ и наша вал.пара
      if (OrderType()>1) continue;                                  //Если отложенный ордер,то начинаем цикл заново    
       {                                                                     
        Kol++;                  // Считаем общее количество открытых ордеров   |Kol=1,,,,+1,,,+1
//-------------------------- Формирование нового массива ордеров --
        Mas_Ord_Tek[Kol][1] = NormalizeDouble(OrderOpenPrice(),     //|Массив = Округление (цены открытия до 
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс открытия ордеров
        Mas_Ord_Tek[Kol][2] = NormalizeDouble(OrderStopLoss(),      //|Массив = Округление (цены SL до
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс SL 
        Mas_Ord_Tek[Kol][3] = NormalizeDouble(OrderTakeProfit(),    //|Массив = Округление (цены TP до
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс ТР 
        Mas_Ord_Tek[Kol][4] = OrderTicket();                        // Номер ордера
        Mas_Ord_Tek[Kol][5] = OrderLots();                          // Количество лотов
        Mas_Ord_Tek[Kol][6] = OrderType();                          // Тип ордера
        Mas_Ord_Tek[Kol][7] = OrderMagicNumber();                   // Магическое число 
//------------------------------------------------------------------
                                                       //номер ордера = колво ордеров
        Tip[Kol]=Mas_Ord_Tek[Kol][6];                            //Тип ордера[под номером..]=Массиву посчитаного ордера
        Ticket[Kol]=Mas_Ord_Tek[Kol][4];                        //Номер ордера (личный)= Массиву посчитаного ордера
        Lot[Kol]=Mas_Ord_Tek[Kol][5];                            //Количество лотов = Массиву посчитаного ордера       
       }
   Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку           |Mas_Ord_Tek[0][0] = общее кол-во ордеров
//==================================================================
   }
 //--------------------------------------------------------------------------
/*Критерии*/
//---------------------------------------------------------------------------------
 MA_1=iMA(NULL,0,144,0, MODE_EMA, PRICE_CLOSE,0);
 MA_2=iMA(NULL,0,169,0, MODE_EMA, PRICE_CLOSE,0);
 MA_3=iMA(NULL,0,169,0, MODE_LWMA, PRICE_WEIGHTED,0);
 MA_4=iMA(NULL,0,144,0, MODE_LWMA, PRICE_WEIGHTED,0);
 if (Close[1]> Close[2] && Close[2]> MA_1&& Close[2]> MA_2&& Close[2]> MA_3 && Close[2]> MA_4)
 if(Low[2]<MA_1||Low[2]<MA_2||Low[2]<MA_3||Low[2]<MA_4)
 {
   Opn_B_1=true;
   Cls_S_1=true;
 }
 if(Close[1]< Close[2] && Close[2]<MA_1&& Close[2]<MA_2&& Close[2]<MA_3 && Close[2]< MA_4)
 if(Low[2]>MA_1||Low[2]>MA_2||Low[2]>MA_3||Low[2]>MA_4)
 {
  Opn_S_1=true;
  Cls_B_1=true;
 }
//--------------------------------------------------------------------
   // Закрытие ордеров
while(true)                                                           // Цикл закрытия орд.
     {
      int NomOrd=1 ;                                                       //Начинаем считать с первого ордера
       while (NomOrd<=Kol)                                            //Счиаем кол-во ордеров
       {
        if (Tip[NomOrd]==0 && Cls_B_1==true)                          //Если открыт ордер на покупку(Tip==0)
         {                                                            //И есть критерий на закрытие покупки ,то
          Alert("Попытка закрыть Buy ",Ticket[NomOrd],". Ожидание ответа.."); //|Выдается сообщение
          RefreshRates();                                             //|Обновляются данные
          Ans=OrderClose(Ticket[NomOrd],Lot[NomOrd],Bid,5);           // Закрытие Buy        
          if (Ans==true)                                              //|Если закрытие ордера успешно,
           {                                                          //|то
            NomOrd++;                                                 //плюсуем ордер   
            Alert ("Закрыт ордер Buy ",Ticket[NomOrd]) ;               //|Выдается сообщение   
            continue;                                                 //|И возвращиемся в начало второго цикла while
           }                                                          //|В противном случае вызывается функция Fun_Error (блоки 10-11)
           if (Fun_Error(GetLastError())==1)     // Обработка ошибок     |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка    |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                                  // Выход из start()   |==0-(непреодалимая ошибка)-выход из функции start
        }
       }
      NomOrd=1   ;                                                     //Начинаем считать с первого ордера 
       while (NomOrd<=Kol)                                            //Счиаем кол-во ордеров
        {
         if (Tip[NomOrd]==1 && Cls_S_1==true)                           // Открыт ордер Sell.. |Если открыт ордер на продажу (Tip==1)
          {                                                           // и есть критерий закр|И есть критерий на закрытие продажи, то
            Alert("Попытка закрыть Sell ",Ticket[NomOrd],". Ожидание ответа..");//|Выдается сообщение 
            RefreshRates();                                           // Обновление данных   |Обновляются данные
            Ans=OrderClose(Ticket[NomOrd],Lot[NomOrd],Ask,5);      // Закрытие Sell       |Закрывается продажа
            if (Ans==true)                                            //|Если закрытие ордера успешно,
             {                                                        //|то
              NomOrd++;                                               //плюсуем ордер                           
              Alert ("Закрыт ордер Sell ",Ticket[NomOrd]);             //|Выдается сообщение
              continue;                                               //|И возвращиемся в начало второго цикла while
             }                                                        //|В противном случае вызывается функция Fun_Error (блоки 10-11)
            if (Fun_Error(GetLastError())==1)      // Обработка ошибок  |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка    |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
            return(true);                          // Выход из start()        |==0-(непреодалимая ошибка)-выход из функции start
        }
      break;                                                          // Выход из while
     }
    }
//------------------------------------------------------------------------------------------------------------------
// Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      while(Kol<3)                              //Пока открытых ордеров меньше 3 
      {                                         //Выполнять следуущее
       if (Kol==0 && Opn_B_1==true)               //Если открытых ордеров нет и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,0);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                         // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start
        } 
        if (Kol==1 && Opn_B_1==true)               //Если есть один открытый ордер и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         TP=Bid + TakeProfit_2*Point;            //TP
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,TP);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                          // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start  
         }
        if (Kol==2 && Opn_B_1==true)               //Если есть один открытый ордер и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         TP=Bid + TakeProfit_1*Point;            //TP
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,TP);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                          // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start  
         }
        }
       }
       return(true);
      }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки  |Если функция GetLastError()      
      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");    //|передала (4),то
         Sleep(3000);                           // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 135:Alert("Цена изменилась. Пробуем ещё раз..");          //|передала (135),то
         RefreshRates();                        // Обновим данные      |Данные обновляются и
         return(1);                             // Выход из функции    |возвращается (1)
      case 136:Alert("Нет цен. Ждём новый тик..");                   //|передала (136),то
         while(RefreshRates()==false)           // До нового тика      |?Ждем нового тика?
            Sleep(1);                           // Задержка в цикле    |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 137:Alert("Брокер занят. Пробуем ещё раз..");             //|передала (137),то
         Sleep(3000);                           // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");   //|передала (146),то
         Sleep(500);                            // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
         // Критические ошибки
      case  2: Alert("Общая ошибка.");                               //|передала (2),то
         return(0);                             // Выход из функции    |возвращается (0)
      case  5: Alert("Старая версия терминала.");                    //|передала (5),то
         Work=false;                            // Больше не работать  |Прекращает работу функции start и
         return(0);                             // Выход из функции    |возвращается (0)
      case 64: Alert("Счет заблокирован.");                          //|передала (64),то
         Work=false;                            // Больше не работать  |Прекращает работу функции start и
         return(0);                             // Выход из функции    |возвращается (0)
      case 133:Alert("Торговля запрещена.");                         //|передала (133),то
         return(0);                             // Выход из функции    |возвращается (0)
      case 134:Alert("Недостаточно денег для совершения операции."); //|передала (134)то
         return(0);                             // Выход из функции    |возвращается (0)
      default: Alert("Возникла ошибка ",Error); // Другие варианты     |При других ошибках
         return(0);                             // Выход из функции    |возвращается (0)
     }
    }
   
Konstantin Erin
2162
Konstantin Erin  
IlyaDemidenko:
Здравствуйте !
Подскажите что не так с советником и как его исправить  .
Почему-то не тестируется ...
Писал сам .
Это мой дебют в этой области ,так что не судите строго )

extern double Lots       =0.01;     // Жестко заданное колич. лотов
extern double TakeProfit_1 =300;      // ТР для открываемого ордера
extern double TakeProfit_2 =600;      // ТР для открываемого ордера
extern int Otklonenie = 5;         // Отклонение от цены 
bool Work=true;
int start()
{
double Tip[];                         // Тип выбран. ордера (B=0,S=1) 
double MA_1;                                  //Первая скользящая средняя 
double MA_2;                                   //Вторая скользящая средняя
double MA_3;                                   //Третья скользящая средняя
double MA_4;                                   //Четвертая скользящая средняя 
double TP; 
double Ticket[];                          // Номер ордера 
double Ticket_1 ;
double Mas_Ord_Tek[5][8];               //Массив по текущего ордера
double Mas_Ord_Old[5][8];               //Массив старого ордера
double Lot[];                           //Кол-во лотов для закрытия
bool Cls_B_1=false;                     // Критерий для закрытия  Buy
bool Cls_S_1=false;                    // Критерий для закрытия  Sell
bool Opn_B_1=false;                     // Критерий для открытия  Buy
bool Opn_S_1=false;                    // Критерий для открытия  Sell
bool Ans  =false;                     // Ответ сервера после закрытия
 //---------------------------------------------------------------------------------
 // Предварит.обработка
 if(Work==false)                              // Критическая ошибка   |При нормальной работе эксперта Work всегда равно true,
     {                                                                //|в противном случае 
      Alert("Критическая ошибка. Эксперт не работает.");              //|Выдается ошибка и                                              
      return(true);                             // Выход из start()     |функция start прекращает работу  
     }
 //---------------------------------------------------------------------------------
 /*// Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер | Опрашиваются все имеющиеся рын. и отллож.  ордера 
     {                                                               //|от первого (int i=1) до последнего (i<=OrdersTotal())
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий |Выбор производится из источника открытых и отложенных ордеров (SELECT_BY_POS)
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм |Отсеиваются ордера открытые по другим парам (Если пары не совпадают, то включается оператор continue,тем самым заканчивая цикл for)
         if (OrderType()>1)                     // Попался отложенный  |Если >1-отложеный ордер, 
           {                                                         //|то         
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");//|выдается ошибка и 
            return(true);                       // Выход из start()    |закрывается функция start
           }
         Total++;                               // Счётчик рыночн. орд |Считаются ордера
         if (Total>3)                           // Не более одного орд |Если ордеров больше 3, то
           {
            Alert("Много рыночных ордеров. Эксперт не работает.");//|выдается сообщение и 
            return(true);                       // Выход из start()    |закрывается функция start
           }
*/
//============================================== Предопределения ==
   ArrayCopy(Mas_Ord_Old, Mas_Ord_Tek);                             //|Присвоение данных массива Mas_Ord_Old = Mas_Ord_Tek
                                                                                            // Сохраняем предыдущую историю    
   int Kol=0;                         // Обнуление счётчика ордеров   |Ордеров = 0
   ArrayInitialize(Mas_Ord_Tek,0);    // Обнуление массива            |массив Mas_Ord_Tek = 0
//=============================================== Анализ ордеров ==
   for (int i=0; i<OrdersTotal(); i++)// По всем ордерам терминала    |i=0;0<3;0++
     {
      if((OrderSelect(i, SELECT_BY_POS)==true) &&                   //|Ордер (1,Порядковый номер в спике)==true
          (OrderSymbol()==Symbol()))                                //Если есть следующ и наша вал.пара
      if (OrderType()>1) continue;                                  //Если отложенный ордер,то начинаем цикл заново    
       {                                                                     
        Kol++;                  // Считаем общее количество открытых ордеров   |Kol=1,,,,+1,,,+1
//-------------------------- Формирование нового массива ордеров --
        Mas_Ord_Tek[Kol][1] = NormalizeDouble(OrderOpenPrice(),     //|Массив = Округление (цены открытия до 
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс открытия ордеров
        Mas_Ord_Tek[Kol][2] = NormalizeDouble(OrderStopLoss(),      //|Массив = Округление (цены SL до
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс SL 
        Mas_Ord_Tek[Kol][3] = NormalizeDouble(OrderTakeProfit(),    //|Массив = Округление (цены TP до
                                              Digits);              //|кол-ва цыфр после запятой)
// Курс ТР 
        Mas_Ord_Tek[Kol][4] = OrderTicket();                        // Номер ордера
        Mas_Ord_Tek[Kol][5] = OrderLots();                          // Количество лотов
        Mas_Ord_Tek[Kol][6] = OrderType();                          // Тип ордера
        Mas_Ord_Tek[Kol][7] = OrderMagicNumber();                   // Магическое число 
//------------------------------------------------------------------
                                                       //номер ордера = колво ордеров
        Tip[Kol]=Mas_Ord_Tek[Kol][6];                            //Тип ордера[под номером..]=Массиву посчитаного ордера
        Ticket[Kol]=Mas_Ord_Tek[Kol][4];                        //Номер ордера (личный)= Массиву посчитаного ордера
        Lot[Kol]=Mas_Ord_Tek[Kol][5];                            //Количество лотов = Массиву посчитаного ордера       
       }
   Mas_Ord_Tek[0][0] = Kol; // Сохраняем в нулевую ячеечку           |Mas_Ord_Tek[0][0] = общее кол-во ордеров
//==================================================================
   }
 //--------------------------------------------------------------------------
/*Критерии*/
//---------------------------------------------------------------------------------
 MA_1=iMA(NULL,0,144,0, MODE_EMA, PRICE_CLOSE,0);
 MA_2=iMA(NULL,0,169,0, MODE_EMA, PRICE_CLOSE,0);
 MA_3=iMA(NULL,0,169,0, MODE_LWMA, PRICE_WEIGHTED,0);
 MA_4=iMA(NULL,0,144,0, MODE_LWMA, PRICE_WEIGHTED,0);
 if (Close[1]> Close[2] && Close[2]> MA_1&& Close[2]> MA_2&& Close[2]> MA_3 && Close[2]> MA_4)
 if(Low[2]<MA_1||Low[2]<MA_2||Low[2]<MA_3||Low[2]<MA_4)
 {
   Opn_B_1=true;
   Cls_S_1=true;
 }
 if(Close[1]< Close[2] && Close[2]<MA_1&& Close[2]<MA_2&& Close[2]<MA_3 && Close[2]< MA_4)
 if(Low[2]>MA_1||Low[2]>MA_2||Low[2]>MA_3||Low[2]>MA_4)
 {
  Opn_S_1=true;
  Cls_B_1=true;
 }
//--------------------------------------------------------------------
   // Закрытие ордеров
while(true)                                                           // Цикл закрытия орд.
     {
      int NomOrd=1 ;                                                       //Начинаем считать с первого ордера
       while (NomOrd<=Kol)                                            //Счиаем кол-во ордеров
       {
        if (Tip[NomOrd]==0 && Cls_B_1==true)                          //Если открыт ордер на покупку(Tip==0)
         {                                                            //И есть критерий на закрытие покупки ,то
          Alert("Попытка закрыть Buy ",Ticket[NomOrd],". Ожидание ответа.."); //|Выдается сообщение
          RefreshRates();                                             //|Обновляются данные
          Ans=OrderClose(Ticket[NomOrd],Lot[NomOrd],Bid,5);           // Закрытие Buy        
          if (Ans==true)                                              //|Если закрытие ордера успешно,
           {                                                          //|то
            NomOrd++;                                                 //плюсуем ордер   
            Alert ("Закрыт ордер Buy ",Ticket[NomOrd]) ;               //|Выдается сообщение   
            continue;                                                 //|И возвращиемся в начало второго цикла while
           }                                                          //|В противном случае вызывается функция Fun_Error (блоки 10-11)
           if (Fun_Error(GetLastError())==1)     // Обработка ошибок     |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка    |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                                  // Выход из start()   |==0-(непреодалимая ошибка)-выход из функции start
        }
       }
      NomOrd=1   ;                                                     //Начинаем считать с первого ордера 
       while (NomOrd<=Kol)                                            //Счиаем кол-во ордеров
        {
         if (Tip[NomOrd]==1 && Cls_S_1==true)                           // Открыт ордер Sell.. |Если открыт ордер на продажу (Tip==1)
          {                                                           // и есть критерий закр|И есть критерий на закрытие продажи, то
            Alert("Попытка закрыть Sell ",Ticket[NomOrd],". Ожидание ответа..");//|Выдается сообщение 
            RefreshRates();                                           // Обновление данных   |Обновляются данные
            Ans=OrderClose(Ticket[NomOrd],Lot[NomOrd],Ask,5);      // Закрытие Sell       |Закрывается продажа
            if (Ans==true)                                            //|Если закрытие ордера успешно,
             {                                                        //|то
              NomOrd++;                                               //плюсуем ордер                           
              Alert ("Закрыт ордер Sell ",Ticket[NomOrd]);             //|Выдается сообщение
              continue;                                               //|И возвращиемся в начало второго цикла while
             }                                                        //|В противном случае вызывается функция Fun_Error (блоки 10-11)
            if (Fun_Error(GetLastError())==1)      // Обработка ошибок  |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка    |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
            return(true);                          // Выход из start()        |==0-(непреодалимая ошибка)-выход из функции start
        }
      break;                                                          // Выход из while
     }
    }
//------------------------------------------------------------------------------------------------------------------
// Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      while(Kol<3)                              //Пока открытых ордеров меньше 3 
      {                                         //Выполнять следуущее
       if (Kol==0 && Opn_B_1==true)               //Если открытых ордеров нет и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,0);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                         // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start
        } 
        if (Kol==1 && Opn_B_1==true)               //Если есть один открытый ордер и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         TP=Bid + TakeProfit_2*Point;            //TP
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,TP);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                          // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start  
         }
        if (Kol==2 && Opn_B_1==true)               //Если есть один открытый ордер и есть критерий на покупку,
        {                                       //то
         RefreshRates();                        //Обновляются данные
         TP=Bid + TakeProfit_1*Point;            //TP
         Alert("Попытка открыть Buy. Ожидание ответа..");            //|Выдается сообщение 
         Ticket_1=OrderSend(Symbol(),OP_BUY,Lots,Ask,Otklonenie,0,TP);  //Открытие покупки
         if (Ticket_1 > 0)                        // Получилось :)       |Если сервер вернул номер открытого ордера (>0)
           {                                                         //|то
            Alert ("Открыт ордер Buy ",Ticket_1);                      //|Выдается сообщение
            Kol++;                                                   //Прибавляется открытый ордер
            continue;                                                //Управление передается циклу while
           }                                                       //|В противном случае вызывается функция Fun_Error (блоки 10-11)
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок    |функция Fun_Error() передает код последней ошибки, вычисленный с помощью GetLastError()
            continue;                           // Повторная попытка   |==1-(преодолимая ошибка),предпримится еще одна попытка звкрыть ордер
         return(true);                          // Выход из start()    |==0-(непреодалимая ошибка)-выход из функции start  
         }
        }
       }
       return(true);
      }
//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки  |Если функция GetLastError()      
      case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");    //|передала (4),то
         Sleep(3000);                           // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 135:Alert("Цена изменилась. Пробуем ещё раз..");          //|передала (135),то
         RefreshRates();                        // Обновим данные      |Данные обновляются и
         return(1);                             // Выход из функции    |возвращается (1)
      case 136:Alert("Нет цен. Ждём новый тик..");                   //|передала (136),то
         while(RefreshRates()==false)           // До нового тика      |?Ждем нового тика?
            Sleep(1);                           // Задержка в цикле    |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 137:Alert("Брокер занят. Пробуем ещё раз..");             //|передала (137),то
         Sleep(3000);                           // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
      case 146:Alert("Подсистема торговли занята. Пробуем ещё..");   //|передала (146),то
         Sleep(500);                            // Простое решение     |Задержка и
         return(1);                             // Выход из функции    |возвращается (1)
         // Критические ошибки
      case  2: Alert("Общая ошибка.");                               //|передала (2),то
         return(0);                             // Выход из функции    |возвращается (0)
      case  5: Alert("Старая версия терминала.");                    //|передала (5),то
         Work=false;                            // Больше не работать  |Прекращает работу функции start и
         return(0);                             // Выход из функции    |возвращается (0)
      case 64: Alert("Счет заблокирован.");                          //|передала (64),то
         Work=false;                            // Больше не работать  |Прекращает работу функции start и
         return(0);                             // Выход из функции    |возвращается (0)
      case 133:Alert("Торговля запрещена.");                         //|передала (133),то
         return(0);                             // Выход из функции    |возвращается (0)
      case 134:Alert("Недостаточно денег для совершения операции."); //|передала (134)то
         return(0);                             // Выход из функции    |возвращается (0)
      default: Alert("Возникла ошибка ",Error); // Другие варианты     |При других ошибках
         return(0);                             // Выход из функции    |возвращается (0)
     }
    }  

Функция int start() целая а возврат из нее return(true) булевый. Страшного мало, но все же ...
Кстати, return - это оператор, можно без скобок. Это в вызове функции скобки нужны.
Вместо  if(Work==false)  можно писать  if(!Work)
Вместо if (Kol==1 && Opn_B_1==true)  можно if (Kol==1 && Opn_B_1)   -   но это все мелочи
А вот серьезнее: В одном цикле  for (int i=0; i<OrdersTotal(); i++)
просматриваете все ордера и заполняете массивы.
Потом в другом цикле по количеству элементов массива....
Кажется, можно это в одном цикле и без массивов все сделать
Теперь конкретно по Вашему вопросу:
Надо проверить условия входа. Вот сюда надо вставить Alert
 if(Low[2]<MA_1||Low[2]<MA_2||Low[2]<MA_3||Low[2]<MA_4)
 {
   Alert("Покупать");
   Opn_B_1=true;
   Cls_S_1=true;
 }
 if(Close[1]< Close[2] && Close[2]<MA_1&& Close[2]<MA_2&& Close[2]<MA_3 && Close[2]< MA_4)
 if(Low[2]>MA_1||Low[2]>MA_2||Low[2]>MA_3||Low[2]>MA_4)
 {
   Alert("Продавать");
  Opn_S_1=true;
  Cls_B_1=true;
 }

И лучше на демо, почти реально... Вывел бы значения MA_1, MA_2 ... и прочее на график  в метки и наблюдал бы

Ilya Demidenko
50
Ilya Demidenko  
Добавление Алертов в код ничего не меняет же .
Советник как не тестировался ,так и не тестируется ...
Vitalii Ananev
11024
Vitalii Ananev  
Впечатления такие как будто от куда то очень древний код тупо скопировали даже не думаю что к чему. И зачем ордера в массивах хранить? 
Ilya Demidenko
50
Ilya Demidenko  
Vitalii Ananev:
Впечатления такие как будто от куда то очень древний код тупо скопировали даже не думаю что к чему. И зачем ордера в массивах хранить? 

Есть такое - код действительно ,наверное, древний ,
но копировал я его не тупо ,а разбираясь по ходу )
Я же учусь только .
Отладка показала ,что я с массивами накосячил ,при том по ходу со всеми ))

Хотел сохранить информацию о всех открытых ордерах по отдельности ,вот и подумал ,что нужно их в массивы запихнуть ))

Vitalii Ananev
11024
Vitalii Ananev  
IlyaDemidenko:

Есть такое - код действительно ,наверное, древний ,
но копировал я его не тупо ,а разбираясь по ходу )
Я же учусь только .
Отладка показала ,что я с массивами накосячил ,при том по ходу со всеми ))

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

Ilya Demidenko
50
Ilya Demidenko  
Vitalii Ananev:

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

Я хотел в массивы сохранить информацию о всех открытых ордерах по отдельности )
Vitalii Ananev
11024
Vitalii Ananev  
IlyaDemidenko:
Я хотел в массивы сохранить информацию о всех открытых ордерах по отдельности )

Зачем? Информацию о всех открытых ордерах всегда можно получить из терминала не используя промежуточное звено с помощью цикла и функции OrderSelect().

   for(int i=OrdersTotal()-1; i>=0; i--)         
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) 
      {    
        ....
      }
   }
Ilya Demidenko
50
Ilya Demidenko  
Vitalii Ananev:

Зачем? Информацию о всех открытых ордерах всегда можно получить из терминала не используя промежуточное звено с помощью цикла и функции OrderSelect().

Мне нужны были типы всех ордеров просто 
Vitalii Ananev
11024
Vitalii Ananev  
IlyaDemidenko:
Мне нужны были типы всех ордеров просто 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   for(int i=OrdersTotal()-1; i>=0; i--)         
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) 
      {    
         Print(OrderType());
      }
   }
}

На каждом тике будет выводить в журнал код типа открытых позиций и отложенных ордеров если они есть. 

...

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

Vitalii Ananev
11024
Vitalii Ananev  

Вот пример, если поступил сигнал на продажу закрыть все ордера на покупку: 

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   
   if (сигнал на продажу)
   {//закрыть все ордера на покупку
        for(int i=OrdersTotal()-1; i>=0; i--)         
        {
                if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) 
                {    
                        if (OrderType()==OP_BUY) OrderClose(....);
                }
        }
    }
}
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий