Init() 및 DeInit() 실행 순서 - 페이지 22

 
fxsaber :
해결책

저것들. 전체 문제는 표시기에 동일한 행 두 개를 추가하는 것입니다.


라이브러리 코드


어떤 식 으로든 더 간단하고 명확하고 명확합니까?

또한 표시기의 각 인스턴스 에는 전역 변수로 고유한 이름이 필요합니다. 갑자기 차트에 매개변수가 다른 두 개의 표시기가 나타납니다.

 
Dmitry Fedoseev :


어떤 식 으로든 더 간단하고 명확하고 명확합니까?

안 돼요.

또한 표시기의 각 인스턴스 에는 전역 변수로 고유한 이름이 필요합니다. 갑자기 차트에 매개변수가 다른 두 개의 표시기가 나타납니다.

이 작업을 수행할 필요가 없습니다. 동일한 차트에서 매개변수가 다른 두 개의 지표 인스턴스는 이 스레드에서 원하는 사용법과 반대입니다.

따라서 두 번째 인스턴스를 시작하면 첫 번째 인스턴스가 언로드될 때까지 작동하지 않습니다.

 
fxsaber :

안 돼요.

...



 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrRed
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1

string gvName;

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   gvName= MQLInfoString ( MQL_PROGRAM_NAME );
   
   if ( GlobalVariableCheck (gvName)){
       EventSetMillisecondTimer ( 1 );      
   }
   else {
       GlobalVariableSet (gvName, 1 );
      NewInit();
   }
   return ( INIT_SUCCEEDED );
}

void NewInit(){
   // все что было в ините должно быть здесь
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
}

void OnDeinit ( const int r){
   GlobalVariableDel (gvName);
}

void OnTimer (){
   if (! GlobalVariableCheck (gvName)){
       EventKillTimer ();      
       GlobalVariableSet (gvName, 1 );
      NewInit();
   }

}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   for ( int i=rates_total- 10 ;i<rates_total;i++)Label1Buffer[i]=close[i];

   return (rates_total);
  }
//+------------------------------------------------------------------+
그것?
 
Dmitry Fedoseev :
그것?

당연히 아니지. 핸들 차트는 전역 변수 의 이름으로 작성해야 합니다.

그리고 내 솔루션은 두 줄만 추가하여 달성됩니다. 이것은 다소 쉽습니다.

 #include <Init_Sync.mqh> // Делает синхронизированными Init/Deinit индикаторов

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1   clrRed
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1

double Label1Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit (){
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
   return ( INIT_SUCCEEDED );
}

void OnTimer (){
  CHECK_INIT_SYNC;
   }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   for ( int i=rates_total- 10 ;i<rates_total;i++)Label1Buffer[i]=close[i];

   return (rates_total);
  }
//+------------------------------------------------------------------+
 
fxsaber :

당연히 아니지. 핸들 차트는 전역 변수 의 이름으로 작성해야 합니다.

그리고 내 솔루션은 두 줄만 추가하여 달성됩니다. 이것은 다소 쉽습니다.


그리고 논리 자체(알고리즘)는 동일합니까?
 
fxsaber :

....

그리고 내 솔루션은 두 줄만 추가하여 달성됩니다. 이것은 다소 쉽습니다.

그리고 표준 초기화가 아닌 지연을 사용하여 SetIndexBuffer와 같은 함수를 호출 해도 문제가 되지 않습니까? 이것이 정상이라고 절대 확신합니까?

 
Dmitry Fedoseev :

그리고 논리 자체(알고리즘)는 동일합니까?
네.
 
Dmitry Fedoseev :

내가 가지고 있는 줄 수와 당신이 가지고 있는 줄 수를 세어 보세요... 그는 두 줄을 추가합니다.

당신은 계산하지 않았습니다 - 많이.

이 논의의 원하는 속성을 갖는 지표에 대해 정확히 두 개만 추가하면 충분합니다.

 
fxsaber :

당신은 계산하지 않았습니다 - 많이.

이 논의의 원하는 속성을 갖는 지표에 대해 정확히 두 개만 추가하면 충분합니다.


열 번째 질문입니다. 취향의 문제. 하지만 여전히 내 코드는 5배 더 작고 읽을 수 있습니다./

더 흥미로운 것은 다음과 같습니다.

표준 초기화가 아닌 지연으로 SetIndexBuffer 함수를 호출하는 것이 귀찮습니까? 이것이 정상이라고 절대 확신합니까?

 
Dmitry Fedoseev :

표준 초기화가 아닌 지연으로 SetIndexBuffer 함수를 호출하는 것이 귀찮습니까? 이것이 정상이라고 절대 확신합니까?

물론 입니다. OnCalculate를 호출하면 문제가 발생할 수 있지만 라이브러리를 약간 조정하면 해결됩니다. 월요일에 밝힐 수 있습니다.

원칙적으로 한 줄로 할 수 있습니다.