Errori, bug, domande - pagina 810

 

Ho un suggerimento per gli sviluppatori: fate dei valori predefiniti per tutti i tipi incorporati. C++ non è un modello in questo senso.

Risparmierete davvero molto tempo e nervi per voi stessi e per chi risponde alle domande come sopra.

 
Fia:


   while((a/b)<1 && !IsStopped())//---------

Quali sono i difetti o sto fraintendendo qualcosa?
cos'è un?
 
sergeev:
cosa equivale a un?

Per default (nell'esempio sopra) a=2.652664430987377e-314 , ma in questo caso il ciclo while lavora fino a a+b=30.

Naturalmente, potete assegnare immediatamente il doppio a=1;

Ma la situazione non cambia.

L'output è sempre a+b=30

E return restituisce 0, il debugger mostra tutto.

 
Fia:

Cosa sono questi glitch o mi manca qualcosa?

Inizializzazione delle variabili:

Qualsiasi variabile può essere inizializzata quando viene definita. Se la variabile non è esplicitamente inizializzata, il valore memorizzato nella variabile può essere quello che volete. L'inizializzazione implicita non viene eseguita.

 

Fia:

L'output è sempre a+b=30

E return restituisce 0, il debugger mostra tutto.

Lo trovo difficile da credere.
 
sergeev:
Stento a crederci.

Cosa ti impedisce di controllare?

Specialmente per questo scopo ho dato un semplice codice.

Ho due build di 687 (su diversi broker), provato a compilare entrambi con lo stesso risultato (ma a volte ottengo 30 correttamente), non riesco a capire se sono scemo io o lo sci non si muove!

Controllare non so cosa pensare.

 

Finora non è stato possibile riprodurlo. Quindi cominciamo dall'inizio.

Quale bit rate, OS?

 
alexvd:

Ancora nessuna fortuna con la riproduzione.

Quale bit rate, OS?

Win7 64 bit

Non lo so nemmeno, appena scaricato appena caricato MT5 compilato, stessa cosa.

Posso fare una foto (potrebbe pensare che ti sto prendendo in giro).

P.S. Ora l'ho appena toccato, ancora una volta ha funzionato 30, l'ho compilato e ora funziona a vuoto ancora qualche volta (magia)

 

Buon pomeriggio.

Sto cercando di usare MQL5. Hosmontato exp_tema.mq5 e ho modificato il codice. Ora dovrei stampare in log MA di ogni candela (ultime 20). Ma non capisco perché mancano alcune voci nel registro. Ho notato che se ma[3] manca nel registro, allora non c'è ma[13]. Perché succede questo? Dov'è l'errore?

input string            Symb0 = "EURUSD";
input  bool            Trade0 = true;
int MA_Shift0=1;
input int MA_Per0 = 100;
//+-----------------------------------+
input string            Symb1 = "USDCHF";
input  bool            Trade1 = true;
int MA_Shift1=1;
input int MA_Per1 = 100;

bool MA (int Number,
         string  Symbol_,           // имя символа
         bool    Trade,
         int     MA_Per,         // период для расчета средней линии
         int     MA_Shift          // смещение индикатора по горизонтали              
        )

  {
//---- проверка запрета на торговлю
   if(!Trade)return(true);

//---- объявление переменной для хранения итогового размера массивов переменных
   static int Size_=0;

//---- объявление массива для хранения хэндлов индикаторов как статической переменной
   static int Handle[];
  static int Recount[],MinBars[];
  double ma[20];
  
  
     if(Number+1>Size_) // вход в блок инициализации только на первом старте
     {
      Size_=Number+1; // для этого номера вход в блок закрыт
        //---- изменение размеров массивов переменных
      ArrayResize(Handle,Size_);
      ArrayResize(Recount,Size_);
      ArrayResize(MinBars,Size_);

      //---- определение минимально количества баров, достаточного для расчета 
      MinBars[Number]=3*MA_Per;
      
            //---- предварительное обнуление ячеек массивов

      
       //---- используем массив как таймсерию
      ArraySetAsSeries(ma,true);

      //---- получение хендла индикатора
      
      Handle[Number]=iMA(Symbol_,0,MA_Per,MA_Shift,MODE_SMA,PRICE_CLOSE);  
      
      Print("+++++++++Handle[Number]= ",Handle[Number]);
     }


 //---- проверка количества баров на достаточность для расчета 
   if(Bars(Symbol_,0)<MinBars[Number])return(true);
   //---- Получение торговых сигналов 
   if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // вход в блок на смене бара или при неудачном копировании данных
     {
      
      //---- используя хэндлы индикатора, копируем значения индикаторного буфера
      //---- в специально подготовленный для этого статический массив
      if(CopyBuffer(Handle[Number],0,0,20,ma)<0)
        {
         Recount[Number]=true; // так как данные не получены, то следует вернуться 
                               // в этот блок получения торговых сигналов на следующем тике!
         return(false);        // выходим из функции TradeSignalCounter() без получения торговых сигналов
        }
      //---- все операции копирования из индикаторного буфера завершены успешно
      Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бара
      
      
 
 Print("+++++++++ma[0]= ",ma[0]);     
 Print("+++++++++ma[1]= ",ma[1]);
 Print("+++++++++ma[2]= ",ma[2]);
 Print("+++++++++ma[3]= ",ma[3]);
 Print("+++++++++ma[4]= ",ma[4]);
 Print("+++++++++ma[5]= ",ma[5]);
 Print("+++++++++ma[6]= ",ma[6]);
 Print("+++++++++ma[7]= ",ma[7]);
 Print("+++++++++ma[8]= ",ma[8]);
 Print("+++++++++ma[9]= ",ma[9]);
 Print("+++++++++ma[10]= ",ma[10]);     
 Print("+++++++++ma[11]= ",ma[11]);
 Print("+++++++++ma[12]= ",ma[12]);
 Print("+++++++++ma[13]= ",ma[13]);
 Print("+++++++++ma[14]= ",ma[14]);
 Print("+++++++++ma[15]= ",ma[15]);
 Print("+++++++++ma[16]= ",ma[16]);
 Print("+++++++++ma[17]= ",ma[17]);
 Print("+++++++++ma[18]= ",ma[18]);
 Print("+++++++++ma[19]= ",ma[19]);
      
     }
  
  return(true);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
MA(0,Symb0,Trade0,MA_Per0,MA_Shift0);
MA(1,Symb1,Trade1,MA_Per1,MA_Shift1);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| IsNewBar() function                                              |
//+------------------------------------------------------------------+
bool IsNewBar(int Number,string symbol,ENUM_TIMEFRAMES timeframe)
  {
//----
   static datetime Told[];
   datetime Tnew[1];
//---- объвление переменной для хранения размеров массивов переменных
   static int Size_=0;

//---- изменение размеров массивов переменных
   if(Number+1>Size_)
     {
      uint size=Number+1;
      //----
      if(ArrayResize(Told,size)==-1)
        {
         string word="";
         StringConcatenate(word,"IsNewBar( ",Number,
                           " ): Ошибка!!! Не удалось изменить размеры массивов переменных!!!");
         Print(word);
         //----          
         int error=GetLastError();
         ResetLastError();
         if(error>4000)
           {
            StringConcatenate(word,"IsNewBar( ",Number," ): Код ошибки ",error);
            Print(word);
           }
         //----                                                                                                                                                                                                  
         Size_=-2;
         return(false);
        }
     }

   CopyTime(symbol,timeframe,0,1,Tnew);
   if(Tnew[0]!=Told[Number])
     {
      Told[Number]=Tnew[0];
      return(true);
     }
//----
   return(false);
  }
 
Fia:

Win7 64 bit

Non lo so, ho appena scaricato MT5 ora, ho eseguito un commento, stessa cosa.

Posso togliere un video o qualcosa del genere (penso che ti sto solo prendendo in giro).

Non è necessario uno screenshot.

Fate una stampa dettagliata nel codice in modo da poter vedere nel log a cosa sono uguali le variabili intermedie.