Çaydanlıktan gelen sorular - sayfa 235

 
lazarev-dm :

Buna değiştirildi

çalışıyor gibi görünüyor

dizileriniz seri değil.

işte burada -

Buffer[i+ 1 ]=Buffer[i]+delta;

geleceğe göz atmak


0 bar yeniden hesaplanmıyor - aynı nedenle - başladınız - 0'dan başlamıyor

 
sergeev :

dizileriniz seri değil.

işte burada -

geleceğe göz atmak


0 bar yeniden hesaplanmıyor - aynı nedenle - başladınız - 0'dan başlamıyor

0 barım var formülle hesaplanmıyor

Buffer[ 0 ]=price[ 0 ]; 

Ardından, fiyat hareketine bağlı olarak gösterge trendi yakalayacaktır.

Örneğin, fiyatın göstergeyi terk etmesi ve hareket etmemesi koşuluyla, " dönem " mumlarında gösterge fiyatı yakalayacaktır, bu benim için MA'ya bir çeşit alternatiftir.

 

lazarev-d-m :

benim için MA'ya bir çeşit alternatif

geleceğe 1 bar bakarak, bu alternatifi güvenle çöpe atabilirsiniz
 

İlk göstergem. Bir karakteri 0'dan 100'e ölçeklendirmek istiyorum. Doğru mu yapıyorum? Ve mevcut çubuğun yeniden hesaplanmaması nasıl yapılır (test cihazında seğirir, ancak grafikte değil)

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- indicator buffers
double          MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,MainBuffer, INDICATOR_DATA );
   IndicatorSetString ( INDICATOR_SHORTNAME , "NormSymbol" );
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   ArrayInitialize (MainBuffer, EMPTY_VALUE );

//---
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
   
   int first,bar,nLowBar= 0 ,nHighBar= 0 ;
   int nVizCount = ( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS );
   if (prev_calculated== 0 ) // проверка на первый старт расчёта индикатора
     {
      first= 0 ; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated- 1 ; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for (bar=first; bar<rates_total; bar++)
     {
      nLowBar = ArrayMinimum (low, bar, nVizCount);
      nHighBar= ArrayMaximum (high, bar, nVizCount);
       if (nLowBar> 0 && nHighBar> 0 && high[nHighBar]-low[nLowBar]!= 0 )
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))* 100 ;
        }
       else
        {
         MainBuffer[bar]= EMPTY_VALUE ;
        }
     }

  
//--- return value of prev_calculated for next call

   return (rates_total);
  }
 
Konstantin83 : mevcut çubuğun yeniden hesaplanmaması nasıl yapılır

Mevcut çubuğun açılış saatini hatırlayın ve gelen tik ile karşılaştırın. Geçerli çubuğun değerlerini yalnızca değerler eşleşmediğinde yeniden hesaplayın.

Başlatma bloğuna koyacağım şey bu:

   nVizCount = ( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS );
   

ve değişkenler programın global düzeyinde bildirilecektir:

 int first,bar,nLowBar= 0 ,nHighBar= 0 , nVizCount; 
 
Yedelkin :

Mevcut çubuğun açılış saatini hatırlayın ve gelen tik ile karşılaştırın. Geçerli çubuğun değerlerini yalnızca değerler eşleşmediğinde yeniden hesaplayın.

Başlatma bloğuna koyacağım şey bu:

Teşekkür ederim. Genel olarak her şey doğru mu?
 
Konstantin83 : Genel olarak her şey doğru mu?

Evet, başka bir şey fark etmedim. Makaleler benzer bir yapı önermektedir. Sıfıra bölme testi var.

Evet, yeniden hesaplamamak için hala hatırladığım kadarıyla prev_calculated ve Rate_total'ı karşılaştırabilirsiniz.

 
Yedelkin :

Evet, başka bir şey fark etmedim. Makaleler benzer bir yapı önermektedir. Sıfıra bölme testi var.

Evet, yeniden hesaplamamak için hala hatırladığım kadarıyla prev_calculated ve Rate_total'ı karşılaştırabilirsiniz.

Gösterge ile terminali kapattıktan ve ardından terminali başlattıktan sonra gösterge neden bir çizgi çekmiyor biliyor musunuz? Başka bir zaman dilimine geçerseniz, o zaman çizilir.
 
Konstantin83 : Gösterge ile terminali kapattıktan ve ardından terminali çalıştırdıktan sonra göstergenin neden çizgi çekmediğini biliyor musunuz? Başka bir zaman dilimine geçerseniz, o zaman çizilir.

Başlangıçta, terminalin “yükselmesi”, veritabanlarını sunucuyla senkronize etmesi vb. için biraz zamana ihtiyacı vardır. Gösterge aynı anda başlatılırsa, göstergeyi hesaplamak için henüz veri olmayabilir. En aptal çözümü deneyin: OnInit()'e birkaç saniyelik bir gecikme ekleyin.

İyi bir şekilde, sorunlu bir alan ararken tüm önemli bilgilerin yazdırılması arzu edilir. Tip

 if (nLowBar< 0 ) Print ( "Ошибка, nLowBar=" ,nLowBar, ", prev_calculated=" ,prev_calculated,", bar=",bar);
 

Yedelkin :

forward666 : görselleştirmeye ihtiyaç var

Şu anki zaman modunda alım satım yapmak için henüz herhangi bir yardım bulamadım - sadece bir demo hesabında bir pozisyon açıp kapatmayı deneyin.

İşte buldum: https://www.mql5.com/en/forum/6343/page96#comment_419028