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.
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_plots3#property indicator_buffers4//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+inputbool inpUseArrows= false ;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---constdoubleEMPTY = EMPTY_VALUE ;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//--- Размечаем массив цветов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 );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
if (inpUseArrows)
{
ArrayInitialize (bufArrowUp, EMPTY );
ArrayInitialize (bufArrowDn, EMPTY );
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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];
elseif (bufGisto[i]<- 20 )
bufArrowUp[i]=bufGisto[i];
}
}
}
elseif (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 callreturn (rates_total);
}
//+------------------------------------------------------------------+//| Параметры графического построения: цветная гист-а от 0 линии |//+------------------------------------------------------------------+void SetPlotParametersColorHistogram( constint plotIndex, // Индекс графической серииconstint bufferNum, // Номер первого буфера серииdouble & value[], // Буфер значенийdouble & clr[], // Буфер цветовconstbool asSeries, // Флаг нумерации как в таймсерииconststring label, // Имя серииconstcolor & colors[], // Цвета линииconstdouble emptyValue = EMPTY_VALUE , // Пустые значения серииconstint width = 0 , // Толщина линииconstENUM_LINE_STYLE style = STYLE_SOLID , // Стиль линииconstint drawBegin = 0 , // Количество баров без отрисовкиconstint 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);
//--- Устанавливаем количество цветов индикатораconstint 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);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger (plotIndex, PLOT_DRAW_BEGIN ,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger (plotIndex, PLOT_SHIFT ,shift);
}
//+------------------------------------------------------------------+//| Параметры графического построения: стрелки |//+------------------------------------------------------------------+void SetPlotParametersArrow( constint plotIndex, // Индекс графической серииconstint bufferNum, // Номер первого буфера серииdouble &value[], // Буфер значенийconstbool asSeries, // Флаг нумерации как в таймсерииconststring label, // Имя серииconstdouble emptyValue= EMPTY_VALUE , // Пустые значения серииconstcolor clr= clrRed , // Цвет стрелокconstint arrowCode= 159 , // Код стрелокconstint arrowShift = 0 , // Сдвиг стрелок по вертикалиconstint width= 0 , // Толщина стрелокconstint drawBegin= 0 , // Количество баров без отрисовкиconstint 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);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger (plotIndex, PLOT_DRAW_BEGIN ,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger (plotIndex, PLOT_SHIFT ,shift);
}
//+------------------------------------------------------------------+
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...
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
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.
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.
Hiçbirine gitmez. Servis Masası # 1832411 x64, 1643.
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 :
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ırGünlükler hangi nedenle test cihazında tam olarak görüntülenemiyor? Görülebilecek her şey - baktı ve kontrol edildi, kazanamadı.
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.