Yardım Gerekiyor'da dizi aralık dışında - sayfa 9

 
Aleksei Stepanenko :

ArrayCopyRates'e gelince, Aleksey doğru konuştu. Yardım diyor ki:

Yani şunu yazmanız gerekiyor:

Ancak bu israf koddur.

Evet, yalnızca bir tane gerekiyorsa, 6 çubuk göstergesinin tümünü sürüklemenin bir anlamı yoktur. Aşk.

Ve aynı ölçekte (TF) derinliklere inmenin bir anlamı yok. Çeyrekten sonra haftalara, sonra aylara geçebilirsiniz ve 132 ay 11 yıldır.

Genel olarak, tüm çizelgede saymanın anlamsız olduğu fikri, tarihsel verilerin miktarı esasen rastgeledir, belki 70'ten, belki de 2000'den, farklı araçlarda, farklı veri sağlayıcılar farklıdır ve mantık farklıdır. tüm durumlar için aynı olduğunda her zaman daha iyidir.

 

Valery, haklısın!

Teoride, yalnızca şu tarih çubuklarına ihtiyacımız var:


Gerisi diziden atılabilir. İşte o zaman ekonomik olur.

 
Aleksei Stepanenko :

Valery, haklısın!

Teoride, yalnızca şu tarih çubuklarına ihtiyacımız var:


Gerisi diziden atılabilir. İşte o zaman ekonomik olur.

Böyle çizildi. Fikir henüz TopikStarter tarafından açıklanmadı)

TS için önemli olan ekstremleri bulup karşılaştırmak gerekir. Uzakta birçok özdeş Lowes vardır. Oldukça sık, Açık ve Kapanış aynı mum üzerinde eşittir ve önemli bir mesafede günün minimum fiyatları hakkında ne söyleyebiliriz.

 

Döngülerde bir hata fark ettim. Ve karşılaştırmayı bugünle değil, dünle değiştirdi. Denemek

 #property version    "1.00"
#property strict

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
datetime time= 0 , current;
int digits;

long ChartId;
int Window;
string Name= "MiniMax" ;

struct BarData
   {
   struct Elem
      {
       int       number;     //порядковый номер периода (дня, месяца или года)
       double    high;       //максимум периода
       double    low;         //минимум периода
       datetime time_high;   //время максимума
       datetime time_low;   //время минимума
      } Arr[];             //массив периода
   int index;               //текущий индекс массива
   double    max;           //последнее максимальное значение периода
   double    min;           //последнее минимальное значение периода
   datetime time_max;       //время максимума
   datetime time_min;       //время минимума

   //при создании структуры указываем, что массив пустой
   BarData(){index=- 1 ;}    
   
   //функция записывает текущие экстремумы
   void WriteBar( int eNumber, string eSymbol, ENUM_TIMEFRAMES eFrame, datetime eTime)
      {
       if (eTime== 0 ) return ;
       int eShift= iBarShift (eSymbol,eFrame,eTime);
       double eHigh= iHigh (eSymbol,eFrame,eShift);
       double eLow= iLow (eSymbol,eFrame,eShift);
       //если элементов ещё нет или период сменился
       if (index< 0 || eNumber!=Arr[index].number)
         {         
         ArrayResize (Arr,++index+ 1 );
         Arr[index].number=eNumber;
         Arr[index].high=eHigh;
         Arr[index].low=eLow;
         Arr[index].time_high=eTime;
         Arr[index].time_low=eTime;
         if (index== 0 )
            {
            max=eHigh;
            time_max=eTime;
            min=eLow;
            time_min=eTime;
            }
         }
       //если произошло обновление текущего максимума
       if (eHigh-Arr[index].high> 0 )
         {
         Arr[index].high=eHigh;
         Arr[index].time_high=eTime;
         }
       //если произошло обновление текущего минимума
       if (Arr[index].low-eLow> 0 )
         {
         Arr[index].low=eLow;
         Arr[index].time_low=eTime;
         }
       //если произошло обновление предыдущего максимума
       if (index> 0 )
         {
         max=Arr[index- 1 ].high;
         time_max=Arr[index- 1 ].time_high;
         for ( int i=index- 2 ; i>= 0 ; i--)
            {
             if (Arr[i].high-Arr[index- 1 ].high> 0 )
               {
               max=Arr[i].high;
               time_max=Arr[i].time_high;
               break ;
               }
            }
         }
       //если произошло обновление предыдущего минимума
       if (index> 0 )
         {
         min=Arr[index- 1 ].low;
         time_min=Arr[index- 1 ].time_low;
         for ( int i=index- 2 ; i>= 0 ; i--)
            {
             if (Arr[index- 1 ].low-Arr[i].low> 0 )
               {
               min=Arr[i].low;
               time_min=Arr[i].time_low;
               break ;
               }
            }
         }
      }
      
   double GetHigh() { return (index> 0 ?Arr[index- 1 ].high:Arr[index].high);}
   double GetLow() { return (index> 0 ?Arr[index- 1 ].low:Arr[index].low);}
   } day, month, year;

int OnInit ()
   {
   symbol= Symbol ();
   frame=( ENUM_TIMEFRAMES ) Period ();
   digits=( int ) SymbolInfoInteger (symbol, SYMBOL_DIGITS );
   //идентификатор графика и номер окна индикатора
   ChartId= ChartID ();
   Window= 0 ;
   return ( INIT_SUCCEEDED );
   }

void OnTick ()
   {
   //текущее время закрытого бара
   current= iTime (symbol,frame, 1 );

   do
      {    
       MqlDateTime date; 
       TimeToStruct (time,date);
      
       //делаем записи каждого периода
      day.WriteBar(date.day,symbol,frame,time);
      month.WriteBar(date.mon,symbol,frame,time);
      year.WriteBar(date.year,symbol,frame,time);
      
       if (time<current) {time= iTime (symbol,frame,( iBarShift (symbol,frame,time)- 1 ));} else break ;
      }
   while (time<=current);
   
   RedrawHLine(ChartId,Window,Name+ " High" ,day.GetHigh(), clrBlue , 1 , DoubleToString (day.GetHigh(),digits),digits);
   RedrawHLine(ChartId,Window,Name+ " Low" ,day.GetLow(), clrBlue , 1 , DoubleToString (day.GetLow(),digits),digits);
   RedrawText(ChartId,Window,Name+ " High_Text" , iTime (symbol,frame, 30 ),day.GetHigh(), "Day 1:  " + DoubleToString (day.GetHigh(),digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrBlue , "" ,digits);
   RedrawText(ChartId,Window,Name+ " Low_Text" , iTime (symbol,frame, 30 ),day.GetLow(), "Day 1:  " + DoubleToString (day.GetLow(),digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrBlue , "" ,digits);

   RedrawHLine(ChartId,Window,Name+ " Max" ,day.max, clrRed , 1 , DoubleToString (day.max,digits),digits);
   RedrawHLine(ChartId,Window,Name+ " Min" ,day.min, clrRed , 1 , DoubleToString (day.max,digits),digits);
   RedrawText(ChartId,Window,Name+ " Max_Text" , iTime (symbol,frame, 30 ),day.max, "Day Max:  " + DoubleToString (day.max,digits), ANCHOR_RIGHT_LOWER , "Arial" , 8 , clrRed , "" ,digits);
   RedrawText(ChartId,Window,Name+ " Min_Text" , iTime (symbol,frame, 30 ),day.min, "Day Min:  " + DoubleToString (day.min,digits), ANCHOR_RIGHT_UPPER , "Arial" , 8 , clrRed , "" ,digits);
   }

//перерисовывает линию по новым координатам, если её нет, то создаёт
void RedrawHLine( long eChartId, int eWindow, string eName, double ePrice, color eColor, int eWidth, string eTooltip, int eDigits)
   {
   if ( ObjectFind (eChartId,eName)==- 1 )
      {
       if (! ObjectCreate (eChartId,eName, OBJ_HLINE ,eWindow, 0 , 0 )) return ;
       ObjectSetInteger (eChartId,eName, OBJPROP_STYLE , STYLE_SOLID );
       ObjectSetInteger (eChartId,eName, OBJPROP_WIDTH ,eWidth);
       ObjectSetInteger (eChartId,eName, OBJPROP_BACK , true );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTABLE , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTED , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_HIDDEN , true );
      }
   if ( ObjectFind (eChartId,eName)==- 1 ) return ;   
   if ( NormalizeDouble ( ObjectGetDouble (eChartId,eName, OBJPROP_PRICE )-ePrice,eDigits)!= 0 ) ObjectSetDouble (eChartId,eName, OBJPROP_PRICE ,ePrice);
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_COLOR )!=eColor) ObjectSetInteger (eChartId,eName, OBJPROP_COLOR ,eColor);
   if ( ObjectGetString (eChartId,eName, OBJPROP_TOOLTIP )!=eTooltip) ObjectSetString (eChartId,eName, OBJPROP_TOOLTIP ,eTooltip);
   }

//перерисовываем текст по новым координатам, если его нет, то создаём
void RedrawText( long eChartId, int eWindow, string eName, datetime eTime, double ePrice, string eText, ENUM_ANCHOR_POINT eAnchor, string eFont, int eSize, color eColor, string eTooltip, int eDigits)
   {
   if ( ObjectFind (eChartId,eName)==- 1 )
      {
       if (! ObjectCreate (eChartId,eName, OBJ_TEXT ,eWindow, 0 , 0 )) return ;
       ObjectSetString (eChartId,eName, OBJPROP_FONT ,eFont);
       ObjectSetInteger (eChartId,eName, OBJPROP_FONTSIZE ,eSize);
       ObjectSetDouble (eChartId,eName, OBJPROP_ANGLE , 0.0 );
       ObjectSetInteger (eChartId,eName, OBJPROP_ANCHOR ,eAnchor);
       //на переднем  плане
       ObjectSetInteger (eChartId,eName, OBJPROP_BACK , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTABLE , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_SELECTED , false );
       ObjectSetInteger (eChartId,eName, OBJPROP_HIDDEN , true );
       ObjectSetString (eChartId,eName, OBJPROP_TOOLTIP ,eTooltip);
      }
   if ( ObjectFind (eChartId,eName)==- 1 ) return ;
   //координаты метки
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_TIME )!=eTime) ObjectSetInteger (eChartId,eName, OBJPROP_TIME ,eTime);
   if ( NormalizeDouble ( ObjectGetDouble (eChartId,eName, OBJPROP_PRICE )-ePrice,eDigits)!= 0 ) ObjectSetDouble (eChartId,eName, OBJPROP_PRICE ,ePrice);
   if ( ObjectGetInteger (eChartId,eName, OBJPROP_COLOR )!=eColor) ObjectSetInteger (eChartId,eName, OBJPROP_COLOR ,eColor);
   if ( ObjectGetString (eChartId,eName, OBJPROP_TEXT )!=eText) ObjectSetString (eChartId,eName, OBJPROP_TEXT ,eText);
   }
 

Hepiniz hoşgeldiniz !!!

İş için gitti.

Süreç tüm hızıyla devam ediyor.

 

Test edildi!

Sonuç bu.

Durdurulan test cihazı geçmişi manuel olarak gözden geçirdi. Max_D değeri buradan alınmalıdır.

 

Neyin yanlış olduğunu anlamadım. Bu düşük çizgi.

Her ihtimale karşı kodu yeni bir şekilde kopyalayın, periyodik olarak değiştirdim, eski bir sürüme sahip olabilirsiniz.

 
Valeriy Yastremskiy :

Evet, yalnızca bir tane gerekiyorsa, 6 çubuk göstergesinin tümünü sürüklemenin bir anlamı yoktur. Aşk.

Ve aynı ölçekte (TF) derinliklere inmenin bir anlamı yok. Çeyrekten sonra haftalara, sonra aylara geçebilirsiniz ve 132 ay 11 yıldır.

Genel olarak, tüm çizelgede saymanın anlamsız olduğu fikri, tarihsel verilerin miktarı esasen rastgeledir, belki 70'ten, belki de 2000'den, farklı araçlarda, farklı veri sağlayıcılar farklıdır ve mantık farklıdır. tüm durumlar için aynı olduğunda her zaman daha iyidir.

Daha kesin olmaya çalışacağım.

1. Bu bir fikir değil, otomatikleştirmeye karar verilen, çalışan ve zaten hata ayıklanmış 5 yıllık bir ticaret deneyimidir (çünkü sürekli monitörde oturmak pek iyi değildir, bilirsiniz, yıllar içinde)

2. Bu çizgiler, yanlış kesintilerin bir sinyalini oluşturur ve çalışır (sadece bunları nasıl kullanacağınızı bilmeniz gerekir) gelecekte hiç görüntülenemezler.

3. 2020'de 10 Şubat'ta ilk kez bu kadar uzak bir tarihten gereksiz olduğunu düşündüğünüz bu yanlışlığı fark ettim.

Min_D'nin nerede olduğuna ve belki yılda bir, hatta 10 yılda bir dikkat edin.(olduğu gibi)

o zaman 12000 puanlık kısa olayların gelişimini görüyorsunuz (böyle bir hareketi kaçırmak caiz değil bence) Bu durumda dizinin ötesine geçmek bu fırsatı kaçırmama izin vermedi.

Bu güne kadar bu şekilde çalışıyor.   genel olarak herhangi bir sorun yaratmadı


Pekala, şimdi devam etme ve MQL4'ü öğrenme zamanı


4. Bilgisayarın yüklenmesine veya başka bir şeye gelince (günde bir kez 24.00'da sayabilirsiniz ve Cuma 20.00'den sonra 10 kez işlem yapmayın ve hafta içi 23.00'den 3.00'e kadar), bırakın saysın.

5.   Fikir henüz TopikStarter tarafından dile getirilmedi.

Yazının ortasından değil de başından okursanız, her şey açıktır.

1. Low_D1 ve High_D1 (D1 Son gün), Min_D ve Max_D (bu, geçmişten en yakın olanı, tam olarak enstrüman için mevcut olandır) Min_D < Low_D1 ve Max_D > High_D1

2. Low_W1 ve High_W1 (ayrıca her şey yukarıda açıklananla aynıdır, yalnızca haftalarca)

3. Low_MN1 ve High_MN1 (sırasıyla bir aydır)

 

Kodda, for döngüsü // açıklamayı oku

Nasıl düzeltileceği konusunda tavsiye için geldim, belki bir şey bilmiyorum (geçmişi olan bir dosya yüklemek gibi veya dizinin kendisi desteklemiyor veya belki 16 konser aperatif yeterli değil, sorunun kendisi bu. ??? vb.)

Şu anda, hat değeri değiştirmediğinde sadece Alert olarak duruyor.

 //+------------------------------------------------------------------+
//|                                                   Test_Level.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
double    Bar_data_D1 [][ 6 ]; // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров D1
double    Low_D1_Level;       // Возвращает значение минимальной цены бара  D1
double    Min_D_Level ;       // ближайшей минимальный  D уровень
datetime   Time_Day;
int       A_C_R;             // возвращает количество скопированных баров D1
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   Level();
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
  On_Timer();
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                        Функция Level 
//+------------------------------------------------------------------+
void Level()
{
  A_C_R = ArrayCopyRates(Bar_data_D1, _Symbol , PERIOD_D1 ); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

 Low_D1_Level   = iLow ( _Symbol , PERIOD_D1 , 1 );   // Возвращает значение минимальной цены бара  D1
    
//--- Min_D_Leve  
 //for(int i = 1; i<ArrayRange(Bar_data_D1,0) ;i++) // или так то ошибки нет и линия не перерисовывается 
   for ( int i = 1 ; ;i++)                             // а так выход за массив 
    {
     Print ( " i = " ,i, " Bar_data_D1 [i][2] = " ,Bar_data_D1 [i][ 2 ]);
     if (Bar_data_D1 [i][ 2 ]>= 0 )
       {
         if ( Bar_data_D1 [i][ 2 ] < Low_D1_Level)
          {
           Min_D_Level = Bar_data_D1 [i][ 2 ]; break ;
          }
       }   
    } 

 //+-------------------------Low_D1_Level----------------------------+ 
 if ( ObjectFind ( "Low_D1" )!=Low_D1_Level) 
   {
     ObjectDelete ( "Low_D1" );
     if ( ObjectFind ( "Low_D1" )!= 0 )
      {
       ObjectCreate ( "Low_D1" , OBJ_HLINE , 0 , Time[ 0 ],Low_D1_Level);
       ObjectSet( "Low_D1" , OBJPROP_COLOR , clrMaroon );
       ObjectSet( "Low_D1" , OBJPROP_WIDTH , 1 );
      }
   } 
   
 if ( ObjectFind ( "Low_D1_label" )!=Low_D1_Level)
   {
     ObjectDelete ( "Low_D1_label" ); 
     if ( ObjectFind ( "Low_D1_label" ) != 0 )
      {
       ObjectCreate ( "Low_D1_label" , OBJ_TEXT , 0 , Time[ 13 ], Low_D1_Level);
       ObjectSetText( "Low_D1_label" , "Low_D1: " + DoubleToStr(Low_D1_Level, _Digits ), 8 , "Verdana" , Brown);
      }
   } 
   
 //+-------------------------Min_D_Level----------------------------+ 
 if ( ObjectFind ( "Min_D" )!= Min_D_Level) 
   {
     ObjectDelete ( "Min_D" );
     if ( ObjectFind ( "Min_D" )!= 0 )
      {
       ObjectCreate ( "Min_D" , OBJ_HLINE , 0 , Time[ 0 ],Min_D_Level);
       ObjectSet( "Min_D" , OBJPROP_COLOR , clrMaroon );
       ObjectSet( "Min_D" , OBJPROP_WIDTH , 1 );
      }
   } 
   
 if ( ObjectFind ( "Min_D_label" )!=Min_D_Level)
   {
     ObjectDelete ( "Min_D_label" ); 
     if ( ObjectFind ( "Min_D_label" ) != 0 )
      {
       ObjectCreate ( "Min_D_label" , OBJ_TEXT , 0 , Time[ 30 ], Min_D_Level);
       ObjectSetText( "Min_D_label" , "Min_D: " + DoubleToStr(Min_D_Level, _Digits ), 8 , "Verdana" , Brown);
      }
   }  
 
}
//+------------------------------------------------------------------+
//|        функция удаление всех объектов созданных советником
//+------------------------------------------------------------------+
void DestroyObject()
{
 int tot= ObjectsTotal ();
 for ( int i=tot; i>= 0 ; i--)
    {
     
     if ( ObjectName (i)== "Low_MN1" ){ ObjectDelete ( 0 , "Low_MN1" ); Print ( "<< Объект Low_MN удалён >>" );}
     if ( ObjectName (i)== "Low_MN1_label" ){ ObjectDelete ( 0 , "Low_MN1_label" ); Print ( "<< Объект Low_MN1_label удалён >>" );}
     

     if ( ObjectName (i)== "Min_D" ){ ObjectDelete ( 0 , "Min_D" ); Print ( "<< Объект Min_D удалён >>" );}
     if ( ObjectName (i)== "Min_D_label" ){ ObjectDelete ( 0 , "Min_D_label" ); Print ( "<< Объект Min_D_label удалён >>" );}


   }
}
//+-------------------------------------------------------------------------+   
//                         функция Timer                    
//+-------------------------------------------------------------------------+
void On_Timer()
{

     
 if (Day()!= Time_Day)
   {
    Level();
    Time_Day = Day();
   }
}
 
Aleksei Stepanenko :

Neyin yanlış olduğunu anlamadım. Bu düşük çizgi.

Her ihtimale karşı kodu yeni bir şekilde kopyalayın, periyodik olarak değiştirdim, eski bir sürüme sahip olabilirsiniz.

Tamam tekrar deneyeceğim