오류, 버그, 질문 - 페이지 885

 

나는 새로운 설명을 사용했음을 이해합니다 - 이전 설명

SYMBOL_FILLING_FOK
SYMBOL_FILLING_IOC
설명에는 없지만 편집자는 여전히 강조 표시합니다.
 
AndreyS : 상황을 분석하는 데 도움을 요청합니다. 다음 코드:

 

이 기능을 사용할 때 "2012.11.28 09:58:32 4194304 bytes not available" 오류가 발생합니다. 이해를 돕기 위해 페이징 파일을 10GB로 늘렸습니다.

그리고 로그 파일이 실수로 경고로 막히지 않습니까?
 

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

확인해보니 로그가 10kB 더 있었는데,

"MemoryException 09:36:12 4194304 bytes not available" 오류가 자주 반복됩니다.

주의(이전 코드에서):

// 배열에서 인덱스로 기간 선택 (PERIOD_M5(인덱스 - 5)부터 PERIOD_D1(인덱스 - 19)까지)

열거에 더 적은 기간을 사용하는 경우(예: PERIOD_M5 - PERIOD_M6) 오류가 없습니다.

 
AndreyS : 주목(이전 코드에서):

// 배열에서 인덱스로 기간 선택 (PERIOD_M5(인덱스 - 5)부터 PERIOD_D1(인덱스 - 19)까지)

1. 어떤 유형의 배열에 대해 이야기하고 있습니까?

2. 인덱스 아래의 이 배열에는 어떤 값이 포함되어 있습니까(예: 19)?

 
ОYedelkin :

1. 어떤 유형의 배열에 대해 이야기하고 있습니까?

2. 인덱스 아래의 이 배열에는 어떤 값이 포함되어 있습니까(예: 19)?

이렇게 하는 것이 더 쉽다고 생각합니다. 기능은 별도의 전문가로 작성했으니 직접 실행하고 확인할 수 있습니다.

시간이 있고 돕고 싶은 마음이 있다면. (같은 오류)

중복 코드:

 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 ); 
        }
        
      }
    }
  }
}

파일이 첨부되어 있습니다. 테스터 옵션(경우에 따라)

EURUSD.e

H1

OHLC

2012.1.1 - 2012.4.1

파일:
111.mq5  3 kb
 

질문을 업데이트하고 두 가지 오류에 관심이 있습니다.

1. 2012.11.28 11:45:18 4194304 바이트를 사용할 수 없음

아직 결정할 수는 없지만 m_period = PERIOD_INDEX[iperiod] 기간 동안 반복하는 대신 PERIOD_H1 과 같이 설정 하면 오류가 발생하지 않습니다.

하지만 모든 기간이 필요합니다.

2. 2012.11.28 11:45:49 2012.01.01 00:00:00 경고: CopyBuffer 오류 - 오류 번호: 4806

이 오류를 해결하기 위해 Sleep(1000);의 주석을 제거하면 사라지고 버퍼의 데이터가 정상적으로 복사됩니다.

질문: 왜 그래? 추가 시간 손실을 피하기 위해 Sleep(1000) 없이 어떻게든 할 수 있습니까?

 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 ]);
        }
        
      }
    }
  }
}
파일:
222.mq5  3 kb
 
AndreyS :

불행히도 테스터는 가까이에 없습니다.

작은 것들. 당신의 라인에서

m_period = PERIOD_INDEX[iperiod];

왼쪽은 int 유형의 변수이고 , 오른쪽은 ENUM_TIMEFRAMES 유형의 값입니다. 다섯 번째 줄에 ' ENUM_TIMEFRAMES m_period;'를 즉시 선언하지 않는 이유는 무엇입니까? ?

2. 동일한 표시기가 상당히 짧은 시간에 호출되는 3중 중첩 루프가 있습니다. 한 캐릭터에 대해 약 1400건의 호출이 있습니다. 사용된 표시기는 단순히 메모리를 확보할 시간이 없습니다. IndicatorRelease() 함수에 대한 주제에 대한 포럼을 검색하십시오. 코드에서 이 기능을 사용하는 것 자체가 이미 실수라고 말한 적이 있습니다.

코드에서 표시기의 빠른 변경은 또한 오류 4806의 모양을 설명합니다. 새 표시기는 단순히 필요한 데이터를 로드할 시간이 없습니다.

 

비정상 종료 를 제거하는 방법을 알려주십시오.

EA가 작동을 멈추고 이것은 로그에서만 볼 수 있으며 색상은 차트에서 녹색입니다.

 
G001 : 비정상 종료 를 제거하는 방법을 알려주십시오.
이유는 다를 수 있지만 가장 유명한 것은 배열의 한계를 넘어 0으로 나누는 것입니다.
 

귀하의 의견에 따라 코드를 변경했습니다.

(fixed m_period = PERIOD_INDEX[iperiod]; 이 경우 오류는 중요하지 않지만 감사합니다. 수정했습니다.)

 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 ]);
        }
        
      }
    }
  }
}

오류가 있는 질문(CopyBuffer 오류 - 오류 번호: 4806) - 제거하고 절전 지연( 1000 )으로 치료합니다. - 지표가 만들어질 시간이 없기 때문이라고 본다.

오류(4194304바이트를 사용할 수 없음) 문제가 남아 있습니다.

IndicatorRelease() 에 대한 참고 사항 - 처리 중에 고려됩니다.

생각이 있는 사람이 있으면 공유해 주세요. 감사합니다.