MT5와 속도 - 페이지 61

 
fxsaber :

이 MQ-wall은 포럼 회원들의 도움 없이는 무너질 수 없다고 생각합니다. 코드가 짧습니다. 전문가는 빨리 움직여야 합니다. 거기에는 결함이 없습니다. 포지션을 통한 가격은 Market Watch보다 훨씬 빠르게 획득된다는 것이 분명합니다. MQ가 명백한 것을 보지 못하는 방법 - 나는 이해하지 못한다.

1. 테스트는 조건으로 인한 반복 백분율의 미시적인 부분을 실제로 고려합니다.

 if (Interval ##A > 100 )

사실, 프로세서가 작업으로 과부하되어 이 작업의 실행을 원거리 선반으로 연기한 경우에만 이상 현상만 계산합니다. 99% 이상의 반복이 1마이크로초 이내에 수행됩니다.

그리고 조건>0으로 설정해도 여전히 객관성은 없습니다.

2. 이러한 빠른 작업의 시간 측정은 한 번의 반복이 아니라 전체 주기의 시간으로 수행되어야 합니다.

3. 그러나 귀하의 예제에서 주기가 10초로 제한되어 있기 때문에(왜! 틱의 경우 0.1초면 충분하다고 생각합니다. 결국 1초에 3개의 틱이 와서 3개의 틱이 모두 처리될 가능성이 있습니다. 10초 동안 병렬로), 그 다음에는 타이밍이 필요하지 않습니다. 그리고 주어진 시간에 얼마나 많은 반복이 수행될 것인지 계산하기가 더 쉽습니다. 많을수록 성능이 향상됩니다.

귀하의 코드를 "약간" 수정했습니다. 제 버전이 현실을 더 반영하는 것 같아요.

두 옵션을 혼합하지 않도록 계산이 차례로 이루어집니다. SYMBOL_BID 에 대한 짝수 틱, GetBid()에 대한 홀수 틱.

합과 그 파생은 최적화에 대해 컴파일러를 속이기 위한 시도로 만일을 대비하여 추가되었습니다.
출력은 누적됩니다.

 #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )
#define TimeLoop 125    // 15.625*8  

bool GetPosition( const int Type = OP_BUY)
  {
   bool Res = false ;
   for ( int i = PositionsTotal () - 1 ; (i >= 0 ) && !Res; i--)
      Res = PositionGetTicket (i) && ( PositionGetInteger ( POSITION_TYPE ) == Type) &&
            ( PositionGetString ( POSITION_SYMBOL ) == _Symbol );
   return (Res);
  }

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
  {
   static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger ( POSITION_TICKET ) : OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, 0 , 0 , 0 );
   return ( PositionSelectByTicket (Ticket) ? PositionGetDouble ( POSITION_PRICE_CURRENT ) : 0 );
  }

#define TOSTRING(A) ", " #A + " = " + ( string )(A)


long N1= 0 ;
long N2= 0 ;
long n= 0 ;
double sum1= 0 ;
double sum2= 0 ;

const bool Init = EventSetTimer ( 10 ) && GetBid(); // Будем выводить статистику каждый 10 секунд.

//+------------------------------------------------------------------+

void OnTick ()
  {
//  return;
   const uint StartTime = GetTickCount ();
   if (n% 2 == 0 )
       while (! IsStopped () && ( GetTickCount () - StartTime < TimeLoop))
        {
         sum1+= SymbolInfoDouble ( _Symbol , SYMBOL_BID );
         N1++;
        }
   else
       while (! IsStopped () && ( GetTickCount () - StartTime < TimeLoop))
        {
         sum2+=GetBid();
         N2++;
        }
   if (n% 2 == 0 && n> 1 )
       if (N1>N2) Print ( _Symbol + ": SYMBOL_BID быстрее GetBid() в " + DoubleToString ( double (N1)/N2, 2 ) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString ((TimeLoop* 1000000.0 *n/ 2 )/N1, 2 ) + " ns, GetBid() - " + DoubleToString ((TimeLoop* 1000000.0 *n/ 2 )/N2, 2 ) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
       else        Print ( _Symbol + ": GetBid() быстрее SYMBOL_BID в " + DoubleToString ( double (N2)/N1, 2 ) + " раза. Среднее время одной итерации: SYMBOL_BID - " + DoubleToString ((TimeLoop* 1000000.0 *n/ 2 )/N1, 2 ) + " ns, GetBid() - " + DoubleToString ((TimeLoop* 1000000.0 *n/ 2 )/N2, 2 ) + " ns" + TOSTRING(sum1) + TOSTRING(sum2));
      n++;
  }
//+------------------------------------------------------------------+

내 결과:

 2020.10 . 26 19 : 26 : 46.193 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.97 раза. Среднее время одной итерации: SYMBOL_BID - 45.80 ns, GetBid() - 135.80 ns, sum1 = 106706334.7283292 , sum2 = 35987491.50911281
2020.10 . 26 19 : 26 : 46.193 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.90 раза. Среднее время одной итерации: SYMBOL_BID - 45.10 ns, GetBid() - 130.82 ns, sum1 = 34042649.2788716 ,  sum2 = 11735304.45101236
2020.10 . 26 19 : 26 : 47.085 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.95 раза. Среднее время одной итерации: SYMBOL_BID - 45.57 ns, GetBid() - 134.55 ns, sum1 = 110131593.3516681 , sum2 = 37303001.98488424
2020.10 . 26 19 : 26 : 52.397 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 45.48 ns, GetBid() - 135.90 ns, sum1 = 113269505.1945728 , sum2 = 37903458.6724181
2020.10 . 26 19 : 26 : 59.412 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 2.85 раза. Среднее время одной итерации: SYMBOL_BID - 45.16 ns, GetBid() - 128.57 ns, sum1 = 36611618.7279973 ,  sum2 = 12858907.51985167
2020.10 . 26 19 : 27 : 00.131 FxSaberBidSpeed (BTCUSD,M1)     BTCUSD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 47.10 ns, GetBid() - 130.88 ns, sum1 = 305215291120.0239 , sum2 = 109832697267.1495
2020.10 . 26 19 : 27 : 03.303 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.96 раза. Среднее время одной итерации: SYMBOL_BID - 45.44 ns, GetBid() - 134.61 ns, sum1 = 116279675.0471961 , sum2 = 39248002.75579567
2020.10 . 26 19 : 27 : 06.318 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 45.17 ns, GetBid() - 135.96 ns, sum1 = 119877506.6663743 , sum2 = 39829996.08171722
2020.10 . 26 19 : 27 : 06.709 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 3.01 раза. Среднее время одной итерации: SYMBOL_BID - 44.92 ns, GetBid() - 135.42 ns, sum1 = 123505976.1123297 , sum2 = 40965170.16304104
2020.10 . 26 19 : 27 : 07.803 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.99 раза. Среднее время одной итерации: SYMBOL_BID - 44.84 ns, GetBid() - 134.00 ns, sum1 = 126664503.6443297 , sum2 = 42385980.37108831
보시다시피 성능 차이는 표준 버전에 비해 3배입니다.
 
Nikolai Semko :


보시다시피 성능 차이는 표준 버전에 비해 3배입니다.

fxsaber의 원본 버전은 GetBid의 장점을 보여줍니까, 아니면 더 강력하거나 덜 로드된 PC인가요?

 
Andrey Khatimlianskii :

fxsaber의 원본 버전은 GetBid의 장점을 보여줍니까, 아니면 더 강력하거나 덜 로드된 PC인가요?

그의 버전은 또한 전체 CPU 로드에서 GetBid의 이점을 보여주었습니다. 그러나 동시에 내 버전은 동일한 부하로 표준 기능의 3배 이점을 보여줍니다.
이것은 내 버전이 입찰 가격을 얻는 모든 반복의 평균 시간을 고려하기 때문에 발생하며 비정상적인 중단이 있는 아주 작은 부분에 불과합니다.
그에게 어려운 "분"에 프로세서가 표준 기능(지연이 100μ 이상인 경우)에 정확하게 점수를 매기는 이유를 누가 압니까? 그러나 여전히 일반 기능의 경우 평균 시간이 3배 적습니다.

예를 들어 if (Interval##A > 100) 다음 그림이 있습니다.

반면 (Interval##A > 0) 이미 완전히 다르면 입찰 가격을 얻기 위한 표준 옵션과 대체 옵션 사이의 비정상적인 지연의 무작위 분포를 보여줍니다.

동일한 CPU 부하에서의 내 테스트는 다음을 보여줍니다.

 2020.10 . 26 22 : 16 : 10.569 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.95 ns, GetBid() - 161.43 ns, sum1 = 108105265.450882 , sum2 = 38804020.20301527
2020.10 . 26 22 : 16 : 12.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.81 ns, GetBid() - 161.06 ns, sum1 = 111212159.8857315 , sum2 = 39917412.88663763
2020.10 . 26 22 : 16 : 13.741 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.79 раза. Среднее время одной итерации: SYMBOL_BID - 57.37 ns, GetBid() - 159.91 ns, sum1 = 114942034.0034028 , sum2 = 41233865.03452455
2020.10 . 26 22 : 16 : 14.740 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.18 раза. Среднее время одной итерации: SYMBOL_BID - 52.88 ns, GetBid() - 167.92 ns, sum1 = 75470423.51597476 , sum2 = 23764764.64380601
2020.10 . 26 22 : 16 : 15.756 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.78 раза. Среднее время одной итерации: SYMBOL_BID - 57.30 ns, GetBid() - 159.06 ns, sum1 = 117956798.0483066 , sum2 = 42491447.24894404
2020.10 . 26 22 : 16 : 17.646 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.19 ns, GetBid() - 158.36 ns, sum1 = 121056970.4066543 , sum2 = 43721243.0341278
2020.10 . 26 22 : 16 : 20.146 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.76 раза. Среднее время одной итерации: SYMBOL_BID - 57.14 ns, GetBid() - 157.85 ns, sum1 = 124053724.3725583 , sum2 = 44907061.11418578
2020.10 . 26 22 : 16 : 21.553 FxSaberBidSpeed (EURUSD,M1)     EURUSD: SYMBOL_BID быстрее GetBid() в 3.15 раза. Среднее время одной итерации: SYMBOL_BID - 52.80 ns, GetBid() - 166.11 ns, sum1 = 78375839.87008552 , sum2 = 24913626.42960918
2020.10 . 26 22 : 16 : 24.865 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 56.94 ns, GetBid() - 157.50 ns, sum1 = 127392085.5933389 , sum2 = 46051851.71182434
2020.10 . 26 22 : 16 : 27.678 FxSaberBidSpeed (USDCAD,M1)     USDCAD: SYMBOL_BID быстрее GetBid() в 2.77 раза. Среднее время одной итерации: SYMBOL_BID - 57.13 ns, GetBid() - 158.30 ns, sum1 = 129851046.9417646 , sum2 = 46862113.16739535

따라서 fxsaber 테스트 버전은 객관적이지 않다고 생각합니다.

프로세서는 에이전트가 아니라 이 스크립트로 로드되었습니다. 그것은 더 효율적으로 작동했습니다.

파일:
LSD.mq5  6 kb
 

계산에 포함된 반복의 백분율을 시각적으로 보여주기 위해 fxsaber 테스트를 약간 수정한 후:

 2020.10 . 26 22 : 45 : 03.679 FxSaberBidSpeed (USDCAD,M1)     Alert : , TimeBid1-TimeBid2 = 2142416 mcs., TimeBid1 = 2858669 , TimeBid2 = 716253 ,  Всего итераций - 31456223 , из них принято во внимание, NBid1 = 3015 , NBid2 = 1714
2020.10 . 26 22 : 45 : 05.739 FxSaberBidSpeed (BTCUSD,M1)     Alert : , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285 , TimeBid2 = 760589 ,  Всего итераций - 31417549 , из них принято во внимание, NBid1 = 1794 , NBid2 = 1418
2020.10 . 26 22 : 45 : 06.006 FxSaberBidSpeed (USDJPY,M1)     Alert : , TimeBid1-TimeBid2 = 2241890 mcs., TimeBid1 = 3204507 , TimeBid2 = 962617 ,  Всего итераций - 54138004 , из них принято во внимание, NBid1 = 4401 , NBid2 = 2083
2020.10 . 26 22 : 45 : 09.099 FxSaberBidSpeed (EURUSD,M1)     Alert : , TimeBid1-TimeBid2 = 1000828 mcs., TimeBid1 = 1496646 , TimeBid2 = 495818 ,  Всего итераций - 10037824 , из них принято во внимание, NBid1 = 2429 , NBid2 = 1711
2020.10 . 26 22 : 45 : 14.803 FxSaberBidSpeed (USDCAD,M1)     Alert : , TimeBid1-TimeBid2 = 2676273 mcs., TimeBid1 = 3916168 , TimeBid2 = 1239895 , Всего итераций - 41606744 , из них принято во внимание, NBid1 = 4935 , NBid2 = 3790
2020.10 . 26 22 : 45 : 15.745 FxSaberBidSpeed (BTCUSD,M1)     Alert : , TimeBid1-TimeBid2 = 1521696 mcs., TimeBid1 = 2282285 , TimeBid2 = 760589 ,  Всего итераций - 31417549 , из них принято во внимание, NBid1 = 1794 , NBid2 = 1418
2020.10 . 26 22 : 45 : 16.115 FxSaberBidSpeed (USDJPY,M1)     Alert : , TimeBid1-TimeBid2 = 2653810 mcs., TimeBid1 = 4195095 , TimeBid2 = 1541285 , Всего итераций - 64310228 , из них принято во внимание, NBid1 = 6486 , NBid2 = 3879
2020.10 . 26 22 : 45 : 19.834 FxSaberBidSpeed (EURUSD,M1)     Alert : , TimeBid1-TimeBid2 = 1949809 mcs., TimeBid1 = 3091755 , TimeBid2 = 1141946 , Всего итераций - 19435170 , из них принято во внимание, NBid1 = 4724 , NBid2 = 3547

저것들. 약 0.01%

여전히 것입니다.
SymbolInfoDouble(_Symbol, SYMBOL_BID )의 평균 실행 시간이 약 50나노초인 경우 실행 시간이 100,000나노초 이상인 경우에만 계산됩니다.

파일:
 
Nikolai Semko :

계산에 포함된 반복의 백분율을 시각적으로 보여주기 위해 fxsaber 테스트를 약간 수정한 후:

저것들. 약 0.01%

여전히 것입니다.
SymbolInfoDouble(_Symbol, SYMBOL_BID )의 평균 실행 시간이 약 50나노초인 경우 실행 시간이 100,000나노초 이상인 경우에만 계산됩니다.

조건을 100μs 이하, 3μs 이상으로 간단히 만들 수 있습니다. 결과는 분명히 같았습니다. 아이디어는 세그먼트 연구와 다른 실행 조건에서 다른 세그먼트와 다른 영역에서 그 반대의 차이가 있을 수 있다는 것입니다. 실행 우선 순위는 종종 무언가에 따라 수행됩니다. 부하가 적으면 우선 순위가 높고 부하가 많으면 우선 순위가 높고 컴퓨터가 멈추거나 충돌하는 것을 허용하지 않는 중요한 우선 순위가 있으며 성능이 백그라운드로 사라집니다.

일반적으로 철의 70% 이상을 적재할 때의 거래는 옳지 않습니다. 거의 크리티컬한 처형입니다. 전투 고문의 철 장전은 60%를 넘지 않아야 합니다.

 
나는 곧 컴퓨터 앞에 있지 않을 것이므로 간단하게 말하겠습니다.

알고리즘 트레이딩에서는 정기적으로 브레이크가 작동할 때 병원의 평균 온도가 누구에게도 방해가 되지 않습니다. 밀리초 단위로 가격 얻기 - 정기적으로. 그리고 이것은 전투 상황에 있습니다.

거래에 중요한 순간에 지연의 파열 없이 가격을 얻을 수 있다면 나는 그런 기회를 위해 싸울 것입니다.

코드는 그러한 목발이 존재한다는 것을 증명했습니다. 브레이크를 밟고 싶지 않다면 목발을 사용하십시오.

여기에서 아무도 유리로 작업할 때 수신된 가격의 관련성을 비교하기 위한 코드를 아직 보지 않았습니다. 그리고 가볍게 말해서 심각한 질문이 있습니다.

사실은 일반 기능이 목발보다 치명적으로 더 자주 지연된다는 것입니다. 그리고 평균 시간이 0에 가깝다고 신경 쓰지 마십시오. 거래 중에 문제를 일으키는 것은 시차입니다.

HFT를 원한다면 지금은 느린 밀리초 수준도 잊어버리십시오.
 
이미 HFT 중개인이 있습니까?)
 
secret :
이미 HFT 중개인이 있습니까?)
네.
 
Igor Makanu :

시장 감시에 하나의 기호가 있고 수십 개의 기호가 있을 때 SymbolInfoTick을 테스트해 보십시오. 그러나 귀하의 예에서와 같이 하나의 도구를 요청하십시오.

압축된 트래픽이 서버에서 올 가능성이 높고 데이터 압축을 풀 때 이러한 주기적 SymbolInfoTick 브레이크가 나타납니다.

저것들. 많은 문자가 있는 경우 테스트 시간이 훨씬 더 자주 또는 딥딥됩니다.

최근 빌드에서 틱 스트림을 수신하는 것은 이론적으로조차 효과가 없습니다. 실제로 SymbolInfoTick은 이미 캐시와 함께 작동 하지만 개별 시민은 계속해서 검은 고양이를 찾습니다.

80% CPU 로드에서 테스트할 요점이 없습니다.

그리고 그는 시험에서 80%도 얻지 못했습니다. 4개의 코어에 6개의 에이전트가 있습니다. 100% 보장됩니다.

유일한 질문은 그의 시스템의 작업 스케줄러가 이러한 상황에 대처하는 방법입니다. 동시에 책임은 터미널의 구현이라는 진술이 만들어집니다.

저것들. 컴퓨터가 측정할 수 없을 정도로 로드되고 말 그대로 모든 것이 느려질 때 상황이 인위적으로 만들어지고 "오, 봐요, 터미널이 때때로 거기에 지연이 있는 이유는 무엇입니까?"라는 스타일로 진술됩니다.

그런 조건에서도 "약 0.01%"라는 사실에 눈을 감자. 디테일은 지옥에! "병원의 평균 온도는 아무도 괴롭히지 않는다", "지연은 거래 중에 문제를 일으킨다", "우리는 HFT를 원한다"라고 말하면 충분하다.

게다가 우리는 HFT 가 오래된 사무실 데스크탑이나 죽은 가상 머신에 대한 20명의 전문가가 되기를 원합니다.

PS PositionSelectByTicket() 구현 시 액세스 동기화를 통해 공유 리소스에 무조건 액세스할 수 있습니다. 그리고 각 통화에서 위치를 선택하지 않으면 이전 가격을 읽는 것입니다. SymbolInfoDouble을 통해 "스냅샷"을 만드는 것이 더 쉬웠습니다.

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • www.mql5.com
Конечной целью трейдера является извлечение прибыли посредством торговых операций на финансовых рынках. В этой статье дается описание терминов и процессов торговой платформы MetaTarder 5, знание которых необходимо для правильного понимания работы торговых функций языка MQL5. Ордера — это принятые торговым сервером запросы на совершение торговых...
 
실시간 커널이 어떻게든 도움이 될까요?