ошибки в программе

 

Добрый день всем!

прошу помочь разобраться с кодом.Дает следующие ошибки и Предупреждения , надеюсь не последние....:

-possible use of uninitialized variable 'len'           176     33
-possible use of uninitialized variable 'Digits'        186     68
-2017.09.07 09:37:04.977        array out of range in   (266,37)

в этом коде:

double op_m5[];
   int len;
   ArraySetAsSeries(op_m5,true);
176   CopyOpen(_Symbol,PERIOD_M5,1,len,op_m5);        //m5
   
   double close_m5[];
   ArraySetAsSeries(close_m5,true);
   CopyOpen(_Symbol,PERIOD_M5,1,len,close_m5);        //m5
   
   double lo_m5[];
   ArraySetAsSeries(lo_m5,true);
   CopyOpen(_Symbol,PERIOD_M5,1,len,lo_m5);        //m5
   //======================================================================================== 
186 san1=NormalizeDouble((MathAbs(op_m5[1]-close_m5[1])*MathPow(10,Digits)),0);//m5
    san2=NormalizeDouble((MathAbs(op_m5[2]-close_m5[1])*MathPow(10,Digits)),0);//m5
    san3=NormalizeDouble((MathAbs(op_m5[3]-close_m5[1])*MathPow(10,Digits)),0);//m5
 //=========================================================================================
 int  vSignal=0;
 if(((san1<=100)||(san2<=100)||(san3<=100))&&((close_m5[1]<ma_sred1)&&(close_m5[1]<lo_m5[10])))  vSignal=1; //buy!!!
  //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 if(((san1<=100)||(san2<=100)||(san3<=100))&&((close_m5[1]>ma_sred1)&&(close_m5[1]>lo_m5[10])))   vSignal=-1; //sell
      return;// (vSignal);
 //=================================================================================================================
   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);            // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);            // лучшее предложение на продажу

 
flat55:

Добрый день всем!

прошу помочь разобраться с кодом.Дает следующие ошибки и Предупреждения , надеюсь не последние....:

в этом коде:


Переменную "len" нужно инициализировать - то есть присвоить её значение, например 1 или 100 или 15 .. 

"Digits" воспринимается компиляторов как неинициализированая переменная. Вместо "Digits" нужно использовать "Digits()".

 

Дополнение:

ошибка

return value of 'OrderSend' should be checked   nur.mq5 252     7

в коде:

//+------------------------------------------------------------------+
//| Открытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionOpen()
  {
   MqlTradeRequest mrequest;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                              // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);   // лучшее предложение на продажу

   if(!PositionSelect(_Symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      mrequest.sl = 0;                                  // Stop Loss
      mrequest.tp = 0;                                  // Take Profit
      mrequest.symbol = _Symbol;                        // символ
      mrequest.volume = Lot;                            // количество лотов для торговли
      mrequest.magic = 0;                               // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                   // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_FOK;        // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                             // проскальзывание от текущей цены       
  252    OrderSend(mrequest,mresult);                      // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
 
flat55:

Дополнение:

ошибка

в коде:


Нужно всегда проверять результат отсылки торгового приказа.

Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.

bool  OrderSend( 
   MqlTradeRequest&  request,      // структура запроса 
   MqlTradeResult&   result        // структура ответа 
   );


 
Спасибо, стало меньше ошибок.
 
Vladimir Karputov:

Нужно всегда проверять результат отсылки торгового приказа.

Функция OrderSend() предназначена для совершения торговых операций через отправку запросов на торговый сервер.


да, я готовый блок OrderSend() взял в свободном доступе.

Дает не ошибку, но предупреждает.

 
flat55:

да, я готовый блок OrderSend() взял в свободном доступе.

Дает не ошибку, но предупреждает.


Предупреждение - это потенциальная ошибка.

А вдруг Вы потом решите, что торговый запрос прошёл успешно и дальше начнёте "плясать" исходя из этого утверждения? А на самом деле, например из-за реквоты, торговый приказ не прошёл?
 
Vladimir Karputov:

Переменную "len" нужно инициализировать - то есть присвоить её значение, например 1 или 100 или 15 .. 

"Digits" воспринимается компиляторов как неинициализированая переменная. Вместо "Digits" нужно использовать "Digits()".


Дополню, или вместо функции Digits() переменную _Digits

 
flat55:

да, я готовый блок OrderSend() взял в свободном доступе.

Дает не ошибку, но предупреждает.


Точно, я всегда убираю все варнинги. И один раз это спасло меня от очень серьезной ошибки именно в работе робота.

А часто присылают код с 50-ю варнингами, типа, - да ерунда, компилятор сделали слишком строгим.

 
 //=================================================================================================================
   double Ask = SymbolInfoDouble(Symbol1,SYMBOL_ASK);            // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(Symbol1,SYMBOL_BID);            // лучшее предложение на продажу
//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
//  bool Buy_Condition =(rsiVal[1]<lw && mrate[1].close < BBLow[1] );            // DEMA растет
   bool Buy_Condition=(vSignal_1>0);
   bool Sell_Condition=(vSignal_2>0);
   bool Buy_Close=(vSignal_2>0);
   bool Sell_Close=(vSignal_1>0);
 // if(vSignal_1=1) Buy_Condition=true;
  // CTrade trade;
  // trade.PositionOpen("EURUSD",ORDER_TYPE_SELL,1, SymbolInfoDouble("EURUSD",ORDER_TYPE_SELL==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),0,0); 
 //  trade.PositionOpen("GBPUSD",ORDER_TYPE_SELL,1, SymbolInfoDouble("GBPUSD",ORDER_TYPE_SELL==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),0,0); 
   if(Buy_Condition && !PositionSelect(Symbol1))     // Открываем длинную позицию
     {                                               // 
      LongPositionOpen();
     }
   if(Sell_Condition && !PositionSelect(Symbol1)) // Открываем короткую позицию
     {
      ShortPositionOpen();
     }
   if(Buy_Close && PositionSelect(Symbol1)) // Закрываем длинную позицию
     {                                               // 
      LongPositionClose();
     }
   if(Sell_Close && PositionSelect(Symbol1))         // Закрываем короткую позицию
     {                                               //           
      ShortPositionClose();
     }
   return;
  } //bbb
//+------------------------------------------------------------------+
//| Открытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionOpen()
  {
   MqlTradeRequest mrequest;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                              // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(Symbol1,SYMBOL_ASK);   // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(Symbol1,SYMBOL_BID);   // лучшее предложение на продажу

   if(!PositionSelect(Symbol1))
     {
      mrequest.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      mrequest.sl = 0;                                  // Stop Loss
      mrequest.tp = 0;                                  // Take Profit
      mrequest.symbol = Symbol1;                        // символ
  //    mrequest.symbol = S[I];                        // символs
     // r.symbol=S[I];
    // string S[3]={"EURUSD","EURGBP","GBPUSD"};
//SymbolPosition A[3]={PBuy,PSell,PSell}; // What is action for each symbol
//SymbolPosition SPos[3];                 // What is position for each symbol . ==> MUST BE a HAMMILTON settings !
      mrequest.volume = Lot;                            // количество лотов для торговли
      mrequest.magic = 0;                               // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                   // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_FOK;        // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                             // проскальзывание от текущей цены       
    OrderSend(mrequest,mresult);   
    // OrderSend(MqlTradeRequest request,MqlTradeResult result);                      // отсылаем ордер
   //   bool  OrderSend( MqlTradeRequest&  request,// структура запроса  MqlTradeResult&   result  // структура ответа );
     }
  }
//+------------------------------------------------------------------+
//| Открытие короткой позиции                                        |
//+------------------------------------------------------------------+
void ShortPositionOpen()
  {
   MqlTradeRequest mrequest;                             // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                               // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(Symbol1,SYMBOL_ASK);    // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(Symbol1,SYMBOL_BID);    // лучшее предложение на продажу

   if(!PositionSelect(_Symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;               // немедленное исполнение
      mrequest.price = NormalizeDouble(Bid,_Digits);     // последняя цена Bid        
      mrequest.sl = 0;                                   // Stop Loss
      mrequest.tp = 0;                                   // Take Profit
      mrequest.symbol = Symbol1;                         // символ
      mrequest.volume = Lot;                             // количество лотов для торговли
      mrequest.magic = 0;                                // Magic Number
      mrequest.type= ORDER_TYPE_SELL;                    // ордер на продажу
      mrequest.type_filling = ORDER_FILLING_FOK;         // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                              // проскальзывание от текущей цены         
      OrderSend(mrequest,mresult);                       // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
//| Закрытие длинной позиции                                         |
//+------------------------------------------------------------------+
void LongPositionClose()
  {
   MqlTradeRequest mrequest;                             // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                               // Будет использоваться для получения результатов выполнения торговых запросов    

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(Symbol1,SYMBOL_ASK);    // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(Symbol1,SYMBOL_BID);    // лучшее предложение на продажу

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      mrequest.action = TRADE_ACTION_DEAL;               // немедленное исполнение
      mrequest.price = NormalizeDouble(Bid,_Digits);     // последняя цена Bid
      mrequest.sl = 0;                                   // Stop Loss
      mrequest.tp = 0;                                   // Take Profit
      mrequest.symbol = Symbol1;                         // символ
      mrequest.volume = Lot;                             // количество лотов для торговли
      mrequest.magic = 0;                                // Magic Number
      mrequest.type= ORDER_TYPE_SELL;                    // ордер на продажу
      mrequest.type_filling = ORDER_FILLING_FOK;         // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                              // проскальзывание от текущей цены         
      OrderSend(mrequest,mresult);                       // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+
//| Закрытие короткой позиции                                        |
//+------------------------------------------------------------------+
void ShortPositionClose()
  {
   MqlTradeRequest mrequest;                              // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                                // Будет использоваться для получения результатов выполнения торговых запросов         

   ZeroMemory(mrequest);
   ZeroMemory(mresult);

   double Ask = SymbolInfoDouble(Symbol1,SYMBOL_ASK);     // лучшее предложение на покупку
   double Bid = SymbolInfoDouble(Symbol1,SYMBOL_BID);     // лучшее предложение на продажу

   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
     {
      mrequest.action = TRADE_ACTION_DEAL;                // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);      // последняя цена ask
      mrequest.sl = 0;                                    // Stop Loss
      mrequest.tp = 0;                                    // Take Profit
      mrequest.symbol = Symbol1;                          // символ
      mrequest.volume = Lot;                              // количество лотов для торговли
      mrequest.magic = 0;                                 // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                     // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_FOK;          // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                               // проскальзывание от текущей цены         
      OrderSend(mrequest,mresult);                        // отсылаем ордер
     }
  }
//+------------------------------------------------------------------+       

советник все равно не работает даже на 1 паре, что неверно в этих блоках.

На другом советнике работает блок открытия и закрытия сделок.

дает предупреждения:

    return value of 'OrderSend' should be checked nur.mq5 258 5


 
flat55:

Добрый день всем!

прошу помочь разобраться с кодом.Дает следующие ошибки и Предупреждения , надеюсь не последние....:

в этом коде: -2017.09.07 09:37:04.977        array out of range in   (266,37)

Ещё Вам не сказали, что массив вышел за свои рамки в 266 строке. Но эту строку Вы не показали.

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