실시간 틱 - 페이지 3

 
Aleksey Mavrin :

솔직히 말해서, 나는 당신이 ECN에 대해 읽기 위해 이 링크에서 정확히 무엇을 원하는지 이해하지 못했습니다. 특히 이전에 알려지지 않은 것)

내가 원했어? 이것이 당신이 원했던 것입니다. )))

FX와 증권거래소의 차이점을 잘 모르시므로 링크를 걸어두었습니다.

FX로 교환 구역을 어지럽히지 마십시오.

 
Sergey Chalyshev :

내가 원했어? 이것이 당신이 원했던 것입니다. )))

FX와 증권 거래소의 차이점을 모르셔서 링크를 걸어두었습니다.

FX로 교환 구역을 어지럽히지 마십시오.

예, 사람들이 자신을 명확하게 표현할 수 있기를 정말로 원하지만 이것은 달성할 수 없습니다. 우리는 우리가 가진 것에 만족합니다.

당신도 나에게 무엇을해야하는지 말하지 마십시오, 알았어. 그리고 아마 당신도 뭔가를 이해하지 못할 것이라고 생각하지 않습니까? 적어도 링크를 게시한 이유를 가져오세요)

그리고 한 가지 더 - Forex는 내가 처음에 언급한 것이 아니라 이미 시작된 토론에 들어갑니다. 처음입니다.

2-x - 거래소 섹션에서 누군가 다른 시장과 거래소의 비교를 논의하는 것을 금지했습니까?

그리고 3번째 - 스키어 대 스노보더의 구두점을 중지합시다. 아니면 괜찮을까요?

 

진드기 분석 실험의 일부 요약.

1. OnTick 핸들러가 많은 수의 틱을 놓치고 있습니다.
따라서 들어오는 틱을 통해 거래 테이프를 분석하려는 경우 아무 의미가 없습니다.
이 접근 방식을 사용하면 테스터의 알고리즘 결과와 실제 거래 결과가 달라집니다.

또는 CopyTicks() 또는 CopyTicksRange() 함수를 사용하여 과거 틱을 가져와 선택한 기간 또는 특정 수의 최근 거래에 대한 거래 테이프를 분석할 수 있습니다.
이 경우 테스터에서 알고리즘을 테스트한 결과와 실제 거래 결과는 동일합니다.
마이너스 중 알고리즘 성능 저하.

2. 역사적 틱보다 OnBookEvent 이벤트가 훨씬 더 많습니다. 이 이벤트는 틱 외에도 오더북 변경도 처리하기 때문에 이해할 수 있습니다.
따라서 이 이벤트를 사용하여 들어오는 모든 틱을 분석할 수 있는 것처럼 보일 수 있습니다.
그러나 이것은 사실이 아니며 모든 거래가 오더북을 거치는 것은 아닙니다.
시장 교환 주문은 오더북을 통과하지 못할 수 있지만 거래 피드에는 반영됩니다.
그 이유는 주문서가 실제로 필요한 조건이 충족되면 실행되기를 기다리는 주문의 장부이기 때문입니다.

예 - 거래가 OnEventBook 핸들러(최대 5틱)를 거치지 않았습니다.

MT5

다시 말하지만, 첫 번째 옵션과 마찬가지로 솔루션은 과거 틱의 분석입니다.
이 솔루션의 단점은 테스터에서 테스트할 수 없다는 것입니다. DOM 변경 이벤트는 테스터에서 생성되지 않습니다.

3. 틱 플래그에 문서화되지 않은 8비트에 대한 답변이 없었습니다. 다른 포럼 스레드에서 같은 질문을 했습니다.

나 자신을 위해 이미 성능 저하에도 불구하고 기록을 통해 트랜잭션 테이프를 분석하는 방법을 결정했습니다.
이를 통해 테스터에서 알고리즘을 테스트할 때 신뢰할 수 있는 결과를 얻을 수 있습니다.

아이디어와 토론을 해주신 모든 분들께 감사드립니다.

 
Vladimir Mikhailov :

진드기 분석 실험의 일부 요약.

1. OnTick 핸들러가 많은 수의 틱을 놓치고 있습니다.
따라서 들어오는 틱을 통해 거래 테이프를 분석하려는 경우 아무 의미가 없습니다.
이 접근 방식을 사용하면 테스터의 알고리즘 결과와 실제 거래 결과가 달라집니다.

또는 CopyTicks() 또는 CopyTicksRange() 함수를 사용하여 과거 틱을 가져와 선택한 기간 또는 특정 수의 최근 거래에 대한 거래 테이프를 분석할 수 있습니다.
이 경우 테스터에서 알고리즘을 테스트한 결과와 실제 거래 결과는 동일합니다.
마이너스 중 알고리즘 성능 저하.

2. 이벤트 OnBookEvent는.....
그러나 이것은 사실이 아니며 모든 거래가 오더북을 거치는 것은 아닙니다.

예 - 거래가 OnEventBook 핸들러(최대 5틱)를 거치지 않았습니다.

3. 틱 플래그에 문서화되지 않은 8비트에 대한 답변이 없었습니다. 다른 포럼 스레드에서 같은 질문을 했습니다.


2. 틱 선택기 코드를 게시하십시오(당신이 뭔가 잘못하고 있다고 확신합니다)

3. 인쇄 시 EnumToString(플래그)을 수행합니다.

 
prostotrader :

2. 틱 선택기 코드를 게시하십시오(당신이 뭔가 잘못하고 있다고 확신합니다)

3. 인쇄 시 EnumToString(flags) 수행

코드는 정상적이고 최소한입니다. OnBookEvent 이벤트는 마지막으로 알려진 틱을 수신 하고 .

 //+------------------------------------------------------------------+
//|                                               TicksCollector.mq5 |
//|                               Copyright 2020, Vladimir Mikhailov |
//|                                                mikh.vl@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Vladimir Mikhailov"
#property link        "mikh.vl@gmail.com"
#property version    "1.00"
MqlTick tick[ 1 ];
int counter= 0 ;
string type;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   MarketBookAdd ( _Symbol );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   MarketBookRelease ( _Symbol );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &  symbol)
  {
   CopyTicks ( _Symbol ,tick, COPY_TICKS_ALL , 0 , 1 );
   counter++;
   if ((tick[ 0 ].flags& TICK_FLAG_BID )== TICK_FLAG_BID || (tick[ 0 ].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK )
      {
       printf ( "Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Ask: %s; Bid: %s" , _Symbol , counter, tick[ 0 ].flags, TimeToString (tick[ 0 ].time, TIME_MINUTES | TIME_SECONDS ),tick[ 0 ].time_msc% 1000 , DoubleToString (tick[ 0 ].ask, _Digits ), DoubleToString (tick[ 0 ].bid, _Digits ));
      }
   else if ((tick[ 0 ].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY || (tick[ 0 ].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL )
      {
       type=(tick[ 0 ].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ? "Buy" : (tick[ 0 ].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ? "Sell" : "" ;
       printf ( "Symbol: %s; tick #: %d; flags: %d; Time: %s.%03d; Volume: %.0f; Type: %s; Last: %s" , _Symbol , counter, tick[ 0 ].flags, TimeToString (tick[ 0 ].time, TIME_MINUTES | TIME_SECONDS ),tick[ 0 ].time_msc% 1000 , tick[ 0 ].volume_real, type, DoubleToString (tick[ 0 ].last, _Digits ));
      }  
  }
//+------------------------------------------------------------------+

세 번째 점에서 틱 플래그는 열거형이 아니므로 EnumToString 함수를 적용할 수 없습니다.

 
Vladimir Mikhailov :

코드는 정상적이고 최소한입니다. OnBookEvent 이벤트는 마지막으로 알려진 틱을 수신하여 출력합니다.

세 번째 점에서 틱 플래그는 열거형이 아니므로 EnumToString 함수를 적용할 수 없습니다.

당신은 1 틱을 복사하고 있으며 간격을 원하지 않습니다 :)

OnBookEvent()는 주문서의 모든 변경 사항에 대해 발생하지만 한 시점에서 발생합니다.

여러 틱이 있을 수 있습니다. 하나의 틱이 터미널에 오는 것이 아니라 틱의 패키지입니다.

내가 당신에게 추천한 지표(모든 거래의 테이프)에 설명이 있습니다

러시아어로. 게으르지 말고 읽으십시오.

 
prostotrader :

당신은 1 틱을 복사하고 있으며 간격을 원하지 않습니다 :)

OnBookEvent()는 주문서의 모든 변경 사항에 대해 발생하지만 한 시점에서 발생합니다.

여러 틱이 있을 수 있습니다. 하나의 틱이 터미널에 오는 것이 아니라 틱의 패키지입니다.

내가 당신에게 추천한 지표(모든 거래의 테이프)에 설명이 있습니다

러시아어로. 게으르지 말고 읽으십시오.

하나 이상의 틱을 보는 것은 역사가 됩니다.

 
Vladimir Mikhailov :

하나 이상의 틱을 보는 것은 역사가 됩니다.

터미널이 어떻게 작동하는지 전혀 이해하지 못합니다.

표시기의 주석을 읽으십시오 !!!

 //+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
    is_book = MarketBookAdd ( Symbol ());
     int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      last_time = ticks[ 0 ].time_msc;
    }  
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
     if (is_book == true ) MarketBookRelease ( Symbol ());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
  {
     if ( Symbol () == symbol)
    {
       int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
       if (result > 0 )
       {
         for ( int i= 0 ; i<result; i++)
         {
           if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
           if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
           if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
           if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
           if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
           if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
           Print ( "Unknown flag is " , ticks[i].flags);
         }
         last_time = ticks[ 0 ].time_msc + 1 ;
       }
     
    }
   
  }
//+------------------------------------------------------------------+
2020.01 . 29 10 : 51 : 42.077 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_ASK
2020.01 . 29 10 : 51 : 42.077 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_ASK
2020.01 . 29 10 : 51 : 42.077 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 51 : 42.121 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 51 : 42.194 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 51 : 50.903 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 51 : 52.235 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 51 : 52.399 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 52 : 05.174 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 52 : 24.630 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_BID
2020.01 . 29 10 : 52 : 24.630 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_LAST
2020.01 . 29 10 : 52 : 28.027 Ticks_test (GOLD- 3.20 ,M1)       Tick is TICK_FLAG_LAST

추가됨

위의 예에서 모든 틱이 "잡히는" 것은 아닙니다. 새로 도착한 틱 패킷에서

이전 시간과 틱이있을 수 있습니다.

"모든 거래의 테이프" 코드를 주의 깊게 연구하십시오(주석이 있음).

 

표시기 코드를 이해하는 것이 어렵다면(또는 너무 게으르다면)

모든 틱의 적절한 실시간 틱 수집기에 대한 더 간단한 코드를 참조하십시오.

 //+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
bool is_book;
MqlTick ticks[];
ulong last_time, mem_time;
bool is_first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
    is_first = false ;
    is_book = MarketBookAdd ( Symbol ());
     int result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , 0 , 1 );
     if (result > 0 )
    {
      last_time = ticks[ 0 ].time_msc;
      is_first = true ;
    }
     else
    {
       Alert ( "No start time!" );
       return ( INIT_FAILED );
    }   
   
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
     if (is_book == true ) MarketBookRelease ( Symbol ());
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
  {
     if ( Symbol () == symbol)
    {
       int result;
       if (is_first == true )
      {
         Print ( "First packet of ticks:" );
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
         if (result > 0 )
       {
         for ( int i= 0 ; i<result; i++)
         {
           if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
           if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
           if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
           if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
           if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
           if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
           Print ( "Unknown flag is " , ticks[i].flags);
         }
         is_first = false ;
         mem_time = last_time;
         last_time = ticks[ 0 ].time_msc + 1 ;
       } 
      }
       else
      {
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , mem_time, 0 );
         if (result > 0 )
        {
           for ( int i= 0 ; i<result; i++)
          {
             if (ticks[i].time_msc == mem_time)
            {
               Print ( "Tick with old time:" );
               if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
               if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
               if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
               if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
               if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
               if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
               Print ( "Unknown flag is " , ticks[i].flags);
            }
          }
        }
        result = CopyTicks ( Symbol (), ticks, COPY_TICKS_ALL , last_time, 0 );
         if (result > 0 )
        {
           Print ( "Ticks with new time:" );
           for ( int i= 0 ; i<result; i++)
          {
             if ((ticks[i].flags& TICK_FLAG_ASK )== TICK_FLAG_ASK ) Print ( "Tick is " , "TICK_FLAG_ASK" ); else
             if ((ticks[i].flags& TICK_FLAG_BID )== TICK_FLAG_BID ) Print ( "Tick is " , "TICK_FLAG_BID" ); else
             if ((ticks[i].flags& TICK_FLAG_BUY )== TICK_FLAG_BUY ) Print ( "Tick is " , "TICK_FLAG_BUY" ); else
             if ((ticks[i].flags& TICK_FLAG_LAST )== TICK_FLAG_LAST ) Print ( "Tick is " , "TICK_FLAG_LAST" ); else
             if ((ticks[i].flags& TICK_FLAG_SELL )== TICK_FLAG_SELL ) Print ( "Tick is " , "TICK_FLAG_SELL" ); else
             if ((ticks[i].flags& TICK_FLAG_VOLUME )== TICK_FLAG_VOLUME ) Print ( "Tick is " , "TICK_FLAG_VOLUME" ); else
             Print ( "Unknown flag is " , ticks[i].flags);
          }
          mem_time = last_time;
          last_time = ticks[ 0 ].time_msc + 1 ;
        }
      }
    }
 }
//+------------------------------------------------------------------+
 
prostotrader :

모든 틱의 적절한 실시간 틱 수집기에 대한 더 간단한 코드를 참조하십시오.

CopyTicks가 여전히 사용되는 경우 왜 "실시간으로" 수집합니까?

원하는 시간에 원하는 깊이로 눈금을 복사할 수 있습니다.