오류, 버그, 질문 - 페이지 810

 

개발자에게 제안할 것이 있습니다. 모든 내장 유형에 대해 기본값을 설정하십시오. C++는 이런 의미에서 롤 모델이 아닙니다.

음, 결국, 위와 같은 질문이 없는 상태에서 자신과 답변하는 사람들을 구하는 것은 정말 많은 시간과 신경을 써야 합니다.

 
Fia :


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

어떤 종류의 결함이나 내가 뭔가를 오해하고 있습니까 ???
같음 무엇입니까?
 
sergeev :
같음 무엇입니까?

기본값(위의 예에서)은 a=2.652664430987377e-314 이지만 while 루프는 a+b=30으로 끝납니다.

물론 즉시 double=1을 할당할 수 있습니다.

그러나 상황은 나와 함께 변하지 않습니다.

출력은 항상 +b=30입니다.

반환은 0 을 반환하고 디버거에서 모두 볼 수 있습니다.

 
Fia :

어떤 종류의 결함이나 내가 뭔가를 오해하고 있습니까 ???

변수 초기화 :

모든 변수는 정의될 때 초기화될 수 있습니다. 변수가 명시적으로 초기화되지 않은 경우 이 변수에 저장된 값은 무엇이든 될 수 있습니다 . 암시적 초기화는 없습니다.

 

Fia :

출력은 항상 +b=30입니다.

반환은 0 을 반환하고 디버거에서 모두 볼 수 있습니다.

믿기 어렵습니다.
 
sergeev :
믿기 어렵습니다.

복용 및 확인을 방해하는 것은 무엇입니까?

이 목적을 위해 특히 코드가 소박합니다.

내 두 빌드 687(다른 브로커에서)에서 나는 이것을 둘 다에서 컴파일하려고 시도했지만 결과는 동일합니다(그러나 때때로 30을 올바르게 준 것으로 밝혀졌습니다). 가지마!?

확인하세요. 더 이상 어떻게 생각해야 할지 모르겠습니다.

 

아직 재현할 수 없습니다. 그리고 처음부터 시작하겠습니다.

어떤 비트, OS?

 
alexvd :

아직 재현할 수 없습니다.

어떤 비트, OS?

Win7 64비트

나도 몰라, 이제 방금 로드된 MT5 컴파일을 언로드했는데 모든 것이 동일합니다.

나는 비디오 chtol을 제거할 수 있습니다(그렇지 않으면 그들이 내가 농담하는 것으로 생각할 것입니다).

PS 이제 찔렀습니다. 다시 한 번 30이 제공되고 컴파일되고 이미 0으로 몇 번 더 제공됩니다 (신비주의)

 

안녕하세요.

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 컴파일을 언로드했는데 모든 것이 동일합니다.

나는 비디오 chtol을 제거할 수 있습니다(그렇지 않으면 그들이 내가 농담하는 것으로 생각할 것입니다).

당신은 비전가가 필요하지 않습니다.

중간 변수가 무엇인지 로그에서 볼 수 있도록 코드에서 장황하게 인쇄 하십시오.

사유: