CPU를 로드할 때 이러한 지연을 우회하는 것이 불가능한 이유를 완전히 이해하지 못합니다. 이 일에 무능할 가능성이 큽니다.
그러나 아래는 MT5의 가격 데이터 신선도 문제를 보여주는 깨끗한 테스트입니다. 코드가 주석 처리되었습니다. 간단히 말해서, 틱은 SymbolInfoTick/DOM 을 통해 취해지며 서로에 대해 확인됩니다. 특히, 간격이 없고 다른 소스의 동일한 틱 사이에 큰 지연이 없도록 합니다.
// Демонстрация лагов OnTick и OnBookEvent.inputuint inMinInterval = 1000 ; // Минимальное время (в мкс.) лага// Структура тика, которую удобно будет выводить в ArrayPrint.struct PRICE
{
double bid;
double ask;
bool onTick; // true - источник OnTick+SymbolInfoTick, false - источник OnBookEvent+MarketBookGetulong Interval; // Временной интервал между соседними записями.void Set( constdouble &dBid, constdouble &dAsk, constbool bTick )
{
staticulong PrevTime = :: GetMicrosecondCount ();
constulong NewTime = :: GetMicrosecondCount ();
this .bid = dBid;
this .ask = dAsk;
this .onTick = bTick;
this .Interval = NewTime - PrevTime;
PrevTime = NewTime;
}
// Записи одинаковые, если обе соответствующие цены совпадают.booloperator ==( const PRICE &Price ) const
{
return (( this .bid == Price.bid) && ( this .ask == Price.ask));
}
};
PRICE Prices[ 1000 ]; // Массив для записи тиков из разных источников.int Amount = 0 ; // Количество записанных тиков// Возвращает bid/ask-цены из стакана.bool GetCurrentPrices( double &bid, double &ask )
{
MqlBookInfo Bands[];
constbool Res = MarketBookGet ( _Symbol , Bands);
if (Res)
for ( int i = ArraySize (Bands) - 2 ; i >= 0 ; i--)
if (Bands[i].type == BOOK_TYPE_SELL )
{
ask = Bands[i].price;
bid = Bands[i + 1 ].price;
break ;
}
return (Res);
}
// Если bid или ask стакана поменялся - записываем их.bool SaveNewTick_Book()
{
staticdouble PrevBid = 0 ;
staticdouble PrevAsk = 0 ;
double bid;
double ask;
constbool Res = ! IsStopped () && GetCurrentPrices(bid, ask) && ((PrevBid != bid) || (PrevAsk != ask));
if (Res)
{
PrevBid = bid;
PrevAsk = ask;
Prices[Amount++].Set(bid, ask, false );
if (Amount == ArraySize (Prices)) // Если достигли конца массива - выходим.ExpertRemove ();
}
return (Res);
}
// Записываем bid и askbool SaveNewTick_Tick()
{
MqlTick Tick;
constbool Res = ! IsStopped () && SymbolInfoTick ( _Symbol , Tick);
if (Res)
{
Prices[Amount++].Set(Tick.bid, Tick.ask, true );
if (Amount == ArraySize (Prices)) // Если достигли конца массива - выходим.ExpertRemove ();
}
return (Res);
}
// Проверка на наличие багов и задержек.void Check()
{
if (Amount > 3 )
{
if ((Prices[Amount - 1 ].onTick == Prices[Amount - 2 ].onTick) && // Три подряд записи из одного источника - баг.
(Prices[Amount - 2 ].onTick == Prices[Amount - 3 ].onTick))
Alert ( "BUG!" );
elseif ((Prices[Amount - 1 ] == Prices[Amount - 2 ]) && // Если цены подряд идущих записей совпадают
(Prices[Amount - 1 ].Interval > inMinInterval)) // И временной интервал между ними большой - информируем.
{
Alert ((Prices[Amount - 1 ].onTick ? "OnTick-lag! - " : "OnBook-lag! - " ) + ( string )Prices[Amount - 1 ].Interval + " mcs." );
ArrayPrint (Prices, _Digits , NULL , Amount - 4 , 4 ); // Выводим подробно проблему.
}
}
}
intOnInit ()
{
return (! MarketBookAdd ( _Symbol )); // Подписались на стакан.
}
voidOnBookEvent ( conststring &Symb )
{
if ((Symb == _Symbol ) && SaveNewTick_Book()) // Если записали новые цены из стакана,
Check(); // проверяем.
}
voidOnTick ()
{
if (SaveNewTick_Tick()) // Если записали цены тика,
Check(); // проверяем.
}
voidOnDeinit ( constint )
{
MarketBookRelease ( _Symbol ); // Отписались от стакана.ArrayPrint (Prices, _Digits , NULL , 0 , Amount); // Вывод всех записей.
}
결과(하나의 MT5-b2656만 머신에서 실행되고 CPU 로드는 약 0이고 차트는 하나, 테스터는 사용되지 않음).
CPU가 로드된 경우(예: 최적화가 모든 코어에 적용되지 않는 경우) SymbolInfoTick은 최대 수십 밀리초까지 실행할 수 있습니다. 터미널에서 가장 많이 요구되는 기능이 정기적으로 스냅샷되지 않는 이유 - 답이 없습니다. 가능하면 스냅샷을 찍습니다. 그리고 CPU 부하가 0인 경우에도 OnTick 기능은 터미널에 온 틱보다 수십 밀리초 늦게 작동할 수 있음을 잊지 마십시오.
CPU가 로드된 경우(예: 최적화가 모든 코어에 적용되지 않는 경우) SymbolInfoTick은 최대 수십 밀리초까지 실행할 수 있습니다. 터미널에서 가장 많이 요구되는 기능이 정기적으로 스냅샷되지 않는 이유 - 답이 없습니다. 가능하면 스냅샷을 찍습니다. 그리고 CPU 부하가 0인 경우에도 OnTick 기능은 터미널에 온 틱보다 수십 밀리초 늦게 작동할 수 있음을 잊지 마십시오.
대체적으로 좀 아쉽긴 한데 원시적으로 장사하시는 분들은 걱정 안하셔도 됩니다.
"원시적이지 않은" 거래를 하는 사람들을 위해: 철은 작업에 상응해야 합니다.
"모든 코어에도 적용되지 않음" - "6/8"에 대해 말씀하시는 건가요? 저것들. 6개의 프로세스가 있고 테스트 전체 기간 동안 각각 하나의 CPU 코어를 100% 사용합니까? 그리고 물리적 코어가 4개뿐인가요? 그리고 그러한 배경에 대해 테스트가 "느려진다"는 사실에 놀랐습니까?
이것이 정말로 당신의 이해 수준이라면 "공부하고, 공부하고, 다시 공부하십시오."
16-20개의 스레드로 CPU를 강간하고 싶다면 - 최소한 20개의 물리적 코어가 있는 CPU를 구입하십시오.
"모든 코어에도 적용되지 않음" - "6/8"에 대해 말씀하시는 건가요? 저것들. 6개의 프로세스, 그리고 테스트의 전체 기간 동안 각각 하나의 CPU 코어를 사용하여 100%입니까? 그리고 물리적 코어가 4개뿐인가요? 그리고 그러한 배경에 대해 테스트가 "느려진다"는 사실에 놀랐습니까?
이것이 정말로 당신의 이해 수준이라면 "공부하고, 공부하고, 다시 공부하십시오."
16-20개의 스레드로 CPU를 강간하고 싶은 경우 - 최소한 20개의 물리적 코어가 있는 CPU를 구입하십시오.
귀하의 구현에서 현재 가격을 얻는 것이 매우 느리다는 것을 증명할 수 있다고 확신합니다. 그리고 CPU 로드는 MQL5에서 가장 중요한 기능을 잘못 구현했기 때문에 이러한 브레이크를 생성합니다.
당신은 그것을 어떻게합니까?
6/8 에이전트가 실행 중일 때 브레이크를 재현했습니다.
6/8 에이전트가 실행 중일 때 브레이크를 재현했습니다.
저것들. 문제는 CPU가 로드될 때입니다.
MQ-데모, 20개 차트, b2656. 기계에서 터미널만 실행되고 테스터는 작동하지 않습니다.
6/8 에이전트가 실행 중일 때 브레이크를 재현했습니다.
저것들. 문제는 CPU가 로드될 때입니다.
이것은 당신을 위한 새로운 정보입니까?
이것은 당신을 위한 새로운 정보입니까?
CPU를 로드할 때 이러한 지연을 우회하는 것이 불가능한 이유를 완전히 이해하지 못합니다. 이 일에 무능할 가능성이 큽니다.
그러나 아래는 MT5의 가격 데이터 신선도 문제를 보여주는 깨끗한 테스트입니다. 코드가 주석 처리되었습니다. 간단히 말해서, 틱은 SymbolInfoTick/DOM 을 통해 취해지며 서로에 대해 확인됩니다. 특히, 간격이 없고 다른 소스의 동일한 틱 사이에 큰 지연이 없도록 합니다.
결과(하나의 MT5-b2656만 머신에서 실행되고 CPU 로드는 약 0이고 차트는 하나, 테스터는 사용되지 않음).
재생을 확인하십시오.
빠르게 언로드된 기계의 소계.
개발자를 위한 질문입니다.
SymbolInfoTick에 5ms가 걸렸다고 가정해 보겠습니다. 눈금이 현재 시간 또는 5ms 전과 일치합니까?
SymbolInfoTick 브레이크의 주제를 닫습니다. 결론은 이것입니다.
CPU가 로드된 경우(예: 최적화가 모든 코어에 적용되지 않는 경우) SymbolInfoTick은 최대 수십 밀리초까지 실행할 수 있습니다. 터미널에서 가장 많이 요구되는 기능이 정기적으로 스냅샷되지 않는 이유 - 답이 없습니다. 가능하면 스냅샷을 찍습니다. 그리고 CPU 부하가 0인 경우에도 OnTick 기능은 터미널에 온 틱보다 수십 밀리초 늦게 작동할 수 있음을 잊지 마십시오.
대체적으로 좀 아쉽긴 한데 원시적으로 장사하시는 분들은 걱정 안하셔도 됩니다.
SymbolInfoTick 브레이크의 주제를 닫습니다. 결론은 이것입니다.
CPU가 로드된 경우(예: 최적화가 모든 코어에 적용되지 않는 경우) SymbolInfoTick은 최대 수십 밀리초까지 실행할 수 있습니다. 터미널에서 가장 많이 요구되는 기능이 정기적으로 스냅샷되지 않는 이유 - 답이 없습니다. 가능하면 스냅샷을 찍습니다. 그리고 CPU 부하가 0인 경우에도 OnTick 기능은 터미널에 온 틱보다 수십 밀리초 늦게 작동할 수 있음을 잊지 마십시오.
대체적으로 좀 아쉽긴 한데 원시적으로 장사하시는 분들은 걱정 안하셔도 됩니다.
"원시적이지 않은" 거래를 하는 사람들을 위해: 철은 작업에 상응해야 합니다.
"모든 코어에도 적용되지 않음" - "6/8"에 대해 말씀하시는 건가요? 저것들. 6개의 프로세스가 있고 테스트 전체 기간 동안 각각 하나의 CPU 코어를 100% 사용합니까? 그리고 물리적 코어가 4개뿐인가요? 그리고 그러한 배경에 대해 테스트가 "느려진다"는 사실에 놀랐습니까?
이것이 정말로 당신의 이해 수준이라면 "공부하고, 공부하고, 다시 공부하십시오."
16-20개의 스레드로 CPU를 강간하고 싶다면 - 최소한 20개의 물리적 코어가 있는 CPU를 구입하십시오.
"원시적이지 않은" 거래를 하는 사람들을 위해: 철은 작업에 상응해야 합니다.
"모든 코어에도 적용되지 않음" - "6/8"에 대해 말씀하시는 건가요? 저것들. 6개의 프로세스, 그리고 테스트의 전체 기간 동안 각각 하나의 CPU 코어를 사용하여 100%입니까? 그리고 물리적 코어가 4개뿐인가요? 그리고 그러한 배경에 대해 테스트가 "느려진다"는 사실에 놀랐습니까?
이것이 정말로 당신의 이해 수준이라면 "공부하고, 공부하고, 다시 공부하십시오."
16-20개의 스레드로 CPU를 강간하고 싶은 경우 - 최소한 20개의 물리적 코어가 있는 CPU를 구입하십시오.
귀하의 구현에서 현재 가격을 얻는 것이 매우 느리다는 것을 증명할 수 있다고 확신합니다. 그리고 CPU 로드는 MQL5에서 가장 중요한 기능을 잘못 구현했기 때문에 이러한 브레이크를 생성합니다.
귀하의 구현에서 현재 가격을 얻는 것이 매우 느리다는 것을 증명할 수 있다고 확신합니다. 그리고 CPU 로드는 MQL5에서 가장 중요한 기능을 잘못 구현했기 때문에 이러한 브레이크를 생성합니다.
테스트 코드:
입증하다.