mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 33

 
Artyom Trishkin :

선택 항목 은 0을 반환할 수 있습니다. BCS가 충돌했습니다.

그래, 비뚤어진 브로커. 그들은 여전히 거기에 음수를 채울 것입니다.

브로커가 기호를 설정할 때 개발자가 각 매개 변수에 대해 가능한 값의 범위에 제한이 있으면 좋을 것입니다.

 
Artyom Trishkin :

정확히 무엇이 잘못 되었습니까? 그것은 들린 질문이었습니다. 기본이 아닌 시간 프레임에서 지표 데이터를 가져오기 위해 내가 무엇을 잘못하고 있습니까?

예: 표시기는 M1에서 시작되고 AO의 데이터는 M5에서 수신되어야 합니다. 따라서 한계>1(이력을 다시 계산해야 함)이 있는 동안 M5가 있는 AO는 데이터 부족 오류와 함께 0을 반환합니다. 전체 기록이 계산되자마자(limit==0) M5가 있는 AO의 데이터가 도착하기 시작합니다.

우선 다음과 같이 입력할 필요가 없습니다.

periodForWork=PeriodForWork;

처음에는 변수에 자체 값을 할당한다고 생각했습니다.

더 나아가:

size_ao= CopyBuffer (handle_ao, 0 , 0 ,count,array_ao);

초기화 중에는 복사할 필요가 없습니다. 초기화는 그렇지 않습니다. 또한 OnInit()의 요청 시 아직 계산되지 않은 이전 TF의 데이터를 요청할 때 이 레코드는 의미가 없습니다.

 ArraySetAsSeries (BufferAO, true );

하지만 이 항목은 초기화 단계에서 한 번만 만들면 됩니다.

더 나아가... 음... 주관적으로 말하면 제가 잘못했을 것입니다.

나는 프로그램을 다음과 같이 나누는 것을 좋아합니다.

1. 최초 출시(이력 분석)

2. 후속 출시:

2.1. 모든 틱;

2.2. 형성된 바;

저것들:

 if ( prev_calculated > 0 )             // Не первый запуск
{
 if ( rates_total <= prev_calculated ) // Новый бар не сформирован
  {
  }
 else                                  // Новый бар сформирован
  {
  }
}
else                                    // Первый запуск
{
}

그리고 그 후에야 계산의 주요주기 (기능).

복사 기능은 정보가 아닌 오류를 제공합니다. 그것은 단지 코드입니다 - 실제로는 아닙니다.

시니어 TF의 데이터 동기화 확인이 없습니다.

그리고 여기서 가장 중요한 것은 순서를 이해하는 것입니다. 처음 시작할 때 이전 기간의 데이터만 요청하고 복사가 어떻게 발생하는지 파악하도록 테스트 표시기를 만드는 것이 좋습니다. 저것들. 코드 시작 부분에서 이것을 제거하십시오.

 ArraySetAsSeries (array_ao, true );

배열의 첫 번째와 마지막 요소를 출력합니다. 그런 다음 필요한 경우에만 인덱싱 방향을 변경하십시오.

 
일반적으로 다음과 같이 시작합니다.
 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input    ENUM_TIMEFRAMES inpTimeframe= PERIOD_M5 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int _handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
   _handle= iAO ( _Symbol ,inpTimeframe);
   if (_handle== INVALID_HANDLE )
     {
       Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), "! Хэндл индикатора iAO ТФ " + EnumToString (inpTimeframe)+ " не получен!" );
       return ( INIT_FAILED );
     }
//---
   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[])
  {
//--- Массив-приемник значений индикатора
   double ao[];
//---
   if (prev_calculated> 0 )
     {

     }
   else                                          // Если первый запуск
     {
       //--- Количество просчитанных баров старшего ТФ
       int bars;
       if (( bars= BarsCalculated (_handle))< 0 || !( bool ) SeriesInfoInteger ( _Symbol ,inpTimeframe, SERIES_SYNCHRONIZED ))
         return ( 0 );
       //--- 
       int num= CopyBuffer (_handle, 0 , 0 ,bars,ao);
       //---
       if (num< 0 )
        {
         Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": Запрашиваемая таймсерия еще не построена!" );
         return ( 0 );
        }
       else if (num!=bars)
        {
         Print ( __FUNCTION__ , ": ОШИБКА #" , GetLastError (), ": Скопированы не все данные (" ,num, " из " ,bars, ")" );
         return ( 0 );
        }
       //---
       Print ( __FUNCTION__ , ": Успех! Скопировано " ,num, " из " ,bars, " значение индикатора АО ТФ " + EnumToString (inpTimeframe));
     }
//---
   return ( rates_total );
  }
//+------------------------------------------------------------------+
 
알렉세이 코지친 :

우선 다음과 같이 입력할 필요가 없습니다.

처음에는 변수에 자체 값을 할당한다고 생각했습니다.

더 나아가:

초기화 중에는 복사할 필요가 없습니다. 초기화는 그렇지 않습니다. 또한 OnInit()의 요청 시 아직 계산되지 않은 이전 TF의 데이터를 요청할 때 이 레코드는 의미가 없습니다.

하지만 이 항목은 초기화 단계에서 한 번만 만들면 됩니다.

더 나아가... 음... 주관적으로 말하면 제가 잘못했을 것입니다.

나는 프로그램을 다음과 같이 나누는 것을 좋아합니다.

1. 최초 출시(이력 분석)

2. 후속 출시:

2.1. 모든 틱;

2.2. 형성된 바;

저것들:

그리고 그 후에야 계산의 주요주기 (기능).

복사 기능은 정보가 아닌 오류를 제공합니다. 그것은 단지 코드입니다 - 실제로는 아닙니다.

시니어 TF의 데이터 동기화 확인이 없습니다.

그리고 여기서 가장 중요한 것은 순서를 이해하는 것입니다. 처음 시작할 때 이전 기간의 데이터만 요청하고 복사가 어떻게 발생하는지 파악하도록 테스트 표시기를 만드는 것이 좋습니다. 저것들. 코드 시작 부분에서 이것을 제거하십시오.

배열의 첫 번째와 마지막 요소를 출력합니다. 그런 다음 필요한 경우에만 인덱싱 방향을 변경하십시오.

나는 한 눈에 이해할 수 있도록 변수를 만든다. 당신은 이해하지 못합니다 - 당신이 이해할 수 있도록 만드십시오;)

나는 항상 소문자로 비전역 변수를 쓰기 시작합니다. 이유는 간단합니다. 대소문자를 구분하는 지능 ...

이것은 테스트 코드가 아니기 때문에 충분히 크며 tf를 전환할 때 MT4로 날아가고 데이터 누락 오류가 없습니다. 모든 것이 항상 있습니다. MT5에서는 tf를 전환할 때 30분 동안만 기록을 로드하고 소유하지 않은 tf의 데이터와 함께 작동하지 않습니다. 즉, 부재에 대해 말합니다.

그것이 내가 무엇을 잘못하고 있는지 토론을 위해 제기한 이유입니다. 인터넷에서 사용된 모든 TF에 대한 데이터를 요청해야 하는 것으로 나타났습니다. 예상 사용 TF 개수를 미리 알 수 없다면 모두 요청해야 한다고 생각합니다. 30분 동안 하나만 계산됩니다. 그 중 21개만...

또 내가 생각하지 않는 것?

 
Artyom Trishkin :

MT5에서는 tf를 전환할 때 30분 동안만 기록을 로드합니다.


그것에 대해 썼다

я правильно понимаю тогда, что подготовив кэш,терминал при последующих обращениях (начиная со 2 обращения) затрачивает на порядки меньше времени?

можно ли как-то уменьшить время первого обращения после перезагрузки терминала,чтобы было как в МТ 4 ?
Теперь выводы:

    Разница только в скорости начальной инициализации кеша чарта 0.6 мс МТ 4 против 113 мс у МТ 5

자세한 내용은 여기

https://www.mql5.com/en/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

그것은 그리고 될 것입니다. 더 많은 TF 또는 문자가 요청될수록 더 많은 브레이크 시동이 걸립니다.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus :


그것에 대해 썼다

자세한 내용은 여기

https://www.mql5.com/en/forum/1111/page1871#comment_4866969

https://www.mql5.com/ru/forum/1111/page1871#comment_4867939

그것은 그리고 될 것입니다. 더 많은 TF 또는 문자가 요청될수록 더 많은 브레이크 시동이 걸립니다.

예, 표시기의 첫 번째 시작에만 있으면 좋을 것입니다. 현재로서는 시간대를 전환할 때마다 30분 동안 기록이 로드됩니다. 나는 이런 일이 일어나서는 안된다는 것을 이해하지만... 내가 뭔가 잘못하거나 뭔가를 하고 있습니다... 그리고 하나의 지표는 이것입니다 - 내가 비원시적 시간대에 접근하려고 시도하는 것입니다.
 
Artyom Trishkin :
예, 표시기의 첫 번째 시작에만 있으면 좋을 것입니다. 현재로서는 시간대를 전환할 때마다 30분 동안 기록이 로드됩니다. 나는 이런 일이 일어나서는 안된다는 것을 이해하지만... 내가 뭔가 잘못하거나 뭔가를 하고 있습니다... 그리고 하나의 지표는 이것입니다 - 내가 비원시적 시간대에 접근하려고 시도하는 것입니다.

글쎄, 다른 TF에서 데이터를 복사하는 속도를 측정하고 병목 현상이 어디에 있는지 확인하십시오.
 
Artyom Trishkin :

계산을 위해 다른 시간대의 여러 지표를 사용해야 하는 경우 각 시간대의 핸들을 가져와야 합니다.

모든 것을 더 빠르게 계산하려면 터미널에서 기록 크기를 줄이십시오.

내 테스트 지표를 실행했습니까? 데이터가 수집되고 있습니까?

 
알렉세이 코지친 :

계산을 위해 다른 시간대의 여러 지표를 사용해야 하는 경우 각 시간대의 핸들을 가져와야 합니다.

모든 것을 더 빠르게 계산하려면 터미널에서 기록 크기를 줄이십시오.

내 테스트 지표를 실행했습니까? 데이터가 수집되고 있습니까?

아니요, 아직 출시되지 않았습니다.

모든 시간 프레임이 필요한 경우 AO 표시기의 21개 핸들을 생성해야 하는 것으로 나타났습니다. 낭비 아닌가요?

 
Artyom Trishkin :

아니요, 아직 출시되지 않았습니다.

모든 시간 프레임이 필요한 경우 AO 표시기의 21개 핸들을 생성해야 하는 것으로 나타났습니다. 낭비 아닌가요?

그리고 원하는 캐릭터 / TF에서 데이터를 얻는 다른 방법은 무엇입니까? CopyBuffer 는 핸들에서만 작동합니다.