Hatalar, hatalar, sorular - sayfa 885

 

Yeni tanımı kullandığımı anlıyorum - eskileri

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
Açıklamada yoktur, ancak yine de editör tarafından vurgulanır
 
AndreyS : Durumu analiz etmek için yardım istiyorum, aşağıdaki kod:

 

Bu işlevi kullanırken, "2012.11.28 09:58:32 4194304 bayt kullanılamıyor" hatası oluşuyor, anlamama yardımcı olun, disk belleği dosyasını 10 GB'a yükseltti.

Ve günlük dosyası yanlışlıkla uyarılarla tıkanmıyor mu?
 

Yedelkin :
А лог-файл случайно алёртами не забивается?

Kontrol ettim, günlük 10 kB, daha fazlası oldu,

"MemoryException 09:36:12 4194304 bayt kullanılamıyor" hatası, sık sık tekrarlanıyor.

Fark edildi (önceki kodda):

// Diziden indekse göre bir nokta seçme (PERIOD_M5'ten (indeks - 5) PERIOD_D1'e (indeks - 19))

numaralandırma için daha az süre alırsanız (örneğin, PERIOD_M5 - PERIOD_M6), hata olmaz.

 
AndreyS : (önceki koddan):

// Diziden indekse göre bir nokta seçme (PERIOD_M5'ten (indeks - 5) PERIOD_D1'e (indeks - 19))

1. Ne tür bir diziden bahsediyoruz?

2. Dizinin altındaki bu dizide hangi değer var, örneğin 19?

 
ОYedelkin :

1. Ne tür bir diziden bahsediyoruz?

2. Dizinin altındaki bu dizide hangi değer var, örneğin 19?

Bence bunu yapmak daha kolay, işlevi ayrı bir uzman olarak yazdım, çalıştırıp kendiniz görebilirsiniz.

Yardım etmek için zamanınız ve arzunuz varsa. (aynı hata)

Yinelenen kod:

 int m_handle = 0 ;
int m_count_symbols = 0 ;
string m_name_symbols[ 1000 ];
string m_strategy_symbol;
int m_period;
double m_valuesa[];
void OnInit ()
{
   ENUM_TIMEFRAMES PERIOD_INDEX [ 22 ] = { PERIOD_CURRENT ,
                                       PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 ,
                                       PERIOD_M30 , PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 ,
                                       PERIOD_MN1 };
  m_count_symbols = 1 ;
  m_name_symbols[ 0 ] = _Symbol ;
  
   // Проверка всех вариантов в циклах
   for ( int isymb= 1 ; isymb<=m_count_symbols; isymb++)
  {
     for ( int iperiod= 5 ; iperiod<= 19 ; iperiod++)
    {  
       for ( int iperiodma= 1 ; iperiodma<= 100 ; iperiodma++)
      {  
      
         // Выбор символа (m_strategy_symbol) из масива используемых символов (m_name_symbols[]) количаством (m_count_symbols)
        m_strategy_symbol = m_name_symbols[isymb];
  
         // Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))
        m_period = PERIOD_INDEX[iperiod];
  
         // Освобождаю дескриптор загруженого ранее индикатора
         IndicatorRelease (m_handle);
         // Создаю новый индикатор с периодом - (int)(MathRound(Colony[3][chromos]*100)+1) = от 1 до 100
        m_handle= iMA (m_strategy_symbol,( ENUM_TIMEFRAMES )m_period,iperiodma, 0 , MODE_EMA , PRICE_CLOSE );
      
         // Без использования Sleep(1000); - генерируется последующа ошибка при использовании в коде ф-ции: CopyBuffer
         // "ошибка доступа к историческим даным", хоть дескриптор и создан!?!?!?
         Sleep ( 1000 );
         if (m_handle< 0 )
        {
           Alert ( "Ошибка при создании индикатора MA - номер ошибки: " , GetLastError (), " " ,m_strategy_symbol, " " ,m_period);
        } else
        {
           // Аналитический процес
           // В место процесса, обычныое чтение даных индикатора
           CopyBuffer (m_handle, 0 , 0 , 1 ,m_valuesa);
           ArraySetAsSeries (m_valuesa, true ); 
        }
        
      }
    }
  }
}

Dosya Eklenmiş. Test cihazı seçenekleri (her ihtimale karşı)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

Dosyalar:
111.mq5  3 kb
 

Soruyu güncelliyorum, iki hatayla ilgileniyorum:

1. 2012.11.28 11:45:18 4194304 bayt mevcut değil

Henüz karar veremiyorum, ancak m_period = PERIOD_INDEX[iperiod] periyotlarını yinelemek yerine, örneğin PERIOD_H1 olarak ayarlayın, o zaman hata olmayacak,

ama tüm dönemlere ihtiyacım var.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 Uyarı: CopyBuffer hatası - hata numarası: 4806

Bu hatayı çözmek için Sleep(1000); yorumunu kaldırın, ardından kaybolur ve arabellekteki veriler normal şekilde kopyalanır.

soru: neden peki? Ek zaman kayıplarını önlemek için Sleep(1000) olmadan bir şekilde yapmak mümkün müdür?

 int m_handle = 0 ;
int m_count_symbols = 0 ;
string m_name_symbols[ 1000 ];
string m_strategy_symbol;
int m_period;
double m_valuesa[];
MqlRates m_rates[];
void OnInit ()
{
   ENUM_TIMEFRAMES PERIOD_INDEX [ 22 ] = { PERIOD_CURRENT ,
                                       PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 ,
                                       PERIOD_M30 , PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 ,
                                       PERIOD_MN1 };
  m_count_symbols = 1 ;
  m_name_symbols[ 0 ] = _Symbol ;
  
   // Проверка всех вариантов в циклах
   for ( int isymb= 1 ; isymb<=m_count_symbols; isymb++)
  {
     for ( int iperiod= 5 ; iperiod<= 19 ; iperiod++)
    {  
       for ( int iperiodma= 1 ; iperiodma<= 100 ; iperiodma++)
      {  
      
         // Выбор символа (m_strategy_symbol) из масива используемых символов (m_name_symbols[]) количаством (m_count_symbols)
        m_strategy_symbol = m_name_symbols[isymb];
  
         // Выбор периода из масива по индексу (от PERIOD_M5 (индекс - 5) до PERIOD_D1 (индекс - 19))
        m_period = PERIOD_INDEX[iperiod];
  
         // Освобождаю дескриптор загруженого ранее индикатора
         IndicatorRelease (m_handle);
         // Создаю новый индикатор с периодом - (int)(MathRound(Colony[3][chromos]*100)+1) = от 1 до 100
        m_handle= iMA (m_strategy_symbol,( ENUM_TIMEFRAMES )m_period,iperiodma, 0 , MODE_EMA , PRICE_CLOSE );
      
         // Без использования Sleep(1000); - генерируется последующа ошибка при использовании в коде ф-ции: CopyBuffer
         // "ошибка доступа к историческим даным", хоть дескриптор и создан!?!?!?
         //Sleep(1000);
         if (m_handle< 0 )
        {
           Alert ( "Ошибка при создании индикатора MA - номер ошибки: " , GetLastError (), " " ,m_strategy_symbol, " " ,m_period);
        } else
        {
           // Аналитический процес
           // В место процесса, обычныое чтение даных индикатора
           double p_close;
           if ( CopyRates (m_strategy_symbol,( ENUM_TIMEFRAMES )m_period, 0 , 1 ,m_rates) < 0 )
          {
             Alert ( "Ошибка CopyRates - номер ошибки: " , GetLastError ());
          }

          p_close=m_rates[ 0 ].close;   // цена закрытия предыдущего бара          
           if ( CopyBuffer (m_handle, 0 , 0 , 1 ,m_valuesa) < 0 )
          {
             Alert ( "Ошибка CopyBuffer - номер ошибки: " , GetLastError ());
          }
           ArraySetAsSeries (m_valuesa, true ); 
           bool buy_condition_1=(p_close>m_valuesa[ 0 ]);
           bool sell_condition_1=(p_close<m_valuesa[ 0 ]);
        }
        
      }
    }
  }
}
Dosyalar:
222.mq5  3 kb
 
AndreyS :

Ne yazık ki, test cihazı elinizin altında değil.

Küçük şeyler. senin hattında

m_period = PERIOD_INDEX[iperiod];

solda int türünde bir değişken, sağda ENUM_TIMEFRAMES türünde bir değer. Beşinci satırda neden hemen ' ENUM_TIMEFRAMES m_period;' beyan etmiyorsunuz? ?

2. Aynı göstergenin oldukça kısa bir sürede çağrıldığı üçlü iç içe döngünüz var. Sadece bir karakter için yaklaşık 1400 çağrı var. Kullanılmış göstergelerin hafızayı boşaltmak için zamanı yoktur. GöstergeRelease() işleviyle ilgili konular için forumda arama yapın. Bir keresinde, bu işlevin kodda kullanılmasının zaten bir hata olduğu söylenmişti.

Koddaki göstergelerin hızlı değişimi, 4806 hatasının görünümünü de açıklar. Yeni göstergenin ihtiyaç duyduğu verileri yüklemek için zamanı yoktur.

 

Anormal fesihten nasıl kurtulacağımı söyle?

EA çalışmayı durdurur ve bu yalnızca günlükte görülebilir, grafikte renk yeşildir.

 
G001 : Anormal fesihten nasıl kurtulacağımı söyle ?
Sebepler farklı olabilir sonuçta.En ünlüleri dizinin sınırlarını aşan sıfıra bölmedir.
 

Yorumlarınıza göre kodu değiştirdi:

(sabit m_period = PERIOD_INDEX[iperiod];, bu durumda hata önemli değil - ama teşekkürler, düzeltildi)

 int m_handle = 0 ;
int m_count_symbols = 0 ;
string m_name_symbols[ 1000 ];
string m_strategy_symbol;
ENUM_TIMEFRAMES m_period;
double m_valuesa[];
MqlRates m_rates[];
void OnInit ()
{
   ENUM_TIMEFRAMES PERIOD_INDEX [ 22 ] = { PERIOD_CURRENT ,
                                       PERIOD_M1 , PERIOD_M2 , PERIOD_M3 , PERIOD_M4 , PERIOD_M5 , PERIOD_M6 , PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 ,
                                       PERIOD_M30 , PERIOD_H1 , PERIOD_H2 , PERIOD_H3 , PERIOD_H4 , PERIOD_H6 , PERIOD_H8 , PERIOD_H12 , PERIOD_D1 , PERIOD_W1 ,
                                       PERIOD_MN1 };
  m_count_symbols = 1 ;
  m_name_symbols[ 0 ] = _Symbol ;
  
   // Проверка всех вариантов в циклах
   for ( int isymb= 1 ; isymb<=m_count_symbols; isymb++)
  {
     for ( int iperiod= 5 ; iperiod<= 19 ; iperiod++)
    {  
       for ( int iperiodma= 1 ; iperiodma<= 100 ; iperiodma++)
      {  
      
         // Выбор символа по индексу isymb
        m_strategy_symbol = m_name_symbols[isymb];
  
         // Выбор периода из масива по индексу iperiod
        m_period = PERIOD_INDEX[iperiod];
  
         // Освобождаю дескриптор загруженого ранее индикатора
         IndicatorRelease (m_handle);
         // Создаю новый индикатор с периодом - iperiodma
        m_handle= iMA (m_strategy_symbol,m_period,iperiodma, 0 , MODE_EMA , PRICE_CLOSE );
         // Задержка, для того чтобы индикатор успел создатся, иначе ошибка 4806 при последующем использовании CopyBuffer 
         Sleep ( 1000 );
         if (m_handle< 0 )
        {
           Alert ( "Ошибка при создании индикатора MA - номер ошибки: " , GetLastError (), " " ,m_strategy_symbol, " " ,m_period);
        } else
        {
           // Аналитический процес
           // В место процесса, обычныое чтение даных индикатора
           double p_close;
           if ( CopyRates (m_strategy_symbol,m_period, 0 , 1 ,m_rates) < 0 )
          {
             Alert ( "Ошибка CopyRates - номер ошибки: " , GetLastError ());
          }
          p_close=m_rates[ 0 ].close;   // цена закрытия предыдущего бара          
           if ( CopyBuffer (m_handle, 0 , 0 , 1 ,m_valuesa) < 0 )
          {
             Alert ( "Ошибка CopyBuffer - номер ошибки: " , GetLastError ());
          }
           ArraySetAsSeries (m_valuesa, true ); 
           bool buy_condition_1=(p_close>m_valuesa[ 0 ]);
           bool sell_condition_1=(p_close<m_valuesa[ 0 ]);
        }
        
      }
    }
  }
}

hata içeren bir soru (CopyBuffer hatası - hata numarası: 4806) - Kaldırırım, Uyku gecikmesi ile düzeltirim ( 1000 ); - Bunu, göstergenin oluşturulacak zamanı olmamasına bağlıyorum.

Hata (4194304 bayt mevcut değil) ile ilgili sorun devam ediyor.

GöstergeRelease() hakkında bir not - işleme sırasında dikkate alınır.

Fikri olan varsa lütfen paylaşsın, teşekkürler.