사용자 정의 기호. 오류, 버그, 질문, 제안. - 페이지 13

 
fxsaber :

게다가 지금이 00:00:01이면 불과 2초 전인 CustomTicksAdd를 통해 막대를 완성할 수 없습니다.

물론 작동하지 않습니다. 00:00:01에 온 눈금이 이미 다음 막대를 형성해야 하기 때문입니다. 정상적인 상황에서.

 
Slava :

테스터의 경우, 어제의 시간 전날에 대한 어제의 틱이 신선한 것, 오늘의 것입니다.

무슨 말을 하고 싶은지 이해했습니다. 6개월 전의 맞춤 눈금이 있는 운동은 테스트 특성이 뚜렷합니다. 귀하의 상황이 정상이 아닙니다(일반적인 관행의 의미에서)

관례의 비표준 사용에 관하여. 다양한 상황에서 기능을 식별하고 해결하기 위해 토론하는 것입니다.

 
Slava :

물론 작동하지 않습니다. 00:00:01에 온 눈금이 이미 다음 막대를 형성해야 하기 때문입니다. 정상적인 상황에서.

초당 타이머를 사용하여 틱을 전달하는 서비스를 상상해 보십시오(일반적으로 수식에서 하는 것처럼 더 적을 수도 있음 - 100ms). 그런 다음 자정에 막대는 종종 하루의 마지막 눈금을 잃습니다.

 

버그 16.

M1 막대가 있지만 다른 시간대는 표시되지 않습니다.


철을 재현하는 방법 - 모르겠습니다.
 
fxsaber :

버그 16.

M1 막대가 있지만 다른 시간대는 표시되지 않습니다.


철을 재현하는 방법 - 모르겠습니다.
그리고 이것들은 0이 아닌 초로 시간이 있는 막대가 아닙니까?
 
Slava :
그리고 이것들은 0이 아닌 초가 있는 시간이 있는 막대가 아닙니까?

EURUSD 및 일반 막대(분의 배수)가 있는 실제 눈금이 있습니다.

문제는 M1 이외의 모든 기간에서 안정적이었습니다. 따라서 영상은 문제 없이 녹화되었습니다.


그러나 잠시 후 문제가 재현되지 않았습니다. 기호는 이 스레드 의 고문이 만들었습니다 .

 

버그 17.

틱 기록이 완전히 사라집니다.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

#define SIZE 100

void OnStart ()
{
   MathSrand (( uint ) TimeLocal ());
   const string Name = _Symbol + ( string ) MathRand ();
  
   MqlTick Ticks[];
  PRINT( CustomSymbolCreate (Name, NULL , _Symbol )); // Создали символ.
  PRINT( SymbolSelect (Name, true )); // Поместили в Обзор рынка
  PRINT( CopyTicksRange ( _Symbol , Ticks, COPY_TICKS_INFO , D'2019.06.01' * 1000 )); // Взяли тики
  
  PRINT( ArrayResize (Ticks, SIZE));     // Оставили только SIZE-тиков
  PRINT( CustomTicksAdd (Name, Ticks)); // Пробросили их все

   MqlTick NewTicks[];
  PRINT( CopyTicksRange (Name, NewTicks)); // Взяли тики, что в истории
   
//  PRINT(CustomTicksReplace(Name, 0, LONG_MAX, NewTicks)); // И перезаписали их .

  PRINT( CopyTicksRange (Name, Ticks)); // Убедились, что тиков в истории ровно SIZE
  PRINT( CustomTicksDelete (Name, Ticks[SIZE - 1 ].time_msc - 60 * 1000 , LONG_MAX )); // Удалили последнюю минуту
  PRINT( CopyTicksRange (Name, Ticks)); // Убедились, что тиков стало меньше на удаленное количество
}


결과

 CustomSymbolCreate (Name, NULL , _Symbol ) = true
SymbolSelect (Name, true ) = true
CopyTicksRange ( _Symbol ,Ticks, COPY_TICKS_INFO , D'2019.06.01' * 1000 ) = 533797
ArrayResize (Ticks, 100 ) = 100
CustomTicksAdd (Name,Ticks) = 100
CopyTicksRange (Name,Ticks) = 100
CustomTicksDelete (Name,Ticks[ 100 - 1 ].time_msc- 60 * 1000 , LONG_MAX ) = 1
CopyTicksRange (Name,Ticks) = 0


밑줄 친 줄에서 주석을 제거하면 스크립트가 올바르게 작동합니다. 분명히 오래된 Add 틱은 Replace 틱이 가는 곳으로 가지 않습니다.

 

버그 18.

눈금을 삭제하면 마지막 막대가 손실됩니다.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   MathSrand (( uint ) TimeLocal ());
   const string Name = _Symbol + ( string ) MathRand ();
  
   MqlTick Ticks[];
  PRINT( CustomSymbolCreate (Name, NULL , _Symbol )); // Создали символ.
  PRINT( SymbolSelect (Name, true )); // Поместили в Обзор рынка
  PRINT( CopyTicks ( _Symbol , Ticks)); // Взяли тики
  
  PRINT( CustomTicksReplace (Name, 0 , LONG_MAX , Ticks)); // Записали их.
  PRINT( CustomTicksDelete (Name, Ticks[ ArraySize (Ticks) - 1 ].time_msc - 60 * 1000 , LONG_MAX )); // Удалили последнюю минуту

   MqlTick LastTick[ 1 ];
  PRINT( CopyTicks (Name, LastTick, COPY_TICKS_ALL , 0 , 1 )); // Распечатали последний тик
   ArrayPrint (LastTick);

   MqlRates LastBar[ 1 ];
  PRINT( CopyRates (Name, PERIOD_M1 , 0 , 1 , LastBar)); // Распечатали последний бар
   ArrayPrint (LastBar);
}


결과

 CustomSymbolCreate (Name, NULL , _Symbol ) = true
SymbolSelect (Name, true ) = true
CopyTicks ( _Symbol ,Ticks) = 2000
CustomTicksReplace (Name, 0 , LONG_MAX ,Ticks) = 2000
CustomTicksDelete (Name,Ticks[ ArraySize (Ticks)- 1 ].time_msc- 60 * 1000 , LONG_MAX ) = 25
CopyTicks (Name,LastTick, COPY_TICKS_ALL , 0 , 1 ) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[ 0 ] 2019.06 . 11 22 : 37 : 42 1.13284 1.13288 0.0000          0 1560292662809        6        0.00000
CopyRates (Name, PERIOD_M1 , 0 , 1 ,LastBar) = 1
                 [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
[ 0 ] 2019.06 . 11 22 : 36 : 00 1.13278 1.13284 1.13278 1.13279              13          3              0
 

버그 19.

스프레드 계산이 잘못되었습니다.

 #define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnStart ()
{
   MathSrand (( uint ) TimeLocal ());
   const string Name = _Symbol + ( string ) MathRand ();
  
  PRINT( CustomSymbolCreate (Name, NULL , _Symbol )); // Создали символ.
  PRINT( SymbolSelect (Name, true )); // Поместили в Обзор рынка
  
   MqlTick Tick[ 1 ];
  
   if ( SymbolInfoTick ( _Symbol , Tick[ 0 ])) 
  {
     // Специально задаем отрицательный спред.
    Tick[ 0 ].bid = 1.11643 ;
    Tick[ 0 ].ask = 1.11632 ;        
    
    PRINT( CustomTicksAdd (Name, Tick)); // Пробросили тик.
    PRINT( SymbolInfoInteger (Name, SYMBOL_SPREAD )); // Смотрим его спред.
    
     ArrayPrint (Tick); // Смотрим сам тик.
  }
}


결과

 CustomSymbolCreate (Name, NULL , _Symbol ) = true
SymbolSelect (Name, true ) = true
CustomTicksAdd (Name,Tick) = 1
SymbolInfoInteger (Name, SYMBOL_SPREAD ) = - 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[ 0 ] 2019.06 . 03 00 : 32 : 11 1.11643 1.11632 0.0000          0 1559521931040        6        0.00000
 

버그 20. 버그에서 제외됩니다. 솔루션은 아래 분기에서 찾을 수 있습니다.

2085
사용자 정의 기호 속성이 잘못 설정되었습니다.
결과에 변화가 있습니다.
옵션 중 하나에 따라 속성이 설정되었습니다.

 CustomSymbolSetInteger (SName, SYMBOL_FILLING_MODE , ORDER_FILLING_FOK );     Результат: Filling == None
или
CustomSymbolSetInteger (SName, SYMBOL_FILLING_MODE , ORDER_FILLING_IOC );     Результат: Filling == Fill or Kill
или
CustomSymbolSetInteger (SName, SYMBOL_FILLING_MODE , ORDER_FILLING_RETURN );  Результат: Filling == Immediate or Cancel