Hatalar, hatalar, sorular - sayfa 269

 
AndrNuda :
Sen nasıl bir frensin :) Fals fals değil ama her şey çalışıyor. Oraya bakma. :)))) Doğru bir fonksiyon var.
Akıllı?
 
BoraBo :

Büküm, büküm, ArrayIsSeries(High)'in neden her zaman yanlış olduğunu anlamak istiyorum

Bu işlevin yardımında şöyle yazıyor ( https://www.mql5.com/en/docs/array/arrayisseries )

Geri dönüş değeri

Denetlenen dizi bir zaman dizisi dizisiyse true , aksi takdirde false döndürür. OnCalculate() işlevine parametre olarak iletilen diziler, ArrayGetAsSeries() işlevi tarafından dizi öğelerine erişim sırası için denetlenmelidir.

Sizin bildirdiğiniz dizi bir zaman dizisi değildir ve hiçbir koşulda dizi olamaz. Zaman serisi, çalışma zamanı sistemi tarafından, örneğin OnCalculate() işlevinde önceden tanımlanmış dizilerdir:

 int OnCalculate ( const int rates_total,       // размер входных таймсерий
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const datetime & time[],     // Time
                 const double & open[],       // Open
                 const double & high[],       // High
                 const double & low[],         // Low
                 const double & close[],       // Close
                 const long & tick_volume[],   // Tick Volume
                 const long & volume[],       // Real Volume
                 const int & spread[]         // Spread
   )
Документация по MQL5: Операции с массивами / ArrayIsSeries
Документация по MQL5: Операции с массивами / ArrayIsSeries
  • www.mql5.com
Операции с массивами / ArrayIsSeries - Документация по MQL5
 
Rosh :

Bu işlevin yardımında şöyle yazıyor ( https://www.mql5.com/en/docs/array/arrayisseries )

Sizin tarafınızdan bildirilen dizi bir zaman dizisi değildir ve hiçbir koşulda bir dizi olamaz. Zaman serisi, çalışma zamanı sistemi tarafından, örneğin OnCalculate() işlevinde önceden tanımlanmış dizilerdir:

ArrayGetAsSeries düzgün çalışmıyor.
 
AlexSTAL :
ArrayGetAsSeries düzgün çalışmıyor.
ArrayGetAsSeries işlevi yalnızca dizin oluşturma yönünü değiştirir, ancak bir diziyi zaman dizisine dönüştürmez. Bu işlevle ne elde etmeye çalışıyorsunuz?
 
Rosh :
Zaman serisi, çalışma zamanı sistemi tarafından, örneğin OnCalculate() işlevinde önceden tanımlanmış dizilerdir:
 int OnCalculate ( const int rates_total,       // размер входных таймсерий
                 const int prev_calculated,   // обработано баров на предыдущем вызове
                 const datetime & time[],     // Time
                 const double & open[],       // Open
                 const double & high[],       // High
                 const double & low[],         // Low
                 const double & close[],       // Close
                 const long & tick_volume[],   // Tick Volume
                 const long & volume[],       // Real Volume
                 const int & spread[]         // Spread
   )


Ama buna ne dersin, yardımda yazıyor:

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().

 
joo :

Ama buna ne dersin, yardımda yazıyor:


Bu göstergeyi çalıştırın ve her şeyi kendiniz göreceksiniz:

 //+------------------------------------------------------------------+
//|                                           CheckArrayIsSeries.mq5 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1   "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- indicator buffers
double          Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Label1Buffer, INDICATOR_DATA );
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void checkArray( const double & array[])
  {
   if ( ArrayGetAsSeries (array))
     {
       Print ( "array can use as timeseria" );
     }
     else
     {
       Print ( "array can not use as timeseria!!!" );
     }
     
  }
//+------------------------------------------------------------------+
//| 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 ( ArrayIsSeries (open))
     {
       Print ( "open[] is timeseria" );
      checkArray(open);
     }
   else
     {
        {
         Print ( "open[] is timeseria!!!" );
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Rosh :
ArrayGetAsSeries işlevi yalnızca dizin oluşturma yönünü değiştirir, ancak bir diziyi zaman dizisine dönüştürmez. Bu işlevle ne elde etmeye çalışıyorsunuz?

Bu fonksiyon yönü kontrol eder, tersine çevirmez.

1) Başlatma olmadan

 double Buf[];
void OnStart ()
  {
   ArrayResize (Buf, 3 );

   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print ( "Установка в true прошла: " , ArraySetAsSeries (Buf, true));     // Установка в true прошла: true
   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на прямой порядок
   Print ( "Установка в false прошла: " , ArraySetAsSeries (Buf, false));   // Установка в false прошла: true
   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf));             // ArrayGetAsSeries(Buf): false
  }

2) Başlatma ile

 double Buf[];
void OnStart ()
  {
   ArrayResize (Buf, 3 );
   Buf[ 0 ] = 0 ; Buf[ 1 ] = 1 ; Buf[ 2 ] = 2 ;

   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf));             // ArrayGetAsSeries(Buf): false
   
   // Меняем направление на обратный порядок
   Print ( "Установка в true прошла: " , ArraySetAsSeries (Buf, true));     // Установка в true прошла: true
   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf), " [" , Buf[ 0 ], "," , Buf[ 1 ], "," , Buf[ 2 ], "]" ); // ArrayGetAsSeries(Buf): true [2,1,0]
   
   // Меняем направление на прямой порядок
   Print ( "Установка в false прошла: " , ArraySetAsSeries (Buf, false));   // Установка в false прошла: true
   Print ( "ArrayGetAsSeries(Buf): " , ArrayGetAsSeries (Buf), " [" , Buf[ 0 ], "," , Buf[ 1 ], "," , Buf[ 2 ], "]" ); // ArrayGetAsSeries(Buf): false [0,1,2]
  }

3) Yukarıdaki kod, yalnızca ArrayGetAsSeries dizisinin indeksleme yönünü alma işleviyle

 double High[];
#include <Indicators\TimeSeries.mqh>
void OnStart ()
  {
   Print ( "ArrayGetAsSeries(High) " , ArrayGetAsSeries (High));                   // ArrayGetAsSeries(High) false

   CiHigh z;

   int count= 3 ;
   if (z.Create( _Symbol , _Period )==true)
     {
       if (z.GetData( 0 ,count,High)==count)
        {
         for ( int i= 0 ; i<count; i++) Print (i, "=" ,High[i]);
         Print ( "ArraySetAsSeries(High,true) " , ArraySetAsSeries (High,true));   // ArraySetAsSeries(High,true) true
         Print ( "ArrayGetAsSeries(High) true = " , ArrayGetAsSeries (High));       // ArrayGetAsSeries(High) true = false
         for ( int i= 0 ; i<count; i++) Print (i, "=" ,High[i]);
         Print ( "ArraySetAsSeries(High,false) " , ArraySetAsSeries (High,false)); // ArraySetAsSeries(High,false) true
         Print ( "ArrayGetAsSeries(High) false = " , ArrayGetAsSeries (High));     // ArrayGetAsSeries(High) false = false
         for ( int i= 0 ; i<count; i++) Print (i, "=" ,High[i]);
        }
       else
         Print ( "Не удалось получить " ,count, " данных таймсерии." );
     }
   else Print ( "Ошибка создания таймсерии." );
   Print ( "ArrayGetAsSeries(High) " , ArrayGetAsSeries (High));                   // ArrayGetAsSeries(High) false
   Print ( "GetLastError() " , GetLastError ());
  }
Servis masasında, fonksiyonun adıyla bir hata yaptım, sadece


 
Rosh :

Bu göstergeyi çalıştırın ve kendiniz görün:

Bu temiz. Ve sorum hatalardan kaynaklanmıyordu, her şey yardımda yazıldığı gibi çalışıyor:

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий . Нужное направление индексации можно установить функцией ArraySetAsSeries().


Soru, yardım metnindeki renk ve koyu renk ile söyledikleriniz arasındaki tutarsızlık nedeniyle ortaya çıktı:

Roş :
Zaman serisi, çalışma zamanı sistemi tarafından, örneğin OnCalculate() işlevinde önceden tanımlanmış dizilerdir:

Bu nedenle, OnCalculate() içinde şunu yapıyorum:

     //--------------------------------------
     if (ArrayGetAsSeries(time)!= true )
      ArraySetAsSeries(time, true );
     if (ArrayGetAsSeries(open)!= true )
      ArraySetAsSeries(open, true );
     if (ArrayGetAsSeries(high)!= true )
      ArraySetAsSeries(high, true );
     if (ArrayGetAsSeries(low)!= true )
      ArraySetAsSeries(low, true );
     if (ArrayGetAsSeries(close)!= true )
      ArraySetAsSeries(close, true );
     //--------------------------------------
 
Rosh :

Bu işlevin yardımında şöyle yazıyor ( https://www.mql5.com/en/docs/array/arrayisseries )

Sizin tarafınızdan bildirilen dizi bir zaman dizisi değildir ve hiçbir koşulda bir dizi olamaz. Zaman serisi, çalışma zamanı sistemi tarafından, örneğin OnCalculate() işlevinde önceden tanımlanmış dizilerdir:

Kontrol, göstergede de çalışmıyor.

 //+------------------------------------------------------------------+
//|                                                    ind_proba.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping

//---
   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 count= 3 ;
   int i= 0 ;
   int limit;
//   bool printCom;

   if (prev_calculated> 0 )
     {
      limit= 1 ;
     }
   else
     {
       Print ( "rates_total  " ,rates_total, "  prev_calculated  " ,prev_calculated);
       for (i= 0 ; i<count; i++) Print (i, "=" ,open[i]);
       Print ( "ArraySetAsSeries(open,true) " , ArraySetAsSeries (open,true));
       Print ( "ArrayIsSeries(open) true = " , ArrayIsSeries (open));
       Print ( "ArrayGetAsSeries(open) true = " , ArrayGetAsSeries (open));
       for (i= 0 ; i<count; i++) Print (i, "=" ,open[i]);
       Print ( "ArraySetAsSeries(open,false) " , ArraySetAsSeries (open,false));
       Print ( "ArrayIsSeries(open) false = " , ArrayIsSeries (open));
       Print ( "ArrayGetAsSeries(open) false = " , ArrayGetAsSeries (open));
       for (i= 0 ; i<count; i++) Print (i, "=" ,open[i]);
     }
   Print ( "GetLastError() " , GetLastError ());
//--- return value of prev_calculated for next call

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

Yine de, bir şey çalışmayı durdurdu prev_calculated, sürekli 0 :

 

Evet, bu işlevlerle kendilerinin çözeceklerini düşünüyorum.


Ama unutulmaması dileğiyle - editörde, üç veya kaç karakter yazdıktan sonra sorulduğunda, listenin ilk satırında dururken yukarıya bastığınızda liste kaldırılmaz. Stüdyoda olduğu gibi sadece alışkanlık, stüdyoda olduğu gibi yapmazsanız birçoğunun "sinirli" olacağını düşünüyorum. BENİM NACİZANE FİKRİME GÖRE.