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

 
Alexey Kozitsyn :

처음 시작할 때 OnCalculate()에 초기화가 있습니다(prev_calculated == 0). OnInit()로 이동하면 무언가가 변경될 것이라고 생각하십니까? 글쎄, 나는 물론 시도 할 것이지만 이것은 환상의 영역에서 무언가 ...

중지. 내가 말했듯이 배열은 OnDeinit() 에서 초기화 되며 다음 시작(입력 매개변수 변경)에서 더 이상 사용되지 않습니다. 이것이 (버퍼로 사용되지 않는 배열의 초기화) 도움이 된다면 - 이것은 또한 MT 버그가 될 것입니다. 배열이 사용되지 않을 뿐만 아니라 (할당되지 않은) 배열이 여전히 초기화될 수 있으며 이는 디스플레이에 영향을 미칩니다...

코드 없이는 어렵습니다. 서비스 데스크에서 응답할 것이라고 나중에 여기에 보고하십시오.
 
Anatoli Kazharski :
코드 없이는 어렵습니다. 서비스 데스크에서 응답할 것이라고 나중에 여기에 보고하십시오.
좋은.
 
Anatoli Kazharski :
코드 없이는 어렵습니다. 서비스 데스크에서 응답할 것이라고 나중에 여기에 보고하십시오.

관심이 있는 경우 테스트 코드가 있습니다.

처음에는 표시기 매개변수가 false입니다.

차트에 지표를 표시합니다. 히스토그램을 그립니다.

우리는 매개변수를 true로 만듭니다.

히스토그램과 화살표를 그립니다.

매개변수를 false로 만듭니다. 현재 TF에서 화살표가 사라집니다(항상 그런 것은 아님). 하지만! TF를 전환하면 초기화 해제 중에 버퍼를 지워도 일부 화살표가 혼란스럽게 나타납니다.

 #property indicator_separate_window
#property indicator_plots 3
#property indicator_buffers 4
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input bool inpUseArrows= false ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---
const double EMPTY = EMPTY_VALUE ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- Размечаем массив цветов
   color colors[ 2 ];
   colors[ 0 ]= clrLime ;
   colors[ 1 ] = clrRed ;
//--- Устанавливаем параметры графических серий
   SetPlotParametersColorHistogram( 0 , 0 ,bufGisto,bufGistoColor, false , "test gisto" ,colors, EMPTY , 2 );
//--- Проверяем, нужно ли отображать объемы
   if (inpUseArrows) // Если отображать нужно
     {
      SetPlotParametersArrow( 1 , 2 ,bufArrowUp, false , "test up" , EMPTY , clrLime , 233 , 10 );
      SetPlotParametersArrow( 2 , 3 ,bufArrowDn, false , "test dn" , EMPTY , clrRed , 234 ,- 10 );
     }
//---
   IndicatorSetInteger ( INDICATOR_DIGITS , 0 );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   if (inpUseArrows)
     {
       ArrayInitialize (bufArrowUp, EMPTY );
       ArrayInitialize (bufArrowDn, EMPTY );
     }
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if (prev_calculated== 0 )
     {
       ArrayInitialize (bufGisto, EMPTY );
       //---
       if (inpUseArrows)
        {
         ArrayInitialize (bufArrowUp, EMPTY );
         ArrayInitialize (bufArrowDn, EMPTY );
        }
       //---
       for ( int i= 0 ; i<rates_total; i++)
        {
         bufGisto[i]=(open[i]-close[i])/ _Point ;
         bufGistoColor[i]=(bufGisto[i]< 0 ) ? 1 : 0 ;
         //---
         if (inpUseArrows)
           {
             if (bufGisto[i]> 20 )
               bufArrowDn[i]=bufGisto[i];
             else if (bufGisto[i]<- 20 )
               bufArrowUp[i]=bufGisto[i];
           }
        }
     }
   else if (rates_total>prev_calculated)
     {
      bufGisto[rates_total- 1 ]= EMPTY ;
       //---
       if (inpUseArrows)
        {
         bufArrowUp[ rates_total- 1 ] = EMPTY ;
         bufArrowDn[ rates_total- 1 ] = EMPTY ;
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: цветная гист-а от 0 линии                |
//+------------------------------------------------------------------+
void SetPlotParametersColorHistogram( const int plotIndex, // Индекс графической серии
                                     const int bufferNum, // Номер первого буфера серии
                                     double & value[],                               // Буфер значений
                                     double & clr[],                                 // Буфер цветов
                                     const bool asSeries,                           // Флаг нумерации как в таймсерии
                                     const string label,                           // Имя серии
                                     const color & colors[],                         // Цвета линии
                                     const double emptyValue = EMPTY_VALUE ,         // Пустые значения серии
                                     const int width = 0 ,                           // Толщина линии
                                     const ENUM_LINE_STYLE style = STYLE_SOLID ,       // Стиль линии
                                     const int drawBegin = 0 ,                         // Количество баров без отрисовки
                                     const int shift= 0                            // Сдвиг построения в барах
                                     )
  {
//--- Привязываем буферы
   SetIndexBuffer (bufferNum,value, INDICATOR_DATA );
   SetIndexBuffer (bufferNum+ 1 ,clr, INDICATOR_COLOR_INDEX );
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries (value,asSeries);
   ArraySetAsSeries (clr,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger (plotIndex, PLOT_DRAW_TYPE , DRAW_COLOR_HISTOGRAM );
//--- Устанавливаем имя графической серии
   PlotIndexSetString (plotIndex, PLOT_LABEL ,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble (plotIndex, PLOT_EMPTY_VALUE ,emptyValue);
//--- Устанавливаем количество цветов индикатора
   const int size= ArraySize (colors);
   PlotIndexSetInteger (plotIndex, PLOT_COLOR_INDEXES ,size);
//--- Устанавливаем цвета индикатора
   for ( int i= 0 ; i<size; i++)
       PlotIndexSetInteger (plotIndex, PLOT_LINE_COLOR ,i,colors[i]);
//--- Устанавливаем толщину линии
   PlotIndexSetInteger (plotIndex, PLOT_LINE_WIDTH ,width);
//--- Устанавливаем стиль линии
   PlotIndexSetInteger (plotIndex, PLOT_LINE_STYLE ,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger (plotIndex, PLOT_DRAW_BEGIN ,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger (plotIndex, PLOT_SHIFT ,shift);
  }
//+------------------------------------------------------------------+
//| Параметры графического построения: стрелки                                                          |
//+------------------------------------------------------------------+
void SetPlotParametersArrow( const int plotIndex, // Индекс графической серии
                             const int bufferNum, // Номер первого буфера серии
                             double &value[], // Буфер значений
                             const bool asSeries, // Флаг нумерации как в таймсерии
                             const string label, // Имя серии
                             const double emptyValue= EMPTY_VALUE , // Пустые значения серии
                             const color clr= clrRed , // Цвет стрелок
                             const int arrowCode= 159 , // Код стрелок
                             const int arrowShift = 0 , // Сдвиг стрелок по вертикали
                             const int width= 0 , // Толщина стрелок
                             const int drawBegin= 0 , // Количество баров без отрисовки
                             const int shift= 0                      // Сдвиг построения в барах
                            )
  {
//--- Привязываем буферы
   SetIndexBuffer (bufferNum,value, INDICATOR_DATA );
//--- Устанавливаем порядок нумерации в массивах-буферах
   ArraySetAsSeries (value,asSeries);
//--- Устанавливаем тип графического построения
   PlotIndexSetInteger (plotIndex, PLOT_DRAW_TYPE , DRAW_ARROW );
//--- Устанавливаем имя графической серии
   PlotIndexSetString (plotIndex, PLOT_LABEL ,label);
//--- Устанавливаем пустые значения в буферах
   PlotIndexSetDouble (plotIndex, PLOT_EMPTY_VALUE ,emptyValue);
//--- Устанавливаем цвет индикатора
   PlotIndexSetInteger (plotIndex, PLOT_LINE_COLOR , 0 ,clr);
//--- Устанавливаем код стрелок
   PlotIndexSetInteger (plotIndex, PLOT_ARROW ,arrowCode);
//--- Устанавливаем смещение стрелок по вертикали
   PlotIndexSetInteger (plotIndex, PLOT_ARROW_SHIFT ,arrowShift);
//--- Устанавливаем толщину стрелок
   PlotIndexSetInteger (plotIndex, PLOT_LINE_WIDTH ,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindow
   PlotIndexSetInteger (plotIndex, PLOT_DRAW_BEGIN ,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барах
   PlotIndexSetInteger (plotIndex, PLOT_SHIFT ,shift);
  }
//+------------------------------------------------------------------+
 
Anatoli Kazharski :
아무데나 가지 않습니다. 서비스 데스크 번호 1832411 x64, 1643.
 
Alexey Kozitsyn :
아무데나 가지 않습니다. 서비스 데스크 번호 1832411 x64, 1643.

화살표 배열을 버퍼로 지정하는지 여부에 관계없이 여전히 하드 코딩됩니다.

 #property indicator_plots   3
#property indicator_buffers 4

//---

또는 화살표를 표시할 필요가 없으면 표시에서 제외할 수 있습니다( DRAW_NONE ) .

이 옵션을 시도하십시오 .

 ...
//--- Проверяем, нужно ли отображать объемы
   if (inpUseArrows) // Если отображать нужно
     {
      SetPlotParametersArrow( 1 , 2 ,bufArrowUp, false , "test up" , EMPTY , clrLime , 233 , 10 );
      SetPlotParametersArrow( 2 , 3 ,bufArrowDn, false , "test dn" , EMPTY , clrRed , 234 ,- 10 );
     }
   else
     {
       //--- Устанавливаем тип графического построения
       PlotIndexSetInteger ( 1 , PLOT_DRAW_TYPE , DRAW_NONE );
       PlotIndexSetInteger ( 2 , PLOT_DRAW_TYPE , DRAW_NONE );
     }

...

 
Anatoli Kazharski :

화살표 배열을 버퍼로 지정하는지 여부에 관계없이 여전히 하드 코딩됩니다.

//---

또는 화살표를 표시할 필요가 없으면 표시에서 제외할 수 있습니다( DRAW_NONE ) .

이 옵션을 시도하십시오 .

생각했지만 마이너스가 있습니다. 배열은 자동으로 표시되고 확장되어 리소스를 먹습니다. 개발자가 버그를 수정하도록 하는 것이 좋습니다.

그리고 하드코딩되어 있다는 사실에 대해서... 그래프에 버퍼를 묶지 않는다면. 시리즈 - 제거할 수 없는 알 수 없는 쓰레기가 보이는 이유는 무엇입니까?

그렇지 않으면 동적 지표를 정상적으로 구축할 수 없는 것으로 나타났습니다.

가장 이상적인 옵션은 버퍼를 완전하게 청소하는 것입니다. 그러나 청소는 도움이되지 않습니다 ...

 

ALT+M의 함수/메서드 목록에서 ME의 요청은 반환된 값의 여전히 유형을 표시합니다.

 

다른 PL에서 관례적인 것처럼 일반 문자열과 "원시" 문자열에 대해 문자열 유형 을 구분하는 것은 나쁘지 않습니다. 나는 그들이 어쨌든 이것에 올 것이라고 생각하지만 초기 단계에서는 미래의 많은 문제를 제거 할 것입니다.

예를 들어 Python에서 "원시" 문자열을 생성할 때 r"string"이 사용됩니다.
 

테스터에 로그가 완전히 표시되지 않는 이유는 무엇입니까? 볼 수있는 모든 것 -보고 확인했지만 이길 수 없었습니다.

 
Andrey Dik :

테스터에 로그가 완전히 표시되지 않는 이유는 무엇입니까? 볼 수있는 모든 것 -보고 확인했지만 이길 수 없었습니다.

항목이 많습니다. 로그 파일을 참조하십시오.