Hatalar, hatalar, sorular - sayfa 1986

 
Alexey Kozitsyn :

OnCalculate() içinde ilk başlatmada bir başlatma var (prev_calculated == 0). OnInit()'e geçmenin bir şeyleri değiştireceğini mi düşünüyorsunuz? Deneyeceğim elbette, ama bu fantezi dünyasından bir şey ...

Durmak. Dediğim gibi, diziler OnDeinit() içinde başlatılır , bunlar artık bir sonraki başlatmada kullanılmaz (giriş parametrelerinin değiştirilmesi). Bu (arabellek olarak kullanılmayan bir dizinin başlatılması) yardımcı olursa - bu da bir MT hatası olacaktır. Sadece dizilerin kullanılmadığı, aynı zamanda (ayrılmamış) hala başlatılabildiği ortaya çıktı ve bu, ekranı etkileyecek ...

Kodsuz zor. Servis masasının yanıt vereceğini daha sonra buradan bildirin.
 
Anatoli Kazharski :
Kodsuz zor. Servis masasının yanıt vereceğini daha sonra buradan bildirin.
İyi.
 
Anatoli Kazharski :
Kodsuz zor. Servis masasının yanıt vereceğini daha sonra buradan bildirin.

Eğer ilgileniyorsanız, test kodu burada.

Başlangıçta, gösterge parametresi yanlıştır.

Göstergeyi grafiğe koyduk. Bir histogram çizer.

Parametreleri doğru yapıyoruz.

Histogram ve oklar çizer.

Parametreyi yanlış yapıyoruz. Geçerli TF'de oklar kaybolur (her zaman değil). ANCAK! TF'leri değiştirirsem, başlatma sırasında arabellekleri temizlemesine rağmen bazı oklar bazılarında düzensiz görünüyor.

 #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 :
Hiçbirine gitmez. Servis Masası # 1832411 x64, 1643.
 
Alexey Kozitsyn :
Hiçbirine gitmez. Servis Masası # 1832411 x64, 1643.

Ok dizilerini arabellek olarak belirtseniz de belirtmeseniz de, bunlar hala sabit kodlanmıştır:

 #property indicator_plots   3
#property indicator_buffers 4

//---

Alternatif olarak, okların görüntülenmesi gerekmiyorsa, bunlar ekrandan çıkarılabilir - DRAW_NONE .

Bu seçeneği deneyin :

 ...
//--- Проверяем, нужно ли отображать объемы
   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 :

Ok dizilerini arabellek olarak belirtseniz de belirtmeseniz de, bunlar hala sabit kodlanmıştır:

//---

Alternatif olarak, okların görüntülenmesi gerekmiyorsa, bunlar ekrandan çıkarılabilir - DRAW_NONE .

Bu seçeneği deneyin :

Bunu düşündüm, ama bir eksi var. Diziler, bir kaynak tüketerek otomatik olarak işaretlenecek ve genişletilecektir. Geliştiricilerin hatayı düzeltmesine izin verseniz iyi olur.

Ve sabit kodlanmış olduğu gerçeği hakkında ... Tamponları bir grafiğe bağlamazsam. dizi - neden kurtulamadığım bilinmeyen bazı çöpler görüyorum.

Aksi takdirde, dinamik göstergelerin normal şekilde oluşturulamayacağı ortaya çıkıyor.

En ideal seçenek, tamponları deinite olarak temizlemektir ve bu kadar. Ama temizlik yardımcı olmuyor...

 

ALT+M'deki işlevler/yöntemler listesindeki ME'de, döndürülen değerin hareketsiz türünü gösterme isteği.

 

Sıradan bir dize ve bir "ham" dize için, diğer PL'lerde alışılmış olduğu gibi, dize türü için bir ayrım yapmak kötü olmaz. Her halükarda bu noktaya geleceklerini düşünüyorum ama ilk aşamada bu ileride birçok sorunu ortadan kaldıracaktır.

Örneğin, Python'da "ham" bir dize oluştururken, r"dize" kullanılır
 

Günlükler hangi nedenle test cihazında tam olarak görüntülenemiyor? Görülebilecek her şey - baktı ve kontrol edildi, kazanamadı.

 
Andrey Dik :

Günlükler hangi nedenle test cihazında tam olarak görüntülenemiyor? Görülebilecek her şey - baktı ve kontrol edildi, kazanamadı.

Çok sayıda giriş. Günlük dosyasına bakın.