장 마감 - 페이지 5

 

친애하는 개발자 여러분!

이 메시지를 주의 깊게 읽으십시오.

시간차이가 나는 이유를 알 것 같아요!!!

오늘:

단말기

23:49:58.148    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.154    Trades  'xxxxx': accepted buy limit 2.00 UCHF-3.18 at 0.9310
23:49:58.156    Trades  'xxxxx': buy limit 2.00 UCHF-3.18 at 0.9310 placed for execution in 8.040 ms

전문가

 2017.09 . 21 23 : 49 : 58.182 trader (UCHF- 3.18 ,H1)     StopTrading: Время сервера = 23 : 50 : 00 ; Статус ордера = BUY_ORDER; Билет = 77833993   Buy ордер отклонён.
2017.09 . 21 23 : 49 : 58.182 trader (UCHF- 3.18 ,H1)     Alert : Эксперт остановлен. Инструмент UCHF- 3.18
2017.09 . 21 23 : 49 : 58.182 trader (UCHF- 3.18 ,H1)     OnTradeTransaction : Buy ордер отклонён брокером(биржей). Билет = 77833993 Причина: 0 0

시간 확인 메커니즘

상품의 Depth of Market을 변경할 때 ( 나는 Depth of Market으로만 작업합니다 )

 //+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent ( const string &symbol)
{
   if (symbol == Symbol ()))
  {
     if (CheckMarketTime(symbol)
    {
       //Выставление ордеров и т.д.
    }
  }     
}

CheckMarketTime 함수가 호출됩니다.

 //+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime( const string a_symbol)
{
   if ( SymbolInfoTick (a_symbol, cur_tick))
  {
    sv_time.year = 0 ;
     TimeToStruct (cur_tick.time, sv_time);
     if (sv_time.year > 0 )
    {
       if ((sv_time.day_of_week == int (FirstDay)) ||
         (sv_time.day_of_week == int (SecondDay))) return ( false );
      tts_time.year = 0 ;
       TimeTradeServer (tts_time);
       if (tts_time.year > 0 )
      {   
         if ((tts_time.day_of_week == sv_time.day_of_week) &&
           (tts_time.hour == sv_time.hour) &&
           (tts_time.min == sv_time.min))
        {
           ulong cur_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
           if (((cur_time >= time_st_mon) && (cur_time < 50370 )) ||
             ((cur_time >= time_st_day) && (cur_time < 67470 )) ||
             ((cur_time >= time_st_evn) && (cur_time < 85770 )))
          {
             return ( true );
          }
        }
      }
    }
  }
   return ( false );
}

기기의 마지막 눈금에 데이터를 수신한 경우

 if ( SymbolInfoTick (a_symbol, cur_tick))

나는 시간 프레임을 확인하지만 ( 매우 중요 )!!!!

MqlTick(대부분의 경우) 에서 마지막 시간은 다음과 같은 경우 입력되지 않습니다.

동일한 가격의 거래량만 Depth of Market에서 변경되었습니다 .

플래그에는

플래그 T ICK_FLAG_ASK_VOLUME 및 T ICK_FLAG_BID_VOLUME

OnBookEvent 기능이 작동하고(이런 가격이 변경되었습니다.)

MqlTick은 이 변경 시간을 기록하지 않았습니다.

시간 업데이트에 따라 이러한 플래그를 MqlTick에 추가하십시오.

추가됨

어떤 이유로 SD에 쓸 수 없습니다.

 
prostotrader :

MqlTick(대부분의 경우) 에서 마지막 시간은 다음과 같은 경우 입력되지 않습니다.

동일한 가격의 거래량만 Depth of Market에서 변경되었습니다 .

절대적으로 맞습니다 . 그리고 이것은 올바른 행동입니다. MqlTick은 틱 기록이 채워진 동일한 소스에서 데이터를 가져옵니다. 틱 기록에는 중복 이웃이 없어야 합니다. MT5의 틱 기록은 최고의 밴드에서도 볼륨을 저장하지 않습니다.

유리가 해당하는 시간을 알 수 있는 직접적인 방법이 없다는 문제가 오랫동안 제기되어 왔습니다. 다른 방법으로 알아보십시오.

 
fxsaber :

절대적으로 맞습니다 . 그리고 이것은 올바른 행동입니다. MqlTick은 틱 기록이 채워진 동일한 소스에서 데이터를 가져옵니다. 틱 기록에는 중복 이웃이 없어야 합니다. MT5의 틱 기록은 최고의 밴드에서도 볼륨을 저장하지 않습니다.

유리가 해당하는 시간을 알 수 있는 직접적인 방법이 없다는 문제가 오랫동안 제기되어 왔습니다. 다른 방법으로 알아보십시오.


방법을 알려주세요?

추가됨

타칸에서 무언가가 변경되었다는 알림을 받은 경우

편의를 위해("작은 유혈사태") 필드를 추가하지 않는 이유

날짜/시간 book_change; ?

또는 더 쉽게 MqlBookInfo 구조에 필드를 추가하십시오.

날짜/시간 book_change;

게다가 이번에는 거래소에서 방송된다.

 
prostotrader :

방법을 알려주세요?

 // Время последнего тика символа
long GetSymbolTime( const string Symb )
{
   MqlTick Tick;
  
   return ( SymbolInfoTick (Symb, Tick) ? Tick.time_msc : 0 );
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
   long Res = 0 ;
  
   for ( int i = SymbolsTotal ( true ) - 1 ; i >= 0 ; i--)
  {
     const long TmpTime = GetSymbolTime( SymbolName (i, true ));
    
     if (TmpTime > Res)
      Res = TmpTime;
  }
  
   return (Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
   static ulong StartTime = GetMicrosecondCount ();
   static long PrevTime = 0 ;
  
   const long TmpTime = GetMarketWatchTime();
  
   if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount ();
  }
  
   return (PrevTime + ( long )(( GetMicrosecondCount () - StartTime) / 1000 ));
}

void OnInit ()
{
   MarketBookAdd ( _Symbol );
}

void OnDeinit ( const int )
{
   MarketBookRelease ( _Symbol );
}

string TimeToString ( const long Value )
{
   return (( string )( datetime )(Value / 1000 ) + "." + ( string ) IntegerToString (Value % 1000 , 3 , '0' ));
}

void OnBookEvent ( const string & )
{
   Comment ( TimeToString (GetCurrenTime()));
}
 
fxsaber :

웃기지 말아요... :)

 
prostotrader :

타칸에서 무언가가 변경되었다는 알림을 받은 경우

편의를 위해("작은 유혈사태") 필드를 추가하지 않는 이유

날짜/시간 book_change; ?

또는 더 쉽게 MqlBookInfo 구조에 필드를 추가하십시오.

날짜/시간 book_change;

게다가 이번에는 거래소에서 방송된다.

datetime이 아니라 long - 밀리초입니다. 잘

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

장 마감

fxsaber , 2017.09.22 09:17

유리가 해당하는 시간을 알 수 있는 직접적인 방법이 없다는 문제가 오랫동안 제기되어 왔습니다 .

유사한 제안으로.

 

아마도 OnBookEvent가 발생한 후

주어진 기호에 대해 CopyTicks를 요청하시겠습니까?

노력할게...

 
prostotrader :

아마도 OnBookEvent가 발생한 후

주어진 기호에 대해 CopyTicks를 요청하시겠습니까?

물론 도움이 되지 않습니다. 이제 유일한 옵션은 유리가 주도하는 시간을 찾는 것입니다.

 
fxsaber :

물론 도움이 되지 않습니다. 이제 유일한 옵션은 유리가 주도하는 시간을 찾는 것입니다.


흥미로운 것으로 밝혀졌습니다 :)

 #property copyright "Copyright 2017 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//
MqlTick a_ticks[], b_ticks;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   if (! MarketBookAdd ( Symbol ()))
   {
     Print ( "Book not added!" );
     return ( INIT_FAILED );
   }
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
     MarketBookRelease ( Symbol ());   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
  {
     if (symbol == Symbol ())
    {
       int res = CopyTicks (symbol, a_ticks, COPY_TICKS_ALL , 0 , 1 );
       if (res > 0 )
      {
         if ( SymbolInfoTick (symbol, b_ticks))
        {
           Print ( "CopyTicks time = " , TimeToString (a_ticks[ 0 ].time, TIME_SECONDS ), "; SymbolInfoTick = " , TimeToString (b_ticks.time, TIME_SECONDS ));
        }
      }
    }
  }

결과

 2017.09 . 22 11 : 18 : 36.029 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 27 ; SymbolInfoTick = 11 : 18 : 35
2017.09 . 22 11 : 18 : 36.933 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 27 ; SymbolInfoTick = 11 : 18 : 35
2017.09 . 22 11 : 18 : 37.577 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 27 ; SymbolInfoTick = 11 : 18 : 37
2017.09 . 22 11 : 18 : 38.257 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 27 ; SymbolInfoTick = 11 : 18 : 37
2017.09 . 22 11 : 18 : 38.317 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 38
2017.09 . 22 11 : 18 : 38.511 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 38
2017.09 . 22 11 : 18 : 38.871 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 38
2017.09 . 22 11 : 18 : 39.071 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 38
2017.09 . 22 11 : 18 : 39.545 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 38
2017.09 . 22 11 : 18 : 39.655 Test_time (RTS- 12.17 ,M1)         CopyTicks time = 11 : 18 : 38 ; SymbolInfoTick = 11 : 18 : 39

????????

도무지 무슨 말을 해야할지 모르겠어....

 
prostotrader :

도무지 무슨 말을 해야할지 모르겠어....

 void OnInit ()
{
   MarketBookAdd ( _Symbol );
}

void OnDeinit ( const int )
{
   MarketBookRelease ( _Symbol );
}

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 )
{
   return (TOSTRING(time) + "." + ( string ) IntegerToString (Tick.time_msc % 1000 , 3 , '0' ) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnBookEvent ( const string &Symb )
{
   if (Symb == _Symbol )
  {
     MqlTick Tick1, Tick2[];
    
     if ( SymbolInfoTick ( _Symbol , Tick1) && ( CopyTicks ( _Symbol , Tick2, COPY_TICKS_ALL , 0 , 1 ) > 0 ))
       Print ( "\nMqlTick: " + TickToString(Tick1) + "\nCopyTick: " + TickToString(Tick2[ 0 ]));
  }
}

당신은 시간이 그러한 상황에서만 다를 것이라는 것을 알게 될 것입니다

Test3 (RTS- 12.17 ,M1)     MqlTick :  time = 2017.09 . 22 11 : 21 : 50.668 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 FLAG_UNKNOWN ( 0 )
Test3 (RTS- 12.17 ,M1)    CopyTick:  time = 2017.09 . 22 11 : 21 : 50.572 bid = 112000.0 ask = 112010.0 last = 112000.0 volume = 5 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL


MqlTick 이 있는 그대로 틱을 반환하지 않는다는 것은 여러 번 논의되었습니다. 견적 및 거래의 두 가지 틱 스트림이 있습니다. 그리고 CopyTicks에서는 때때로 소급하여 결합됩니다. 스레드가 동기화되지 않았습니다. 그리고 MqlTick 및 CopyTicks 시간이 일치하지 않을 수 있습니다.

사유: