전역 초기화 실패!!!!!!! - 페이지 2

 

문제없어요, 엔제보저

코드는 원래 다음과 같습니다.

 int init()
  {
       // Check for input errors
       if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively." );
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1." );
         }
      }
      
       IndicatorShortName ( "White Wolf Custom Software Moving Averages Indicator" );
      
//---- indicators
       SetIndexStyle ( 0 , DRAW_LINE );
       SetIndexBuffer ( 0 ,EMABuffer1);
       SetIndexStyle ( 1 , DRAW_LINE );
       SetIndexBuffer ( 1 ,EMABuffer2);
       SetIndexStyle ( 2 , DRAW_LINE );
       SetIndexBuffer ( 2 ,EMABuffer3);
       SetIndexStyle ( 3 , DRAW_LINE );
       SetIndexBuffer ( 3 ,SMABuffer);
   
       SetIndexEmptyValue ( 0 , 0.0 );
       SetIndexEmptyValue ( 1 , 0.0 );
       SetIndexEmptyValue ( 2 , 0.0 );
       SetIndexEmptyValue ( 3 , 0.0 );
//----

       // MA Period Buttons
      MA_Display_Time_Frame = Period (); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
       ResetLastError ();
       Alert ( "In init() - Calling CreateMAPeriodButtons()" );
      CreateMAPeriodButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
         
       ResetLastError ();
       Alert ( "In init() - Calling CreateDismissSignalButtons()" );
      CreateDismissSignalButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       Alert ( "In init() - Calling SetPeriodButtonState()" );
      SetPeriodButtonState();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
   
   // Set normalization factor for current currency pair
   if (( Digits == 4 ) || ( Digits == 5 ))
         NormalizationFactor = 0.0001 ;
       else
         NormalizationFactor = 0.01 ;
   
   return ( 0 );
  }

void deinit()
  {
       Alert ( "In de-init() - getting ready to delete objects " );
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_LABEL );
       Alert ( "In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_BUTTON );
       Alert ( "In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString (GetLastError()));

return ( 0 );
 }

나는 단순히 이것을 다음과 같이 수정했다.

 //+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int OnInit ()
  {
       // Check for input errors
       if (Use_LT_TimeFrame_Confirmation)
      {
         if (Number_Of_TimeFrames < 1 || Number_Of_TimeFrames > 4 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend confirmation must be between 2 and 4, inclusively." );
         }
         
         if (Number_Of_Periods_For_Trend_Agreement < 2 )
         {
             Alert ( "Initialization Error: Number of time frames for timeframe trend aggreement must be greater than 1." );
         }
      }
      
       IndicatorShortName ( "White Wolf Custom Software Moving Averages Indicator" );
      
//---- indicators
       SetIndexStyle ( 0 , DRAW_LINE );
       SetIndexBuffer ( 0 ,EMABuffer1);
       SetIndexStyle ( 1 , DRAW_LINE );
       SetIndexBuffer ( 1 ,EMABuffer2);
       SetIndexStyle ( 2 , DRAW_LINE );
       SetIndexBuffer ( 2 ,EMABuffer3);
       SetIndexStyle ( 3 , DRAW_LINE );
       SetIndexBuffer ( 3 ,SMABuffer);
   
       SetIndexEmptyValue ( 0 , 0.0 );
       SetIndexEmptyValue ( 1 , 0.0 );
       SetIndexEmptyValue ( 2 , 0.0 );
       SetIndexEmptyValue ( 3 , 0.0 );
//----

       // MA Period Buttons
      MA_Display_Time_Frame = Period (); // Set the trade entry time frame to the current chart period - this ensures that we have a TF for the MA calculations
   
   // Show the timeframe buttons so the user can refine their entry strategy if they wish
 
       ResetLastError ();
       Alert ( "In init() - Calling CreateMAPeriodButtons()" );
      CreateMAPeriodButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
         
       ResetLastError ();
       Alert ( "In init() - Calling CreateDismissSignalButtons()" );
      CreateDismissSignalButtons();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       Alert ( "In init() - Calling SetPeriodButtonState()" );
      SetPeriodButtonState();
       if (GetLastError() != 0 )
         Alert ( "GetLasteError() returned " + IntegerToString (GetLastError()));
   
   // Set normalization factor for current currency pair
   if (( Digits == 4 ) || ( Digits == 5 ))
         NormalizationFactor = 0.0001 ;
       else
         NormalizationFactor = 0.01 ;
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
       Alert ( "In de-init() - getting ready to delete objects " );
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_LABEL );
       Alert ( "In de-init() - attempting to delete labels - GetLastError() returns  " + IntegerToString (GetLastError()));
      
       ResetLastError ();
       ObjectsDeleteAll ( 0 , OBJ_BUTTON );
       Alert ( "In de-init() - attempting to delete buttons - GetLastError() returns  " + IntegerToString (GetLastError()));
  }

보시다시피 기능의 "고기"를 변경하지 않았습니다. 나는 단순히 새로운 기능을 준수하는 데 필요한 모드를 만들었습니다. 내가 여전히 약간 흐릿한 한 가지는 start()에서 OnStart() 또는 OnTick()으로의 변경입니다(지금은 잊어버렸지만 여전히 문제 없이 start()를 사용하고 있습니다 . 이것은 사용자 지정 표시기 라는 점을 언급해야 합니다. 또 다른 불만 사항은 EA, 표시기 또는 스크립트를 코딩하는지 여부에 따라 사용할 수 있는 항목의 제한입니다. 몇 가지 의미가 있습니다(예: EA를 코딩하지 않는 한 거래가 구현되는 것을 허용하지 않는 경우) 및 그렇지 않은 경우(예: MessageBox 및 표시기 사용 금지) 저를 정말 괴롭히는 또 다른 것은 거래와 같은 이벤트에 사용할 수 있는 이벤트가 없다는 것입니다. 이것은 내가 지금 정리하고 있는 것에 정말 도움이 될 것입니다.

내 마지막 진술로 얻은 것의 예는 다음과 같습니다. 특정 기준이 충족되면 매수 신호를 표시하고 특정 기준이 충족되면 이에 대한 닫기 매수 거래 신호를 표시하고 싶지만 내 사용자가 구매 신호를 취소하고 원하는 경우 다른 신호를 기다릴 수 있고 닫기 신호도 마찬가지입니다. 그들이 거래를 마감하기로 선택하면 매수 및 매수 마감 신호가 사라지고 표시기가 다른 거래에 대한 진입 기준을 주시하도록 하고 싶습니다. 취소 부분은 완벽하게 작동하지만 MQL4가 이에 대한 메시징을 제공하지 않기 때문에 열기 및 닫기 이벤트를 감지할 수 없습니다.

내 프로필을 본 적이 있다면 내가 결코 초보 프로그래머가 아니라는 것을 알 수 있을 것입니다. 이 언어는 전문가가 현대 개발 플랫폼에서 기대하고 필요로 하는 모든 기능을 제공하지 않습니다. 또 다른 메모에서, 주요 불만인 디버깅을 작동시킬 수 없습니다. 나는 문서를 따랐지만 디버거를 동작으로 설정하려고 했을 때 내 표시기를 초기화하기 위한 속성 대화 상자를 표시하는 차트를 얻었지만 표시기 설정을 완료하기 위해 확인을 누르면 차트가 사라지고 그게 전부였습니다. 아마도 러시아어에서 영어로의 번역에서 무언가가 손실되고 있고 내가 뭔가를 놓치고 있거나 아마도 "케이크"가 완전히 구워지지 않았을 것입니다. 전문가로서 저는 이와 같은 개발 언어와 환경을 만드는 것이 얼마나 기념비적인 작업인지 알고 있습니다. 제 발언은 FYI의 성격상 불만보다는 개발 직원을 위한 것입니다.

교수

 
ProfessorMetal :

문제없어요, 엔제보저

코드는 원래 다음과 같습니다.


교수

죄송하지만 게시한 코드가 컴파일되지 않았습니다. 문제를 재현하기 위해 코드를 요청합니다.
 

내가 설정하는 변수를 선언하지 않았고 또한 내가 호출하는 메서드가 선언되고 구체화되지 않은 경우 컴파일되지 않습니다. 그것은 할 수 없습니다. 나는 당신이 그것을 알기를 기대했을 것입니다. 나는 당신이 요구했다고 생각하는 것을 게시했습니다 - 내 문제를 해결한 솔루션. 어쨌든 MetaQuotes와 함께 있고 MetaTrader에 무슨 일이 일어나고 있는지 파악하고 수정하려는 경우 아래에 더 많은 내용을 게시했습니다. init()에서 if 블록을 주석 처리하고 MA_Display_Time_Frame을 전역적으로 정수로 선언하고 다음 메서드를 추가합니다.

 void CreateMAPeriodButtons()
  {
//  Alert("In CreateMAPeriodButtons()");
       int X_Distance = 10 ;
       int Y_Distance = 20 ;
       // Create MA Period Label
       ObjectCreate ( "MAPeriodLabel" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "MAPeriodLabel" , OBJPROP_CORNER , CORNER_RIGHT_UPPER );
       ObjectSet ( "MAPeriodLabel" , OBJPROP_XDISTANCE , X_Distance);
       ObjectSet ( "MAPeriodLabel" , OBJPROP_YDISTANCE , Y_Distance);
       ObjectSetText ( "MAPeriodLabel" , "MA Display Period" , 12 , "Arial" , clrYellow );
      
       // Create Period Buttons
      CreateButton( "M1" , "M1" , 1 , 140 , 50 , 100 , 20 , "Arial" , 12 , clrYellow , clrGray );
}

void CreateDismissSignalButtons()
  {
       int X_Distance = 25 ;
       int Y_Distance = 100 ;
      
       // Create Dismiss Label
       ObjectCreate ( "DismissSignalsLabel" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_CORNER , CORNER_RIGHT_LOWER );
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_XDISTANCE , X_Distance);
       ObjectSet ( "DismissSignalsLabel" , OBJPROP_YDISTANCE , Y_Distance);
       ObjectSetText ( "DismissSignalsLabel" , "Dismiss Trade Signals" , 12 , "Arial" , clrYellow );
      
       // Create Dismiss Buttons
      
      CreateButton( "DismissBuySignal" , "Dismiss Buy Signal" , CORNER_RIGHT_LOWER , 200 , 95 , 190 , 20 , "Arial" , 12 , clrYellow , clrGray );
}

void CreateButton( string strButtonName, string strButtonText, const int nCorner, const int nXpos, const int nYpos, int nWidth, int nHeight, string strFont, 
                     int nFontSize, int nFontColor, int nBackColor, bool bSelected = false )
  {      
       ObjectCreate ( 0 , strButtonName, OBJ_BUTTON , 0 , 0 , 0 );

       //--- set button coordinates
      
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_CORNER , nCorner);

       ObjectSetInteger ( 0 , strButtonName, OBJPROP_XDISTANCE , nXpos);

       ObjectSetInteger ( 0 , strButtonName, OBJPROP_YDISTANCE , nYpos);
 
       //--- set button size
       ObjectSet (strButtonName, OBJPROP_XSIZE , nWidth);
     
       ObjectSet (strButtonName, OBJPROP_YSIZE , nHeight);

       //--- set the chart's corner, relative to which point coordinates are defined
      
       ObjectSet (strButtonName, OBJPROP_CORNER , nCorner);

       //--- set the text
      
       ObjectSetString ( 0 , strButtonName, OBJPROP_TEXT , strButtonText);
       ObjectSetString ( 0 , strButtonName, OBJPROP_FONT , strFont);
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_FONTSIZE , nFontSize);
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_COLOR , nFontColor);

       //--- set background color
      
       ObjectSetInteger ( 0 , strButtonName, OBJPROP_BGCOLOR , nBackColor);
      
       return ;
  }

이것은 어떤 방법으로든 모든 표시기 코드가 아닌 상용 제품을 위한 것이기 때문에 원래 init() 및 deinit() 메서드를 사용하여 컴파일하고 잠재적으로 문제를 일으킬 수 있습니다. 몇 개의 레이블과 버튼을 만드는 것으로 충분합니다. 포스터 중 하나가 언급했듯이 실패는 간헐적이었습니다. 그러나 표시기 속성 변경, 시간 프레임 변경 또는 터미널 중지 및 다시 시작과 같이 표시기를 초기화 해제하게 하는 모든 작업과 관련되었습니다. 속성 변경을 테스트하려면 다음 extern을 전역에 추가하십시오.

 extern int                Number_Of_TimeFrames = 2 ;
extern int                Number_Of_Periods_For_Trend_Agreement = 25 ;
extern bool              Allow_Modify_Entry_Timeframe = true ;

externs를 추가하면 이를 참조하는 if 블록을 주석 처리할 필요가 없습니다. 컴파일하고 문제를 재현하는 데 충분해야 합니다. 기존 초기화 및 초기화 해제 기능 을 변경하고 새 버전으로 이동하여 문제가 발생하지 않았습니다. 다른 것이 필요하면 저에게 알려주십시오. 스레드를 주시하겠습니다.

 

나는 비슷한 상황이 있었고 인디는 차트에 떨어졌을 때 잘 작동했습니다.

매개 변수 가 변경된 후에는 잘 작동했고 Tf shift 후에는 잘 작동했습니다.

MT4를 종료하고 다시 시작한 후 인디가 표시되지 않았습니다.

차트의 지표 목록에 있었지만 작동하지 않았습니다.

매개변수 창을 열고 확인 버튼을 클릭한 후 인디는 즉시 목록에서 사라졌습니다.

위의 게시물에 설명된 것을 포함하여 모든 트릭을 시도했지만 아무 것도 작동하지 않았습니다.

그것은 0으로 나누기 문제로 밝혀졌습니다!

단순: if(x!=0) 조건이 문제를 해결했습니다.

 

예, 다른 인디와 동일한 문제가 발생했습니다.

플랫폼이 시작될 때마다 "if"가 없으면 인디는 0으로 나누기 문제가 있고,

새로운 MT4는 체크될 때까지 정보가 저장되지 않은 것 같습니다.

다른 해결책은 start() 또는 OnStart() 대신 OnCalculate()를 사용하는 것입니다.

그러나 그것은 MetaQuotes에 대해 불평할 사항입니다.

   double pipValue = MarketInfo ( Symbol (), MODE_TICKVALUE ); 

   if (pipValue!= 0 )
    {
   double lots   = AccountBalance ()*(RiskPercent/ 100.0 )/(StopLoss*pipValue);
    }
 

return(0) 트릭을 사용해야 합니다.

누군가 관심이 있다면 조금 자세히 설명할 것입니다.

 
deysmacro :

return(0) 트릭을 사용해야 합니다.

누군가 관심이 있다면 조금 자세히 설명할 것입니다.


음, 인터넷 어디에서나 찾을 수 있는 오래된 지표는 코드가 자동으로 수정되지 않습니다.

누군가가 코드를 수정할 수 있고 문제를 이해할 수 있다면 스스로 할 수 있습니다.

나머지는 모두 MT4를 열 때마다 인디가 보이지 않는 불편함을 느낄 수밖에 없습니다.

템플릿이 있으면 인디를 복원하는 데 사용할 수 있지만 매번 이 작업을 수행해야 합니다.

새로운 Built 625에서 템플릿은 또 다른 이야기입니다.

 

얘들아,

당신은 모든 목표에서 벗어났습니다. 당신이 설명하는 것은 항상 문제였던 타이밍 문제입니다. 다음과 같이 아주 간단하게 처리할 수 있습니다.

 // Wait for the server "turmoil" to settle before doing anything
       string AcctCurrency = AccountCurrency ();
       
       if (AcctCurrency == "" )
           return ( 0 );

0으로 나누기 오류가 발생할 수 있는 것은 서버가 안정되기 전에 계산을 하려고 하기 때문입니다. 초기화 함수에서 계산을 수행하는 경우 - 하지 마세요! 위의 코드를 start() 또는 OnStart()에 넣고 필요한 작업을 수행합니다. Dadas, 당신이 그것을 간단하게 만들려고하면 큰 시간을 물게 될 것입니다. 당신은 당신의 인디에서 운이 좋아지고 있습니다.

인디가 사라지면 초기화에 실패한 것입니다. 로그를 보면 "전역 초기화 실패"가 표시됩니다. 왜 그런 말을 하고 있는지 파악하고 바로잡아야 합니다. 그렇지 않으면 바늘이 필요한 상처에 반창고를 붙이기만 하면 다시 돌아올 것입니다.

 

이 오류는 OnInit()과 아무 관련이 없으며 오류 설명이 오해의 소지가 있는 것 같습니다.

단 한 줄의 코드로

 int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   Print ( High [rates_total]);
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }

배열이 범위를 벗어남 오류가 발생합니다.

기간을 변경하면 전역 초기화에 실패하고 표시기가 차트에서 제거됩니다.

 
GumRai, 여기에는 다른 문제가 있는 것 같습니다. 하나는 deinit()가 호출되어야 할 때 호출되지 않고 주변에 매달려 있는 것입니다. OnCalculate() 로 보고 있는 것은 MQL의 함수 구현에서 결함처럼 들립니다. 작동 방식을 이해한다면. 다른 하나는 서버가 안정화되고 서버 측 정보를 "초기화"하기 전에 작업을 시도하는 것입니다. 나는 여기에서 추측하고 있지만 마지막은 OnCalculate()에서 보고 있는 것의 원인일 수도 있습니다. MQL 개발자는 약간의 디버깅을 해야 할 것 같습니다. 공정하게 말하면 그들이 시도하는 것은 사소한 것이 아닙니다. 결함은 예상할 수 있습니다.