エラー、バグ、質問 - ページ 810

 

開発者に提案があるのですが、すべての組み込み型にデフォルト値を作ってください。C++は、この意味でのモデルではない。

そうすることで、自分自身や回答者の時間や神経を節約することができます。

 
Fia:


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

何か不具合があるのか、私が何か勘違いしているのか?
とは 何ですか?
 
sergeev:
what equalsa?

デフォルトでは(上記の例では) a=2.652664430987377e-314 ですが、この場合 while ループは a+b=30 になるように動作しています。

もちろん、すぐにdouble a=1を代入することも可能です。

しかし、状況は変わりません。

出力は常に a+b=30

そしてreturnは0を返す、デバッガはそれを全て表示する。

 
Fia:

この不具合は何なのか、それとも私が見逃しているのか?

変数の初期化:

どのような変数も定義時に初期化することができる。変数が明示的に初期化されていない場合、変数に格納される値は何でも よい。 暗黙の初期化は行われない。

 

Fia:

出力は常に a+b=30

そしてreturnは0を返す、デバッガはそれを全て表示する。

信じがたい話ですね。
 
sergeev:
信じられませんね。

なぜチェックしないの?

特にこの目的のために、簡単なコードを用意しました。

私は687の2つのビルドを持っている(異なるブローカーで)、同じ結果で両方をコンパイルしようとした(しかし、時々私は正しく30を得る)、私はダムかスキーが動いていないのか理解することはできません!私は、このような場合、私はそれを行うことができます。

チェック 何を考えているのかわからない。

 

今のところ、再現できていない。では、冒頭からいきましょう。

OS、ビットレートは?

 
alexvd:

再現性はまだない。

OS、ビットレートは?

Win7 64ビット

MT5を アンロードしてコンパイルしたものをロードしたところ、同じことが起こりました。

写真を撮ることができる(いじっていると思われるかもしれない)。

追伸:今タップしたらまた30回動いたので、コンパイルしたらまた数回ヌルヌル動くようになりました(魔法)。

 

こんにちは。

MQL5を使おうとしているのですが、どうすればいいですか?exp_tema.mq5を逆アセンブル し、コードを修正しました。今、私は各ローソク(最後の20)のログMAで印刷する必要があります。しかし、なぜログにいくつかのエントリが欠落しているのか理解できない。ログにma[3]がない場合、ma[13]がないことに 気づきました。なぜ、このようなことが起こるのでしょうか?そこでのエラーはどこにあるのでしょうか?

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ビット

今、MT5をアンロードして、コピーを走らせましたが、同じような感じなので、わかりません。

動画とか外せるし(いじってるつもり)。

スクリーンショットは必要ありません。

中間変数が何に等しいかをログで確認できるように、コード内に詳細なPrintを 作成する。