CopyTicksRange()가 MQL5.a에서 올바르게 작동하지 않습니다. - 페이지 3

 
fxsaber # :

단위.

그럴 수도 있겠지만 이것은 여전히 기본적인 기능이고, 단말 자체에서 최소한 데이터를 내보내는 용도로 사용한다면 단말에 대한 신뢰도 훼손됩니다.

 

첨부 파일의 약속된 오류 예. 놀랍게도 Err_SymbolInfoTick2()는 잠시 동안 올바르게 작동했지만 0 날짜도 반환했습니다. 코드에 설명 주석이 있습니다.

잡지:

 2021.09 . 19 06 : 01 : 24.674 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicksRange()------------
2021.09 . 19 06 : 01 : 24.754 ErrorCopyTicks (CustomBR,H1)     CopyTicksRange ('@BR',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 2021.01 . 31 23 : 59 : 00 : 000 );  received 109425 ticks
2021.09 . 19 06 : 01 : 24.754 ErrorCopyTicks (CustomBR,H1)     2021.01 . 29 00 : 02 : 14 : 782 - first tick, 2021.01 . 29 23 : 56 : 43 : 863 - last tick
2021.09 . 19 06 : 01 : 24.754 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09 . 19 06 : 01 : 24.754 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09 . 19 06 : 01 : 24.767 ErrorCopyTicks (CustomBR,H1)     CopyTicks ('@BR',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 100 );  received 100 ticks
2021.09 . 19 06 : 01 : 24.767 ErrorCopyTicks (CustomBR,H1)     2021.01 . 29 00 : 02 : 14 : 782 - first tick, 2021.01 . 29 10 : 00 : 12 : 292 - last tick
2021.09 . 19 06 : 01 : 24.767 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09 . 19 06 : 01 : 24.767 ErrorCopyTicks (CustomBR,H1)    ---------Err_CopyTicks()------------
2021.09 . 19 06 : 01 : 24.906 ErrorCopyTicks (CustomBR,H1)     CopyTicks ('@BR',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 1000000 );  received 1000000 ticks
2021.09 . 19 06 : 01 : 24.906 ErrorCopyTicks (CustomBR,H1)     2021.01 . 29 00 : 02 : 14 : 782 - first tick, 2021.02 . 08 14 : 17 : 58 : 484 - last tick
2021.09 . 19 06 : 01 : 24.906 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09 . 19 06 : 01 : 24.906 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09 . 19 06 : 01 : 24.969 ErrorCopyTicks (CustomBR,H1)     CopyTicksRange ('CustomBR',Ticks, COPY_TICKS_ALL , 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 );  received 189530 ticks
2021.09 . 19 06 : 01 : 24.969 ErrorCopyTicks (CustomBR,H1)     2021.09 . 17 00 : 02 : 12 : 052 - first tick, 2021.09 . 17 19 : 59 : 59 : 782 - last tick
2021.09 . 19 06 : 01 : 25.029 ErrorCopyTicks (CustomBR,H1)     CustomTicksReplace ('CustomBR', 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 , Ticks, 189530   );  replaced 189530 ticks
2021.09 . 19 06 : 01 : 25.029 ErrorCopyTicks (CustomBR,H1)    ret= 1 , mt.time_msc= 1970.01 . 01 00 : 00 : 00 : 000
2021.09 . 19 06 : 01 : 25.029 ErrorCopyTicks (CustomBR,H1)    ---------------------
2021.09 . 19 06 : 01 : 25.029 ErrorCopyTicks (CustomBR,H1)    ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09 . 19 06 : 01 : 25.091 ErrorCopyTicks (CustomBR,H1)     CopyTicksRange ('CustomBR',Ticks, COPY_TICKS_ALL , 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 );  received 189530 ticks
2021.09 . 19 06 : 01 : 25.091 ErrorCopyTicks (CustomBR,H1)     2021.09 . 17 00 : 02 : 12 : 052 - first tick, 2021.09 . 17 19 : 59 : 59 : 782 - last tick
2021.09 . 19 06 : 01 : 25.153 ErrorCopyTicks (CustomBR,H1)     CustomTicksAdd ('CustomBR',Ticks, 189530   );  added 189530 ticks
2021.09 . 19 06 : 01 : 25.153 ErrorCopyTicks (CustomBR,H1)    ret= 1 , mt.time_msc= 1970.01 . 01 00 : 00 : 00 : 000
2021.09 . 19 06 : 01 : 25.153 ErrorCopyTicks (CustomBR,H1)    ---------------------


간식으로 즐기기: 단말기로 진드기를 관찰하면 기록된 것보다 더 많은 진드기를 얻을 수 있습니다. (그림 참조). 그리고 "이전" 날짜를 2021.09.18로 줄이면 더 적은 수가 기록됩니다.

파일:
untitled.jpg  605 kb
 
예, 정적 배열 또는 동적이 역할을 하지 않습니다.
 
RusPro # :

약속된 오류 예

불행히도, 재생산하기 위해 이러한 캐릭터에 액세스할 수 없습니다.

 
fxsaber # :

불행히도, 재생산하기 위해 이러한 캐릭터에 액세스할 수 없습니다.

마이엑스입니다. 알겠습니다. 외환에서 찾아보겠습니다.

 
RusPro # :

마이엑스입니다. 알겠습니다. 외환에서 찾아보겠습니다.

1. MICEX에는 "@BR"이라는 기호가 없습니다.

맞춤 기호를 사용 중인 것 같습니다.

그리고 생성시 오류가 있을 수 있습니다.

원래 MICEX 기호에서 CopyTicks 및 CopyTicksRange 기능을 많이 사용합니다. 오류를 발견하지 못했습니다.

2. 전체 틱 이력이 단말기에 저장되지 않으며, 첫 번째 함수 호출은 요청된 전체 기간 동안 틱을 반환하지 않을 수 있습니다.

추가됨

다음은 CopyTicksRange 함수를 사용하여 틱을 로드하는 표시기 예입니다.

 //+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2021 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021 prostotrader"
#property link        " https://www.mql5.com "
#property version    "1.00"
#property indicator_separate_window
#property indicator_plots    1
#property indicator_buffers 1

enum IND_STAGE
{
  LOAD_TICKS = 0 ,
  READ_TICKS = 1 ,
  FILL_DATA = 2
};
struct T_DATA
{
   datetime bar_time;
   int ticks_cnt;
   MqlTick pr_bar_ticks[];
};
struct MARKET_DATA
{
   int time_cnt;
   int cnt;
  IND_STAGE stage;
  T_DATA t_data[];
   MqlTick ticks[];
   int live_cnt;
   int a_cnt;
   datetime time_array[];
};
MARKET_DATA m_data;
datetime start_time, end_time;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   end_time = datetime ( SymbolInfoInteger ( Symbol (), SYMBOL_EXPIRATION_TIME ));
   m_data.stage = LOAD_TICKS;
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator Load ticks function                             |
//+------------------------------------------------------------------+
bool LoadTicks( const datetime &a_times[])
{
   int bars = Bars ( Symbol (), PERIOD_M1 );
   datetime cur_time = TimeTradeServer ();
   if (cur_time > end_time)
  {
    cur_time = end_time;
  }
   int result = CopyTime ( Symbol (), PERIOD_M1 , 0 , bars, m_data.time_array);
   if (result > 0 )
  {
    start_time = m_data.time_array[ 0 ];
     if (m_data.time_array[result - 1 ] == a_times[ ArraySize (a_times) - 1 ])
    {
      m_data.time_cnt = result;
      result = CopyTicksRange ( Symbol (), m_data.ticks, COPY_TICKS_INFO , ulong (start_time) * 1000 , ulong (cur_time) * 1000 );
       if (result > 0 )
      {
         if (m_data.ticks[result- 1 ].time >= m_data.time_array[m_data.time_cnt - 1 ]) 
        {
          m_data.cnt = result;
           return ( true ); 
        } else Print ( __FUNCTION__ , ": Не хватает тиков " , Symbol (), "!" ); 
      } else Print ( __FUNCTION__ , ": Не получены тики по символу " , Symbol (), "!" );
    } else Print ( __FUNCTION__ , ": Не хватает баров по символу " , Symbol (), "!" );
  } else Print ( __FUNCTION__ , ": Не скопировано время баров по символу " , Symbol (), "!" );
   return ( false );
}  
//+------------------------------------------------------------------+
//| 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[] )
  {
   switch (m_data.stage)
  {
     case LOAD_TICKS:
       if (LoadTicks(time) == true )
      {
         Print ( "All ticks loaded." );
        m_data.stage = READ_TICKS;
         return (rates_total);
      }
       return ( 0 );
     break ;
     case READ_TICKS:
     break ;
  }
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
모든 것이 잘 로드되지만 항상 처음은 아닙니다.
 
prostotrader # :

1. MICEX에는 "@BR"이라는 기호가 없습니다.

다음은 CopyTicksRange 함수를 사용하여 틱을 로드하는 표시기 예입니다.

모든 것이 잘 로드되지만 항상 처음은 아닙니다.

이것은 석유 선물의 붙여 넣기입니다. 브로커 BCS. 브로커마다 다르게 호출할 수 있습니다. 그러나 정확히 동일한 문제가 다른 기호에서도 발생합니다.

 
prostotrader # :

귀하의 예에서는 호출 조건이 다르기 때문에 작동합니다. 시작 시간은 항상 기존 막대의 시작 부분과 동일하고(즉, 확실히 눈금이 있음) 마지막 막대의 전체 눈금 기록을 한 번에 읽습니다.

그건 그렇고, 내 목발 중 하나는 당신의 목발처럼 작동합니다. 또한 기존 막대의 시간을 먼저 얻은 다음 최대 연속 섹션으로 나누고 눈금을 얻습니다. 그러나 또 다른 문제가 발생합니다. 데이터에 대한 수신 어레이가 충분하지 않은 경우 나머지를 재개하는 것은 탬버린과 함께 춤을 추는 것입니다(위에서 논의됨).

그리고 동적 배열로 작업하는 것은 훨씬 느리고 가능한 메모리 조각화를 고려해야 합니다.

 
prostotrader # :

2. 전체 틱 이력이 단말기에 저장되지 않으며, 첫 번째 함수 호출은 요청된 전체 기간 동안 틱을 반환하지 않을 수 있습니다.

전체 기간이 반환되지 않는 문제는 없으며 요청한 기간이 아닌 다른 기간이 반환될 때 문제입니다. 또는 더 나쁜 것은 요청된 틱과 범위에 포함되지 않은 다른 틱의 추가가 모두 반환되는 경우입니다.


내 예에서 나는 기호를 "SILV-12.21"로 교체했는데 같은 오류가 발생했고 궁금한 점은 SymbolInfoTick이 마지막 테스트에서 정답을 반환했다는 것입니다 :) 거짓말일 때와 그렇지 않을 때 추측하는 방법?


2021.09.19 15:27:55.089	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicksRange()------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 2021.01.31 23:59:00:000 );  received 1758 ticks
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 23:49:01:540 - last tick
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.090	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 100 );  received 100 ticks
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.01.29 11:02:44:891 - last tick
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.091	ErrorCopyTicks (CustomBR,H1)	---------Err_CopyTicks()------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	CopyTicks('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.01.29 23:57:00:000, 1000000 );  received 763140 ticks
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	2021.01.29 00:02:14:782 - first tick, 2021.09.17 23:58:41:031 - last tick
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.170	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick1('CustomBR')------------
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.178	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	CustomTicksReplace('CustomBR',2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000, Ticks, 42793  );  replaced 42793 ticks
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=1970.01.01 00:00:00:000
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------------------
2021.09.19 15:27:55.190	ErrorCopyTicks (CustomBR,H1)	---------Err_SymbolInfoTick2('CustomBR')------------
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	CopyTicksRange('SILV-12.21',Ticks,COPY_TICKS_ALL, 2021.09.17 00:00:00:000, 2021.09.17 20:00:00:000 );  received 42793 ticks
2021.09.19 15:27:55.196	ErrorCopyTicks (CustomBR,H1)	2021.09.17 00:03:04:576 - first tick, 2021.09.17 19:59:32:398 - last tick
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	CustomTicksAdd('CustomBR',Ticks, 42793  );  added 42793 ticks
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	ret=1, mt.time_msc=2021.09.17 19:59:32:398
2021.09.19 15:27:55.210	ErrorCopyTicks (CustomBR,H1)	--------------------- 

 
fxsaber # :

К сожалению, нет доступа к этим символам, чтобы воспроизвести.


Forex에서도 같은 실수를 합니다. 브로커 Alpari, 테스트 계정. EURUSD 기호


사용자 정의 기호는 EURUSD를 기반으로 하며 이름도 남겼습니다.


 2021.09 . 19 15 : 36 : 52.417 tester (EURUSD,H1)      ---------Err_CopyTicksRange()------------
2021.09 . 19 15 : 36 : 52.432 tester (EURUSD,H1)       CopyTicksRange ('EURUSD',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 2021.01 . 31 23 : 59 : 00 : 000 );  received 102934 ticks
2021.09 . 19 15 : 36 : 52.432 tester (EURUSD,H1)       2021.01 . 29 00 : 00 : 00 : 139 - first tick, 2021.01 . 29 23 : 54 : 59 : 930 - last tick
2021.09 . 19 15 : 36 : 52.432 tester (EURUSD,H1)      ---------------------
2021.09 . 19 15 : 36 : 52.432 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09 . 19 15 : 36 : 52.445 tester (EURUSD,H1)       CopyTicks ('EURUSD',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 100 );  received 100 ticks
2021.09 . 19 15 : 36 : 52.445 tester (EURUSD,H1)       2021.01 . 29 00 : 00 : 00 : 139 - first tick, 2021.01 . 29 00 : 12 : 52 : 513 - last tick
2021.09 . 19 15 : 36 : 52.445 tester (EURUSD,H1)      ---------------------
2021.09 . 19 15 : 36 : 52.445 tester (EURUSD,H1)      ---------Err_CopyTicks()------------
2021.09 . 19 15 : 36 : 52.577 tester (EURUSD,H1)       CopyTicks ('EURUSD',Ticks, COPY_TICKS_ALL , 2021.01 . 29 23 : 57 : 00 : 000 , 1000000 );  received 1000000 ticks
2021.09 . 19 15 : 36 : 52.577 tester (EURUSD,H1)       2021.01 . 29 00 : 00 : 00 : 139 - first tick, 2021.02 . 15 18 : 31 : 34 : 723 - last tick
2021.09 . 19 15 : 36 : 52.577 tester (EURUSD,H1)      ---------------------
2021.09 . 19 15 : 36 : 52.577 tester (EURUSD,H1)      ---------Err_SymbolInfoTick1('CustomBR')------------
2021.09 . 19 15 : 36 : 52.579 tester (EURUSD,H1)       CopyTicksRange ('EURUSD',Ticks, COPY_TICKS_ALL , 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 );  received 78831 ticks
2021.09 . 19 15 : 36 : 52.579 tester (EURUSD,H1)       2021.09 . 17 00 : 00 : 00 : 349 - first tick, 2021.09 . 17 19 : 59 : 59 : 088 - last tick
2021.09 . 19 15 : 36 : 52.645 tester (EURUSD,H1)       CustomTicksReplace ('CustomBR', 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 , Ticks, 78831   );  replaced 78831 ticks
2021.09 . 19 15 : 36 : 52.645 tester (EURUSD,H1)      ret= 1 , mt.time_msc= 1970.01 . 01 00 : 00 : 00 : 000
2021.09 . 19 15 : 36 : 52.645 tester (EURUSD,H1)      ---------------------
2021.09 . 19 15 : 36 : 52.645 tester (EURUSD,H1)      ---------Err_SymbolInfoTick2('CustomBR')------------
2021.09 . 19 15 : 36 : 52.658 tester (EURUSD,H1)       CopyTicksRange ('EURUSD',Ticks, COPY_TICKS_ALL , 2021.09 . 17 00 : 00 : 00 : 000 , 2021.09 . 17 20 : 00 : 00 : 000 );  received 78831 ticks
2021.09 . 19 15 : 36 : 52.658 tester (EURUSD,H1)       2021.09 . 17 00 : 00 : 00 : 349 - first tick, 2021.09 . 17 19 : 59 : 59 : 088 - last tick
2021.09 . 19 15 : 36 : 52.686 tester (EURUSD,H1)       CustomTicksAdd ('CustomBR',Ticks, 78831   );  added 78831 ticks
2021.09 . 19 15 : 36 : 52.686 tester (EURUSD,H1)      ret= 1 , mt.time_msc= 2021.09 . 17 19 : 59 : 59 : 088