Fehler, Irrtümer, Fragen - Seite 810

 

Ich habe einen Vorschlag für die Entwickler - machen Sie Standardwerte für alle eingebauten Typen. C++ ist kein Modell in diesem Sinne.

Damit sparen Sie sich und denjenigen, die die Fragen beantworten, eine Menge Zeit und Nerven (siehe oben).

 
Fia:


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

Was sind die Pannen oder verstehe ich etwas falsch?
Was ist ein?
 
sergeev:
Was entspricht einem?

Standardmäßig (im obigen Beispiel) ist a=2,652664430987377e-314 , aber in diesem Fall arbeitet sich die while-Schleife zu a+b=30 vor.

Natürlich können Sie sofort double a=1 zuweisen;

Aber die Situation ändert sich nicht.

Die Ausgabe ist immer a+b=30

Und return gibt 0 zurück, der Debugger zeigt alles an.

 
Fia:

Worin bestehen diese Störungen, oder übersehe ich etwas?

Initialisierung von Variablen:

Jede Variable kann bei ihrer Definition initialisiert werden. Wenn die Variable nicht explizit initialisiert wird, kann der Wert, der in der Variable gespeichert wird, jeder beliebige sein. Eine implizite Initialisierung wird nicht durchgeführt.

 

Fia:

Die Ausgabe ist immer a+b=30

Und return gibt 0 zurück, der Debugger zeigt alles an.

Es fällt mir schwer, das zu glauben.
 
sergeev:
Ich kann es kaum glauben.

Was hält Sie davon ab, es sich anzusehen?

Speziell für diesen Zweck habe ich einen einfachen Code erstellt.

Ich habe zwei Builds von 687 (auf verschiedenen Brokern), versucht, beide mit dem gleichen Ergebnis zu kompilieren (aber manchmal bekomme ich 30 richtig), kann ich nicht verstehen, ob ich dumm bin oder der Ski ist nicht in Bewegung!

Ich weiß nicht, was ich denken soll.

 

Bislang war es nicht möglich, diese zu reproduzieren. Fangen wir also ganz am Anfang an.

Welche Bitrate, OS?

 
alexvd:

Noch kein Glück mit der Reproduktion.

Welche Bitrate, OS?

Win7 64 bit

Ich weiß nicht einmal, gerade entladen gerade jetzt geladen MT5 kompiliert, gleiche Sache.

Ich kann das Video abnehmen (die werden denken, ich mache mich darüber lustig).

P.S. Jetzt habe ich es gerade getippt, es hat wieder 30 Mal funktioniert, ich habe es kompiliert und jetzt funktioniert es noch ein paar Mal null (Magie)

 

Guten Tag.

Ich versuche, MQL5 zu verwenden.Ich habe exp_tema.mq5 disassembliert und den Code geändert. Jetzt sollte ich in log MA von jeder Kerze (letzten 20) zu drucken. Aber ich verstehe nicht, warum einige Einträge im Protokoll fehlen. Mir ist aufgefallen, dass , wenn ma[3] im Protokoll fehlt, auch kein ma[13] vorhanden ist. Warum ist das so? Wo liegt hier der Fehler?

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

Ich weiß nicht, ich habe gerade MT5 entladen, eine Kopie davon ausgeführt und es ist dasselbe.

Ich kann ein Video abspielen oder so (ich glaube, ich verarsche dich nur).

Sie brauchen keinen Screenshot.

Machen Sie einen detaillierten Ausdruck im Code, damit wir im Protokoll sehen können, was die Zwischenvariablen sind gleich.