Yeni başlayanlardan sorular MQL4 MT4 MetaTrader 4 - sayfa 223

 

Gösterge arabelleğini diğer uçtan doldurmaya çalışıyorum (ArraySetAsSeries (..., yanlış))), bir süre her şey yolunda gidiyor, ancak sonra arabelleğe bir şey oluyor ve en son dizi dizini dolduruluyor, ancak bu olmamalıdır .
Anladığım kadarıyla, terminal bir noktada arabelleği kesiyor ve bu nedenle, arabellek dizinin en son dizini ile bile dolu görünüyor. Muhtemelen bir noktada dizi arabelleğini boşaltmanız gerekiyor, ama ne zaman? Test durumunu düzeltebilir misin?


 #property indicator_buffers 1

double ExtMapBuffer[]; // AQUA   "Line"
int       LastData;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping

   SetIndexBuffer ( 0 ,ExtMapBuffer);
   SetIndexStyle( 0 , DRAW_LINE , STYLE_SOLID , 7 , clrAqua );
   SetIndexEmptyValue( 0 , 0.0 );
   SetIndexLabel( 0 , "Line" );

   LastData= 0 ;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| 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     i;
   bool Series= false ;
   ArraySetAsSeries (ExtMapBuffer,Series);
   ArraySetAsSeries (high,Series);

   i=prev_calculated- 1 ;

   if (i< 1 ) 
     {
      LastData= 0 ;
      i= 1 ;
       while (i<rates_total- 1 )
        {
         ExtMapBuffer[i]=high[i];
         i++; 
         LastData=i;
        }
     }
   else
     {
      i=LastData;
     }

   while (i<rates_total- 1 )
     {
      ExtMapBuffer[i]=high[i];
      i++;
      LastData=i;
     }

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

Merhaba.

Lütfen bana bu göstergenin neden tarihe nadiren ok çizdiğini ve ticarete başladığınızda sık sık ok çizmeye başladığını söyleyin.

Ardından, MT4'ü kapatıp tekrar açarsanız, göstergenin gerçek zamanlı olarak bir makineli tüfek gibi esnaf çizdiği yerde, yine 1-2 işlem vardır.

Ve geçmişe baktığınızda, göstergenin iyi ticaret yapması gerektiği anlaşılıyor, ancak gerçek zamanlı ticareti açar açmaz her şey başlıyor.

Söyle bana neden böyle? İşte gösterge kodu:

 //---- indicator settings
#property   indicator_chart_window
#property   indicator_buffers 2
#property   indicator_color1   Blue
#property   indicator_color2   Red
//---- indicator parameters
extern int   period = 4 ; //12
extern int   shift  = 0 ; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 2 );
//---- drawing settings
   SetIndexStyle( 0 , DRAW_ARROW , 2 );
   SetIndexArrow( 0 , 233 );
   SetIndexStyle( 1 , DRAW_ARROW , 2 );
   SetIndexArrow( 1 , 234 );

   SetIndexBuffer ( 0 ,BufferUp); //стрелка синяя верх
   SetIndexBuffer ( 1 ,BufferDn); //стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "T3MA-ALARM (" +period+ ")" );
//---- initialization done
   if ( Digits == 3 || Digits == 5 ) q= 10 ;
   st=st*q;
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete ( "low" );
   ObjectDelete ( "high" );
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int     i;
   ArraySetAsSeries (Ma, true );
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if (counted_bars< 0 ) return (- 1 );
   if (counted_bars> 0 ) counted_bars--;
   int limit1= Bars -counted_bars;
   if (counted_bars== 0 ) limit1-= 1 + MathMax (period,shift)+ 2 ;

   int buffer_size= ArraySize (BufferUp);
   ArrayResize (Ma,buffer_size);
   ArrayResize (MaOn,buffer_size);

   ArrayResize (y0,buffer_size+shift+ 2 );
   ArrayResize (y1,buffer_size+shift+ 2 );
   ArrayResize (y2,buffer_size+shift+ 2 );

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 0 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 0 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 0 ; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+ 1 +shift]=MaOn[i+ 1 +shift];
      y2[i+ 2 +shift]=MaOn[i+ 2 +shift];

       if (y0[i+shift]-y1[i+ 1 +shift]< 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]> 0 ){BufferDn[i+ 1 ]=High[i+ 1 ]+st* Point ;}
       if (y0[i+shift]-y1[i+ 1 +shift]> 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]< 0 ){BufferUp[i+ 1 ]=Low[i+ 1 ]-st* Point ;}
       //---- Signal Trend Up || Dn ---------------------------------------------   
       if (y0[i]-y1[i+ 1 ]> 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n BUY TREND " ,DoubleToStr(Close[i], Digits ));

       else if (y0[i]-y1[i+ 1 ]< 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n SELL TREND " ,DoubleToStr(Close[i], Digits ));
     }

//---- done
   return ( 0 );
  }
//+---------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 

üç yerde 0'ı 1 ile değiştirmeyi deneyin

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
 
Aleksei Stepanenko :

üç yerde 0'ı 1 ile değiştirmeyi deneyin

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
        // вот сюда
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)

ben de taşırdım

 
Vitaly, insanların bir soru yazıp işlerine bakacağını fark ettim ve burada birbirimizle eğleniyoruz. Bazen hesaplamalı birkaç sayfa.
 
Aleksei Stepanenko :

üç yerde 0'ı 1 ile değiştirmeyi deneyin

Çok teşekkürler. Ve şimdi sadece mevcut mumun sonunda mevcut zaman diliminde fırsatlar açmasını nasıl sağlayabilirim? :)) Sadece şimdi anlaşmaların ne zaman olduğunu anlamıyor... Oklar doğru çiziyor gibi görünüyor ve mumlara bakıyorsunuz, her şey yolunda görünüyor, ancak ortaya çıktıkça anlaşmaların kendileri açılıyor. mumun ortasına veya sonuna daha yakın, genel olarak, herhangi bir yerde, sadece olması gerektiği yerde değil. :(

 //---- indicator settings
#property   indicator_chart_window
#property   indicator_buffers 2
#property   indicator_color1   Blue
#property   indicator_color2   Red
//---- indicator parameters
extern int   period = 4 ; //12
extern int   shift  = 0 ; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 2 );
//---- drawing settings
   SetIndexStyle( 0 , DRAW_ARROW , 2 );
   SetIndexArrow( 0 , 233 );
   SetIndexStyle( 1 , DRAW_ARROW , 2 );
   SetIndexArrow( 1 , 234 );

   SetIndexBuffer ( 0 ,BufferUp); //стрелка синяя верх
   SetIndexBuffer ( 1 ,BufferDn); //стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "T3MA-ALARM (" +period+ ")" );
//---- initialization done
   if ( Digits == 3 || Digits == 5 ) q= 10 ;
   st=st*q;
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete ( "low" );
   ObjectDelete ( "high" );
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int     i;
   ArraySetAsSeries (Ma, true );
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if (counted_bars< 0 ) return (- 1 );
   if (counted_bars> 0 ) counted_bars--;
   int limit1= Bars -counted_bars;
   if (counted_bars== 0 ) limit1-= 1 + MathMax (period,shift)+ 2 ;

   int buffer_size= ArraySize (BufferUp);
   ArrayResize (Ma,buffer_size);
   ArrayResize (MaOn,buffer_size);

   ArrayResize (y0,buffer_size+shift+ 2 );
   ArrayResize (y1,buffer_size+shift+ 2 );
   ArrayResize (y2,buffer_size+shift+ 2 );

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+ 1 +shift]=MaOn[i+ 1 +shift];
      y2[i+ 2 +shift]=MaOn[i+ 2 +shift];

       if (y0[i+shift]-y1[i+ 1 +shift]< 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]> 0 ){BufferDn[i+ 1 ]=High[i+ 1 ]+st* Point ;}
       if (y0[i+shift]-y1[i+ 1 +shift]> 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]< 0 ){BufferUp[i+ 1 ]=Low[i+ 1 ]-st* Point ;}
       //---- Signal Trend Up || Dn ---------------------------------------------   
       if (y0[i]-y1[i+ 1 ]> 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n BUY TREND " ,DoubleToStr(Close[i], Digits ));

       else if (y0[i]-y1[i+ 1 ]< 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n SELL TREND " ,DoubleToStr(Close[i], Digits ));
     }

//---- done
   return ( 0 );
  }
//+---------------------------------------------------------------------+
 

genel olarak, yeni bir mum oluşumu sırasında, henüz kapanmış mum hakkında tüm bilgiler zaten olduğunda, anlaşmalar açmak gelenekseldir.

 datetime LastTime= 0 ;


void OnTick ()
   {
   if (LastTime== iTime (symbol,frame, 0 )) return ;
   LastTime= iTime (symbol,frame, 0 );
 
Vitaly Muzichenko :

ben de taşırdım

Ve tam olarak nerede gösterdiler?

 int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
// а не вот сюда?
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
        
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
 
Aleksei Stepanenko :

genel olarak, yeni bir mum oluşumu sırasında, henüz kapanmış mum hakkında tüm bilgiler zaten olduğunda, anlaşmalar açmak gelenekseldir.

Ve tam olarak gerektiği gibi çalışması için bu kodu eklemek için en iyi yer neresidir? Ve sonra çok kötü anlıyorum, sadece yolun en başında ...
 
Aleksei Stepanenko :
Vitaly, insanların bir soru yazıp işlerine bakacağını fark ettim ve burada birbirimizle eğleniyoruz. Bazen hesaplamalı birkaç sayfa.
Gördüğünüz gibi, bu her zaman böyle değildir. :))