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

 
fxsaber :
단일 필드와 결합하는 것은 이상한 일입니다.

이것은 구조체와 동일합니다. 오류만 더 명확하게 표시됩니다. 이것은 문서에도 작성되어 있습니다. " 그렇지 않으면 , 공용체 는 구조체처럼 작동합니다. "

Union\char\char 링크도 이상하고 명확성을 위해 다음과 같이 다시 작성할 수 있습니다.

 union X3 { //(3) Error: 'X2' - struct is too large
         char x31[ INT_MAX / 2 + 1 ];
         int   x32[ INT_MAX / 8 + 1 ];
};
누군가에게 이상하게 보이지 않도록
 
Andrey Dik :

다시 생각 해봐.

앤드류를 생각해야 합니다. 귀하의 코드에 있는 바퀴벌레입니다.

글쎄, 나는 오늘 너무 의욕이 넘친다 ... 나는 올바른 방향으로 나아가려고 노력할 것이다.

새로운 막대가 열렸습니다… iBars()가 1 증가했습니다… 그러나 계산된 막대의 수는 변경되지 않았습니다. 그리고 이 새로운 막대가 다시 계산될 때까지 변경되지 않습니다...

무엇 향후 계획

 
Igor Makanu :

이것은 표시기에서 올바르게 작동하지 않아야 합니다.

내가 틀리지 않았다면 도움말에는 모든 기간 동안 데이터를 업로드하기 위한 스크립트 구문 분석이 포함되어 있으며 표시기가 작동한다는 사실 때문에 이러한 방식으로 표시기에서 기록 데이터를 요청할 수 없다는 경고가 있어야 합니다. 비동기적으로

예, BarsCalculated()는 핸들을 바인딩한 후 한 번 사용하는 것이 좋습니다.


UPD: 스와핑 기록용 스크립트 및 지표에서 작동하지 않는 이유 설명: https://www.mql5.com/ru/docs/series/timeseries_access

코드의 의미를 확실히 이해하셨나요?

 
Alexey Viktorov :

앤드류를 생각해야 합니다. 귀하의 코드에 있는 바퀴벌레입니다.

글쎄, 나는 오늘 너무 의욕이 넘친다 ... 나는 올바른 방향으로 나아가려고 노력할 것이다.

새로운 막대가 열렸습니다… iBars()가 1 증가했습니다… 그러나 계산된 막대의 수는 변경되지 않았습니다. 그리고 이 새로운 막대가 다시 계산될 때까지 변경되지 않습니다...

무엇 향후 계획

에게. 저에게 편지를 쓰지 마세요, 당신은 주제에서 벗어났습니다.

또는 코드로 증명하십시오.

 
Andrey Dik :

코드의 의미를 확실히 이해하셨나요?

높은 확률로 - 확실하고 이해

다른 표시기를 호출하기 전에 표시기에서 "높은 시간 프레임"을 동기화하려는 경우

내 표시기가 작동합니까? - 여기에 BarsCalculated()를 추가할 수도 있습니다. - 그러나 MACD.mql5와 같은 배달 지표의 예에서와 같이


추신: KB에는 다중 기간 표시기가 많이 있습니다. 무엇을 어떻게 해야 하는지 기억해야 하는 경우 일반적으로 Mladen Rakic의 표시기를 찾아 그를 봅니다. 코드 작성 스타일이 독특합니다. (또는 오히려 형식화), 하지만 확실히 100% 효율적입니다.

https://www.mql5.com/ru/users/mladen

 
Andrey Dik :

에게. 저에게 편지를 쓰지 마세요, 당신은 주제에서 벗어났습니다.

또는 코드로 증명하십시오.

그럼 화이팅...

개발자는 그런 말도 안되는 소리에 반응하지 않습니다. Igor도 곧 지루해질 것입니다 ... 그리고 자신과 계속 이야기하십시오 ...

올바른 주제를 망치지 않도록 드러머에게 별도의 주제로 유출을 이동하도록 요청하기만 하면 됩니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

안드레이 딕 , 2021.05.28 05:16

요청한 시니어 TF(M5)에서 데이터 동기화 를 확인하고 준비되지 않은 경우 표시기의 준비 상태를 확인한 다음 종료합니다.

결과적으로 표시기는 모든 눈금이 아니라 M1 막대가 열릴 때 한 번만 작동합니다.


 //проверка готовности данных и индикатора на другом TF
if ( SeriesInfoInteger ( Symbol (), tf, SERIES_SYNCHRONIZED ))
{
   if ( iBars ( Symbol (), tf) != BarsCalculated (handleFr)) return 0 ;
}
else return 0 ;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

정말 커스텀 prev calc를 사용해야 합니까? 개발자들이 내 간청에 귀를 기울이기를 바랍니다.

나는 당신의 코드를 잘 이해하지 못했습니다. "return 0;" 후에 무슨 일이 일어나야 합니까? OnCalculate에 대한 다음 호출에서?
 
Alexey Viktorov :

Igor도 곧 지루해질 것입니다 ...

난 그냥 이해하고 싶어

MT5에는 동기화에 대한 많은 함정이 있습니다. 이제 질문은 그것에 관한 것입니다.

IMHO, 표시기가 각 막대에 구조를 사용하는 경우(화살표가 아닌 선)

그런 사이클은 경제적 인 계산에 충분합니다.

 for ( int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

첫 번째 호출이 있는 경우 prev_calculated는 = 0이고 후속 호출에서 새 막대가 다시 계산됩니다.


두 표시기가 모두 올바르게 작성되면 추가로 동기화할 필요가 없으며 모든 것이 작동합니다. 남은 것은 CopyBuffer()를 호출되는 표시기의 필요한 수의 값과 비교하는 것입니다.

 
Igor Makanu :

난 그냥 이해하고 싶어

MT5에는 동기화에 대한 많은 함정이 있습니다. 이제 질문은 그것에 관한 것입니다.

IMHO, 표시기가 각 막대에 구조를 사용하는 경우(화살표가 아닌 선)

그런 사이클은 경제적 인 계산에 충분합니다.

첫 번째 호출이 있는 경우 prev_calculated는 = 0이고 후속 호출에서 새 막대가 다시 계산됩니다.


두 표시기가 모두 올바르게 작성되면 추가로 동기화할 필요가 없으며 모든 것이 작동하고 CopyBuffer()를 호출되는 표시기의 필요한 수의 값과 비교하는 것만 남아 있습니다.

그리고 나는 같은 것에 대해 이야기하고 있습니다. 처음 시작하기 전에 동기화를 시도하는 것이 좋을 것이므로 .......

 
Igor Makanu :

난 그냥 이해하고 싶어

MT5에는 동기화에 대한 많은 함정이 있습니다. 이제 질문은 그것에 관한 것입니다.

IMHO, 표시기가 각 막대에 구조를 사용하는 경우(화살표가 아닌 선)

그런 사이클은 경제적 인 계산에 충분합니다.

첫 번째 호출이 있는 경우 prev_calculated는 = 0이고 후속 호출에서 새 막대가 다시 계산됩니다.


두 표시기가 모두 올바르게 작성되면 추가로 동기화할 필요가 없으며 모든 것이 작동합니다. 남은 것은 CopyBuffer()를 호출되는 표시기의 필요한 수의 값과 비교하는 것입니다.

이해하려는 욕구가 있고 반대하지 않으려는 경우 아래와 같은 코드를 작성해야 합니다.

 #property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

#property indicator_label1    "I"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

double          IBuffer[];

int OnInit ()
{
   SetIndexBuffer    ( 0 ,IBuffer, INDICATOR_DATA );
   ArraySetAsSeries (IBuffer, true );

   return ( INIT_SUCCEEDED );
}

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 (rates_total == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,         true );

   int limit = rates_total - prev_calculated - 1 ;

   for ( int i = limit; i >= 0 ; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = ( GetMicrosecondCount () - t) / 1000000.0 ;
   Print ( DoubleToString (e, 6 ), " sec, рассчитано " , rates_total - prev_calculated, " баров, всего баров " , rates_total);
   return (rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1

//--- plot I
#property indicator_label1    "I"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

input ENUM_TIMEFRAMES   OldTF = PERIOD_M5 ;

double IBuffer[];
int     Handle = 0 ;

int OnInit ()
{
   SetIndexBuffer    ( 0 ,IBuffer, INDICATOR_DATA );
   ArraySetAsSeries (IBuffer, true );

   Handle = iCustom ( Symbol (), OldTF, "OldTF.ex5" );
   if (Handle == INVALID_HANDLE )
   {
       Print ( "Не удалось получить хендл индикатора OldTF.ex5" );
       return INIT_FAILED ;
   }

   return INIT_SUCCEEDED ;
}

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 (rates_total == prev_calculated) return rates_total;

   if ( SeriesInfoInteger ( Symbol (), OldTF, SERIES_SYNCHRONIZED ))
   {
       if ( iBars ( Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return 0;
      }
   }
   else 
   {
     Print ( "Период " , OldTF, " не синхронизирован." );
     return 0 ;
   }

   ulong t = GetMicrosecondCount ();

   ArraySetAsSeries (high, true );
   ArraySetAsSeries (time, true );

   int limit = rates_total - prev_calculated - 1 ;

   double buff [];
   int ind = 0 ;
   for ( int i = limit; i >= 0 ; i--)
   {
      ind = iBarShift ( Symbol (), OldTF, time [i], false );
       if ( CopyBuffer (Handle, 0 , ind, 1 , buff) != - 1 )
      {
        IBuffer [i] = buff [ 0 ];
      }
       else
      {
         Print ( "Ошибка копирования буфера " , GetLastError ());
         return 0 ;
      }
   }

   //----------------------------------------------------------------
   double e = ( GetMicrosecondCount () - t) / 1000000.0 ;
   Print ( DoubleToString (e, 6 ), " sec, расcчитано " , rates_total - prev_calculated, " баров, всего баров " , rates_total);
   return (rates_total);
}

두 코드를 모두 컴파일하고 두 번째 코드를 실행합니다. M1 및 M3에서 이전 표시기를 실행할 때 로그에 다음과 같이 표시됩니다.

2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234초, 50000바 계산, 총 50000바

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452초, 50023바 계산, 총 50023바

2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001초, 계산된 1개 막대, 총 50001개 막대

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180초, 50024바 계산, 총 50024바

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004초, 1개 막대 계산, 총 50025개 막대

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014초, 1개 막대 계산, 총 50026개 막대

2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.000000초, 계산된 1개 막대, 총 50002개 막대

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898초, 50027바 계산, 총 50027바

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004초, 1개 막대 계산, 총 50028개 막대

육안으로도 먼저 빠른 지표를 구축하기 위한 가장 빠른 옵션을 알 수 있고, 두 번째로 사전 계산이 0으로 재설정된다는 것을 알 수 있습니다.

요청하지 않은 경우 최적화하는 동안 성능이 크게 비합리적으로 저하됩니다. 이 예에서 표시기는 각각의 새로운 M3 막대에서 완전히 다시 계산되어야 합니다. 동기화하지 않으면 표시기를 만들 때 구멍이 생깁니다.

알렉세이 빅토로프 :

그럼 화이팅...

개발자는 그런 말도 안되는 소리에 반응하지 않습니다. Igor도 곧 지루해질 것입니다 ... 그리고 자신과 계속 이야기하십시오 ...

올바른 주제를 망치지 않도록 드러머에게 별도의 주제로 유출을 이동하도록 요청하기만 하면 됩니다.

위의 코드를 보고 여권을 먹고 머리에 재를 뿌리고 아무도 볼 수 없는 곳에 오만함을 밀어 넣으십시오.

사유: