MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1306

 

Lütfen yardım edin indikatöre başka bir tampon ekledim (double ma_buffer_stop[];), fakat çizmiyor ve hata vermiyor (

 //+------------------------------------------------------------------+
//|                                                   MTF_Moving.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                             https://www.mql5.com/ru/users/melnik |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link        "https://www.mql5.com/ru/users/melnik"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Black
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE

double ma_buffer_slow[];
double ma_buffer_fast[];
double ma_buffer_stop[];

//--- input parameters
input int                      PeriodMaSlow= 21 ;   //Period slow Ma
input int                      PeriodMaFast= 13 ;   //Pertiod fast Ma
input ENUM_APPLIED_PRICE       PriceMa= 0 ;         //Applied price
input ENUM_MA_METHOD           MethodMa= 0 ;       //Method Ma
input ENUM_TIMEFRAMES          Timeframe= 60 ;     //Timeframe for calculate

ENUM_TIMEFRAMES prd;

int index=- 1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , ma_buffer_slow, INDICATOR_DATA );
   SetIndexBuffer ( 1 , ma_buffer_fast, INDICATOR_DATA );
   SetIndexBuffer ( 2 , ma_buffer_stop, INDICATOR_DATA );
//---
   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[])
  {
//---
   if ((rates_total-prev_calculated-PeriodMaSlow)<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated-PeriodMaSlow- 1 ;i>= 0 ;i--)
   {
       if (TimeMinute(time[i])== 0 )index= iBarShift ( Symbol (), prd, time[i], false );
      
      ma_buffer_fast[i]= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index);
      ma_buffer_slow[i]= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index);
       if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+ 50 * Point ;}
       if (ma_buffer_fast[i+ 1 ]<=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]- 50 * Point ;}
   }
  
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

Kontrol et, buraya geliyor muyuz?

 if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf (ma_buffer_slow[i]);
Bu akla gelen ilk şey.
 

Bazen sıfıra bölmeyi yakalarım. (her şey dinamik olabilir)

Bölünme operasyonları hakkında yorum yapmak ve danışmanı grafiğe atmak için arıyorum.

Hatanın daha düzenli yöntemler olduğu satırı bir şekilde elde etmek mümkün müdür?

Sorun, hatanın yalnızca belirli bir durumda ortaya çıkmasıdır. Onlar. belirli bir TF'de ve yeni bir mum ile kaybolabilir. Saat 4'te fark ettiğinizde iyidir. Bulmak için zaman var.

 
Valeriy Yastremskiy :

Hatanın daha düzenli yöntemler olduğu satırı bir şekilde elde etmek mümkün müdür?

uzman günlüğünde dosyayı ve sıfıra bölmenin yapıldığı satır numarasını gösteren bir girişiniz olmalıdır.

 
Igor Makanu :

uzman günlüğünde dosyayı ve sıfıra bölmenin yapıldığı satır numarasını gösteren bir girişiniz olmalıdır.

2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: 'qstr7_52_1.mq4' içinde sıfır bölme (962.43)

Sadece bu.

962.43 aynı olmasına rağmen.

İşte bu))) Teşekkürler!!!!!


 
Aleksei Stepanenko :

Kontrol et, buraya geliyor muyuz?

Bu akla gelen ilk şey.

Düşeriz

Bunu yaparsam, o zaman çizerim

   double prev01,prev02;

   if ((rates_total-prev_calculated-PeriodMaSlow)<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated-PeriodMaSlow- 1 ;i>= 0 ;i--)
   {
       if (TimeMinute(time[i])== 0 )index= iBarShift ( Symbol (), prd, time[i], false );
      
      ma_buffer_fast[i]= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index);
      ma_buffer_slow[i]= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index);
      prev01= iMA ( Symbol (), prd, PeriodMaFast, 0 , MethodMa, PriceMa, index+ 1 );
      prev02= iMA ( Symbol (), prd, PeriodMaSlow, 0 , MethodMa, PriceMa, index+ 1 );
       if (prev01>=prev02&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+ 50 * Point ;}
       if (prev01<=prev02&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]- 50 * Point ;}
   }
  
 

Bu dizi sadece kesişme noktalarında istenilen değerlere sahiptir, diğer yerlerde değeri EMPTY_VALUE dir . Bu nedenle, hiçbir şey görünmez. Global bir değişken tanıtmanız ve ona kesişme anında değerler atamanız gerekir. Ve zaten kesişme anındaki mevcut değeri veya kavşak olmadığında geçmiş değeri verecektir.

 double Stop= 0 ;
int OnCalculate (....

if (ma_buffer_fast[i+ 1 ]>=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]<ma_buffer_slow[i]) Stop=ma_buffer_slow[i]+ 50 * Point ;
if (ma_buffer_fast[i+ 1 ]<=ma_buffer_slow[i+ 1 ]&&ma_buffer_fast[i]>ma_buffer_slow[i]) Stop=ma_buffer_slow[i]- 50 * Point ;

ma_buffer_stop[i]=Stop;
 
Aleksei Stepanenko :

Bu dizi sadece kesişme noktalarında istenilen değerlere sahiptir, diğer yerlerde değeri EMPTY_VALUE dir . Bu nedenle, hiçbir şey görünmez. Global bir değişken tanıtmanız ve ona kesişme anında değerler atamanız gerekir. Ve zaten kesişme anındaki mevcut değeri veya kavşak olmadığında geçmiş değeri verecektir.

teşekkürler, işe yaradı)

 
Gösterge işlevi hala çalışıyorsa, zaman çerçevesi değişikliğini zorla iptal etmek mümkün müdür?
 
Aleksei Stepanenko :

Bu dizi sadece kesişme noktalarında istenilen değerlere sahiptir, diğer yerlerde değeri EMPTY_VALUE dir . Bu nedenle, hiçbir şey görünmez. Global bir değişken tanıtmanız ve ona kesişme anında değerler atamanız gerekir. Ve zaten kesişme anındaki mevcut değeri veya kavşak olmadığında geçmiş değeri verecektir.

PeriodMaSlow ile 2 ile çarpılır

   if ((rates_total-prev_calculated- PeriodMaSlow )<= 0 ) return ( 0 );
  
   if ( Period ()>Timeframe) prd= PERIOD_CURRENT ;
   if ( Period ()<=Timeframe) prd=prd=Timeframe;
  
   for ( int i=rates_total-prev_calculated- PeriodMaSlow - 1 ;i>= 0 ;i--)

ve orijinal kod hatasız çalıştı

Neden: