'CopyTicks' 테스트 - 페이지 14

 
Rashid Umarov :

예를 들어

조금 리메이크

 string GetTickFlag( uint tickflag )
{
   string flag = "" ;

#define TICKFLAG_MACRO(A) flag += (( bool )(tickflag & TICK_FLAG_ ##A)) ? " TICK_FLAG_" + #A : "" ;
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

   if (flag == "" )
    flag = "FLAG_UNKNOWN" ;
     
   return (flag);
}

결과

 2016.09 . 14 13 : 52 : 33.925 Test (Si- 9.16 ,M1)       Tick23: time = 2016.09 . 13 18 : 52 : 35.505 bid = 0.0 ask = 0.0 last = 65253.0 volume = 35    TICK_FLAG_BID TICK_FLAG_ASK

두 가격 모두 0이 아닌 값에서 0으로 변경됩니다. 그리고 0 이후에는 다시 0이 아닌 것들이 있습니다.

 
fxsaber :

표시기는 CopyTicks가 마지막 틱을 반환하지 않을 수 있음을 보여줍니다.

여전히 더 흥미로운

 string GetTickFlag( uint tickflag )
{
   string flag = "" ;

#define TICKFLAG_MACRO(A) flag += (( bool )(tickflag & TICK_FLAG_ ##A)) ? " TICK_FLAG_" + #A : "" ;
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

   if (flag == "" )
    flag = " FLAG_UNKNOWN (" + ( string )tickflag + ")" ;
     
   return (flag);
}

#define TOSTRING(A) " " + #A + " = " + ( string )Tick.A

string TickToString( const MqlTick &Tick )
{
   static int i = 0 ;
  
  i++;
  
   return ( "Tick" + ( string )i + ":" + TOSTRING(time) + "." + ( string )(Tick.time_msc % 1000 ) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

bool MySymbolInfoTick( const string Symb, MqlTick &Tick, const uint Type = COPY_TICKS_ALL )
{
   MqlTick Ticks[];
   const int Amount = :: CopyTicks (Symb, Ticks, Type, 0 , 1 );
   const bool Res = (Amount > 0 );
  
   if (Res)
    Tick = Ticks[Amount - 1 ];
  
   return (Res);
}

#define INDICATOR // Переключение между индикатором и экспертом

#ifdef INDICATOR
   #define NAME "Indicator: "

   #property indicator_chart_window
   #property indicator_buffers 0
   #property indicator_plots    0

   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[] )
#else
   #define NAME "Expert: "

   void OnTick ( void )
#endif
{
   MqlTick Tick1, Tick2;
  
   if ( SymbolInfoTick ( _Symbol , Tick1) && MySymbolInfoTick( _Symbol , Tick2))
     if (Tick1.time_msc != Tick2.time_msc)
       Print (NAME + ((Tick1.time_msc > Tick2.time_msc) ? "EventTime > CopyTicks_Time" : "EventTime < CopyTicks_Time" ) +
             "\nFrom Event: " + TickToString(Tick1) + "\nFrom CopyTicks: " + TickToString(Tick2) + "\n" );

#ifdef INDICATOR 
   return (rates_total);
#endif
}
결과
 2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      From CopyTicks : Tick16: time = 2016.09 . 14 14 : 25 : 06.62 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      From Event: Tick15: time = 2016.09 . 14 14 : 25 : 06.68 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      Indicator: EventTime > CopyTicks_Time
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      From CopyTicks : Tick14: time = 2016.09 . 14 14 : 25 : 06.62 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      From Event: Tick13: time = 2016.09 . 14 14 : 25 : 06.68 bid = 65013.0 ask = 65015.0 last = 65014.0 volume = 1 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL
2016.09 . 14 14 : 25 : 24.533 Test2 (Si- 9.16 ,M1)      Indicator: EventTime > CopyTicks_Time
2016.09 . 14 14 : 25 : 18.974 Test2 (Si- 9.16 ,M1)      
2016.09 . 14 14 : 25 : 18.974 Test2 (Si- 9.16 ,M1)      From CopyTicks : Tick12: time = 2016.09 . 14 14 : 25 : 00.519 bid = 65011.0 ask = 65012.0 last = 65012.0 volume = 8 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_BUY
2016.09 . 14 14 : 25 : 18.974 Test2 (Si- 9.16 ,M1)      From Event: Tick11: time = 2016.09 . 14 14 : 25 : 00.510 bid = 65011.0 ask = 65012.0 last = 65012.0 volume = 8 FLAG_UNKNOWN ( 0 )
2016.09 . 14 14 : 25 : 18.974 Test2 (Si- 9.16 ,M1)      Indicator: EventTime < CopyTicks_Time

CopyTicks는 이벤트 틱보다 뒤처지고 앞서갈 수 있습니다. 이벤트 틱에는 종종 null 플래그가 있습니다.

PS 도움말에서 MqlTick 플래그를 플래그 s 로 수정합니다.

 

다른 사람들이 CopyTicks를 사용하는 방법 - 저는 절대 모릅니다. 불행히도 신뢰가 없습니다. 매우 습합니다.

조언자

 #include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

void OnTick ( void )
{
   static MqlTick PrevTick;  
   static int Amount = 0 ;
  
   MqlTick Ticks[];
  
   if (Amount > 0 )
  {
    Amount = CopyTicks ( _Symbol , Ticks, COPY_TICKS_ALL , PrevTick.time_msc);
    
     int i;
    
     for (i = 0 ; i < Amount; i++)
       if (_R(Ticks[i]) == PrevTick) // https://www.mql5.com/ru/code/16280
         break ;
        
     if (i == Amount)
       Print ( "В истории (length = " + ( string )Amount + ") нет тика, что был на предыдущем Event." );
  }
   else
    Amount = CopyTicks ( _Symbol , Ticks, COPY_TICKS_ALL , TimeCurrent () * 1000 );
    
   if (Amount > 0 )
    PrevTick = Ticks[Amount - 1 ];  
}

결과

 2016.09 . 15 11 : 04 : 02.810 Test2 (RTS- 9.16 ,M1)     В истории (length = 2 ) нет тика, что был на предыдущем Event.
2016.09 . 15 11 : 03 : 59.312 Test2 (RTS- 9.16 ,M1)     В истории (length = 13 ) нет тика, что был на предыдущем Event.
2016.09 . 15 11 : 03 : 59.290 Test2 (RTS- 9.16 ,M1)     В истории (length = 1 ) нет тика, что был на предыдущем Event.

히스토리에 있던 틱은 다음 틱 이벤트에서 더 이상 히스토리에 없습니다!

개발자 여러분, CopyTicks를 작동 상태로 만드십시오. 간단한 테스트도 실패합니다.

 
현재 CopyTicks는 약간 늘어나지만 == 0의 입력 매개변수로 실시간으로 작동합니다.
 

각 OnTick의 배열에 새로운 기록 틱을 추가해야 합니다. 누구든지 이것을 구현 했습니까?

나는 그것이 작동하지 않을 것입니다. Curve CopyTicks는 무시할 수 없습니다.

 
fxsaber :
현재 CopyTicks는 약간 늘어나지만 == 0의 입력 매개변수로 실시간으로 작동합니다.
다음은 스트레칭 중 하나입니다.
 void OnTick ( void )
{
   MqlTick Ticks[];
  
   const int Amount = CopyTicks ( _Symbol , Ticks);
  
   if ((Amount > 1 ) && (Ticks[Amount - 1 ].time_msc < Ticks[Amount - 2 ].time_msc))
     Print ( "Некорректная история!" );
}
결과
 2016.09 . 15 13 : 11 : 13.231 Test4 (RTS- 9.16 ,M1)     Некорректная история!
2016.09 . 15 13 : 10 : 48.954 Test4 (RTS- 9.16 ,M1)     Некорректная история!
우리는 극단적 인 틱을 사용하고 가장 최근 틱의 시간이 이전 틱보다 짧은 것으로 나타났습니다.
 
fxsaber :
다음은 스트레치 중 하나입니다. 결과 극단적인 틱을 수행한 결과 가장 최근 틱의 시간이 이전 틱보다 짧은 것으로 나타났습니다.

이 표시기의 코드를 보십시오

https://www.mql5.com/ru/forum/94399/page6#comment_2776784

Таблица всех сделок. Доступ через MQL5
Таблица всех сделок. Доступ через MQL5
  • 리뷰: 1
  • www.mql5.com
Как организовать получение таблицы сделок? Пока не важно из индикатора или из советника...
 
fxsaber :
우리는 극단적 인 틱을 사용하고 가장 최근 틱의 시간이 이전 틱보다 짧은 것으로 나타났습니다.
이것은 COPY_TICKS_ALL에만 적용됩니다. 다른 모드에서는 제안된 Expert Advisor에서 오류를 찾지 못했습니다.
 
이 스레드의 보고서에 따라 서비스 데스크에 글을 작성 해야 합니까, 아니면 개발자가 직접 모니터링해야 합니까?
 
fxsaber :
이 스레드의 보고서에 따라 서비스 데스크에 글을 작성 해야 합니까, 아니면 개발자가 직접 모니터링해야 합니까?
더 나은 쓰기. 중복되지 않습니다.