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

 
Slava :

현재로서는 오늘이 아닌(어제, 어제, 작년 등) 요일의 눈금으로 사용자 지정 악기의 막대를 형성할 수 없습니다.

하지만. 수정했습니다.

CustomTicksReplace를 사용할 때(CustomTicksAdd가 아님! CustomTicksAdd를 사용하여 틱을 대량 추가하지 않음) 이전에 오늘에 대한 틱이 없었다면 추가된 틱의 마지막 날이 "현재"가 됩니다.

다음 빌드를 기다리십시오. 그런 다음 실험과 토론을 계속할 것입니다.

저는 Build 2177을 사용하고 있습니다. 마지막 것 같아요.

하지만 CUSTOMSYMBOL로 작업할 수 없습니다. 나에게 도움이 될 빌드를 언제 예상할 수 있는지 알려주실 수 있습니까?

빌드 변경 사항은 어디에서 볼 수 있나요?

 

연결된 표시기는 현재 빌드 2177에서 작동합니다.

이것은 당신의 지표입니다. 수정되었지만 알고리즘은 동일하게 유지됩니다. MQL5\Include\Includes에 Symbol.mqh 파일을 배치했습니다.

라인 변경

 #include   <Includes\ Symbol .mqh>

Symbol.mqh가 사용되도록

막대가 형성되고 있습니다. 틱은 MarketWatch뿐만 아니라 기록에도 올바르게 적용됩니다.


파일:
 
Slava :

연결된 표시기는 현재 빌드 2177에서 작동합니다.

이것은 당신의 지표입니다. 수정되었지만 알고리즘은 동일하게 유지됩니다. MQL5\Include\Includes에 Symbol.mqh 파일을 배치했습니다.

라인 변경

Symbol.mqh가 사용되도록

막대가 형성되고 있습니다. 틱은 MarketWatch뿐만 아니라 기록에도 올바르게 적용됩니다.


내가 확인 할게요. 내 코드에 문제가 있을 수 있습니다. 하지만 코드는 좋아 보입니다.

 

버그 25.

틱이 사용자 지정 기호 에 쓰여지면 비정규화됩니다!

 sinput datetime inDateFrom = D'2019.12.01' ;

// Проверка нормализации числа.
bool IsNorm( const double Price )
{
   return ( NormalizeDouble (Price, _Digits ) == Price);
}

#define TOSTRING(A) #A + " = " + DoubleToString (A, 16 ) + " "
#define PRINT(A) Print (TOSTRING(A) + TOSTRING( NormalizeDouble (A, _Digits )))
#define ISNORM(A) if (!IsNorm(A)) { PRINT(A); Count++; };

// Распечатка ненормализованных цен тиков.
void CheckNorm( const MqlTick &Ticks[], const int MaxAmount = 10 )
{  
   const int Size = ArraySize (Ticks);
  
   for ( int i = 0 , Count  = 0 ; (i < Size) && (Count < MaxAmount); i++)
  {
    ISNORM(Ticks[i].bid)
    ISNORM(Ticks[i].ask)
    ISNORM(Ticks[i].last)
  }
}

// Нормализация цен тика.
void Normalize( MqlTick &Tick, const int digits )
{
  Tick.bid = :: NormalizeDouble (Tick.bid, digits);
  Tick.ask = :: NormalizeDouble (Tick.ask,  digits);
  Tick.last = :: NormalizeDouble (Tick.last, digits);
}

// Нормализация цен тиков.
void Normalize( MqlTick &Ticks[], const int digits )
{
   for ( int i = ArraySize (Ticks) - 1 ; i >= 0 ; i--)
    Normalize(Ticks[i], digits);
}

void OnStart ()
{
   const string Name = "TEMP12345" ;                                                           // Имя кастомного символа
   const string SymbOrig = "EURUSD" ;                                                           // Имя оригинального символа

   MqlTick Ticks[];
  
   const int Size = CopyTicksRange (SymbOrig, Ticks, COPY_TICKS_ALL , ( long )inDateFrom * 1000 ); // Считали EURUSD-тики.
    
   if ((Size > 0 ) && CustomSymbolCreate (Name, NULL , SymbOrig) && SymbolSelect (Name, true ))     // Создали символ на основе EURUSD.
  {
     const int digits = ( int ) SymbolInfoInteger (Name, SYMBOL_DIGITS );
    
    Normalize(Ticks, digits);                                                                 // Нормализовали цены тиков.
    
     Print ( "Check1" );
    CheckNorm(Ticks);                                                                         // Проверили, что цены тиков нормализованы.
    
     CustomTicksReplace (Name, 0 , LONG_MAX , Ticks);                                             // Поместили в него историю EURUSD.        

     MqlTick NewTicks[];
    
     CopyTicksRange (Name, NewTicks, COPY_TICKS_ALL , ( long )inDateFrom * 1000 );                 // Считали тики из кастомного символа
    
     Print ( "Check2" );
    CheckNorm(NewTicks);                                                                     // Проверили, что цены тиков нормализованы.
  }
}


결과

 Check1
Check2
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1024100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1024099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 
Ticks[i].bid = 1.1023100000000001 NormalizeDouble (Ticks[i].bid, _Digits ) = 1.1023099999999999 


터미널 내부에는 표준과 다른 일종의 NormalizeDouble이 있는 것 같습니다. 이 버그는 많은 알고리즘의 작업에 눈에 띄지 않게 영향을 줄 수 있습니다.


수정하세요. 정상화된 가격을 기록해야 하는 자연스러운 필요성은 충족될 수 없습니다.

 
fxsaber :

버그 25.

틱이 사용자 지정 기호에 쓰여지면 비정규화됩니다!

결과

터미널 내부에는 표준과 다른 일종의 NormalizeDouble이 있는 것 같습니다. 이 버그는 많은 알고리즘의 작업에 눈에 띄지 않게 영향을 줄 수 있습니다.

수정하세요. 정상화된 가격을 기록해야 하는 자연스러운 필요성은 충족될 수 없습니다.

오버로드된 정규화 기능이 있습니다.
함수의 이름을 변경해 보십시오.
아마도 이것 때문에 올바른 정규화가 날아갑니다.

 
fxsaber :

버그 25.

틱이 사용자 지정 기호에 쓰여지면 비정규화됩니다!


결과


터미널 내부에는 표준과 다른 일종의 NormalizeDouble이 있는 것 같습니다. 이 버그는 많은 알고리즘의 작업에 눈에 띄지 않게 영향을 줄 수 있습니다.


수정하세요. 정상화된 가격을 기록해야 하는 자연스러운 필요성은 충족될 수 없습니다.

두 경우 모두 소수점 이하 자릿수 로 정규화한 결과입니다.

절대 평등을 위해 여전히 실수를 비교하고 있습니까?

원본 틱의 출처는 무엇입니까?

 
Roman :

오버로드된 정규화 기능이 있습니다.
함수의 이름을 변경해 보십시오.
아마도 이것 때문에 올바른 정규화가 날아갑니다.

코드에는 정규화의 정확성에 대한 테스트가 포함되어 있습니다. 틱이 사용자 지정 기호 에 기록되기 전에 이 테스트는 성공적으로 통과합니다. 코드를 확인했습니다.

 
Slava :

두 경우 모두 소수점 이하 자릿수 로 정규화한 결과입니다.

절대 평등을 위해 여전히 실수를 비교하고 있습니까?

원본 틱의 소스는 어느 서버입니까?

MQ-베타 서버. 하지만 이 상황에서 서버는 전혀 관련이 없습니다. 내가 무엇을 합니까?

  1. 틱 배열을 정규화하고 이것이 사실인지 확인합니다.
  2. 커스텀 심볼에 씁니다.
  3. 사용자 지정 기호에서 기록된 틱을 읽습니다.
  4. 정규화를 확인합니다. 정규화되지 않았습니다.
저것들. 녹음을 위해 몇 개의 틱을 보냈지만 완전히 다른 틱이 등록되었습니다.
 
아마도 터미널의 비상 종료로 인해 꼬리가 bases\Custom 폴더에 남아 있을 것입니다.
 
fxsaber :

버그 25.

2280 - 수정되었습니다. 감사합니다.