ResetLastError();if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
{
Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
return( false );
}
//---if(GetLastError()==ERR_NO_ERROR)
{
ResetLastError();//--- Запоминаем время открытия бара
_m15OpenTime=iTime(NULL,PERIOD_M15,0);
//---Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
//--- Возвращаем истинуreturn( true );
}
가장 안정적인 솔루션은 실제로 OnCalculate() 호출 을 기다리고 거래 서버에 대한 연결 설정을 의무적으로 확인하는 것입니다. 연결(IsConnected())을 확인하지 않으면 터미널을 로드할 때 OnCalculate()에서도 다음을 얻습니다.
그러나 이것이 모든 질문을 해결하는 것은 아닙니다.
1. OnCalculate()에서 선임 TF의 데이터(최소한)를 수신하기 전에 호출해야 한다고 IsConnected()에 대한 문서에 작성되지 않은 이유는 무엇입니까?
2. OnTimer()의 IsConnected()가 실제로 작동하지 않는 이유는 무엇입니까? 결국, 무역 서버와 연결을 설정했다는 사실이 데이터를 수신할 수 있다는 것을 말해주지 않습니까?
3. 거래 서버와 연결을 설정하고 OnTimer()에서 데이터를 수신하려고 하기 때문에 데이터가 동일한 데이터에서 온 경우 iTime(), iBarShift(), SeriesInfoInteger() 및 유사한 함수가 오류를 반환해서는 안 됩니다. 정보를 가져오는 거래 서버가 아직 동기화되지 않았습니까? 그렇지 않으면 오류 4066을 반환한 다음 가지고 있는 데이터로 원하는 대로 생활하는 것과 같이 일종의 말도 안되는 것으로 판명됩니다.
나는 개발자들과 이야기를 나눴고 거기에 한 명의 친구가 있었고 나는 그들에게 1점씩 이야기했습니다.
1 넌센스, 언제 어디서나 전화를 걸 수 있습니다.
2 IsConnected는 코드의 어느 곳에서나 호출할 수 있고 작동하지만 오류 스택에 아무 것도 쓰지 않는 함수이며 true/false를 반환하고 그게 전부입니다. 접속 절차가 상당히 길고(최소 1초), 로그인 시작 시점에 이미 IsConnected가 트리거된 것을 감안할 때, 접속 상태를 확인하고 단말의 조건에서 시세 흐름이 시작될 때까지 기다려야 한다. 시작.
3 이 함수는 또한 오류 스택에 아무 것도 쓰지 않으며 자체적으로 작업 결과를 반환합니다.
4066이 발생한 이유는 TimeCurrent 함수의 오류였습니다. 로그인이 있었고, 서버에서 터미널이 요청한 시간, 연결 품질에 따라 시간이 걸립니다. 이 또한 빠른 타이머가 있다는 것을 잊지 마십시오. 그리고 TimeCurrent의 요청에 따라 4066을 받았습니다. 그리고 나서 우리는 시간을 가졌고 우리의 기능은 정상적으로 작동하기 시작했습니다; 그들은 자신의 작업 결과로 오류 스택을 우회하여 오류를 반환합니다.
이러한 상황에서 권장하는 퀵 타이머와 단말의 시작, 서버에서 데이터 수신을 시작했는지 반드시 확인하십시오. 내 버전은 약간의 목발입니다. 데이터 수신 시작에 대해 OnCalculate에서 신호를 수신하는 것이 정확할 것입니다.
그렇습니다. OnInit()에서는 결과를 확인하지 않고 필요한 TF를 호출하기만 하면 되고(거기에 의존할 수 없음) 이미 OnCalculate에서 IsTFDataReady() 함수를 호출합니다. 요청된 모든 TF에 대해 true가 반환되는 즉시 표시기 알고리즘 실행을 시작할 수 있습니다.
1. OnCalculate()에서 선임 TF의 데이터(최소한)를 수신하기 전에 호출해야 한다고 IsConnected()에 대한 문서에 작성되지 않은 이유는 무엇입니까?
IsConnected()는 다소 까다로운 함수입니다. 서버에 대한 연결 중 하나만 상태를 반환합니다. 그러나 터미널은 둘 이상의 연결을 사용합니다. 8개의 거래 흐름만 존재하므로 IsConnected()가 true를 반환하더라도 이것이 의미하는 바가 완전히 명확하지 않습니다. 최소한 시계열을 요청하고 구축할 수는 없습니다. IsConnected()가 false를 반환하면 터미널이 여전히 오프라인 상태인지 확인할 수 있습니다.
일반적으로 터미널 연결 의 존재가 중요한 어떤 종류의 작업이 해결되고 있습니까? 내가 이해하기로는 지표는 데이터 시각화 도구입니다. 사용 가능한 데이터입니다. 새로운 데이터가 들어오면 시각화를 업데이트합니다. 그것에서 데이터의 관련성 확인이 필요하지 않아야합니다. 이것은 터미널의 작업입니다.
IsConnected()는 다소 까다로운 함수입니다. 서버에 대한 연결 중 하나만 상태를 반환합니다. 그러나 터미널은 둘 이상의 연결을 사용합니다. 8개의 거래 흐름만 존재하므로 IsConnected()가 true를 반환하더라도 이것이 의미하는 바가 완전히 명확하지 않습니다. 최소한 시계열을 요청하고 구축할 수는 없습니다. IsConnected()가 false를 반환하면 터미널이 여전히 오프라인 상태인지 확인할 수 있습니다.
일반적으로 터미널 연결 의 존재가 중요한 어떤 종류의 작업이 해결되고 있습니까? 내가 이해하기로는 지표는 데이터 시각화 도구입니다. 사용 가능한 데이터입니다. 새로운 데이터가 들어오면 시각화를 업데이트합니다. 그것에서 데이터의 관련성 확인이 필요하지 않아야합니다. 이것은 터미널의 작업입니다.
표시기에서 서버와의 연결, 기록에 무엇이 있는지 확인해야 할 필요성을 기억하지 못합니다. 그런 다음 그리기, 기록이 로드되었습니다. 즉, 모든 표시기 버퍼를 다시 계산합니다.
나는 어드바이저에서 다음과 같은 기능을 만들어 사용하고 있는데, 원칙적으로 서버와 연결이 잘 맞는지 확인한다.
bool ServerDisable( int count= 10 ){
if ( IsTesting ()|| IsOptimization ()) return ( false );
for ( int i= 0 ;i<count;i++){
if ( IsConnected ())
if ( IsTradeAllowed ())
if (! IsTradeContextBusy ()){ RefreshRates (); return ( false );}
Sleep ( 157 );
}
Print ( __FUNCTION__ , " Торговый сервер не отвечает" );
return ( true );}
특히 Sleep()을 사용하여 터미널에 제어를 전달한 다음 다시 서버와의 연결 및 거래 가능성을 확인합니다.
MT4에 대해 이야기하고 있습니다. 2-3년 전에 저는 Time[0]에서 버그를 잡았습니다. 개발자가 수정한 것 같지만 시간이 지남에 따라 다시 나타납니다. 문제는 이 버그를 명확하게 재현하는 것이 불가능하다는 것입니다.
그것이 어렵지 않다면 여기에 주제의 주제가 있습니다. 이전 TF의 올바른 히스토리 로드, 여기에 표시기가 있습니다. 이전 TF의 "Masha를 가져와야 합니다." 5분 이내에 정확히 98% 올바르게 작동합니다. 이 코드에서 버그를 유발하는 2%의 "함정"이 어디 있습니까?
MT4에 대한 올바른 코드에 관심
#property copyright"IgorM"#property link"https://www.mql5.com/ru/users/igorm"#property version"1.00"#property strict#property indicator_separate_window#property indicator_buffers1#property indicator_plots1//--- plot line1#property indicator_label1"line1"#property indicator_type1DRAW_LINE#property indicator_color1clrRed#property indicator_style1STYLE_SOLID#property indicator_width11//--- input parametersinputENUM_TIMEFRAMES TimeFrame = PERIOD_H4 ;
inputint MAPeriod = 25 ;
//--- indicator buffersdouble BufMA[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit ()
{
double cl[];
//--- indicator buffers mappingSetIndexBuffer ( 0 ,BufMA);
IndicatorDigits ( Digits );
// запускаем подгрузку истории и выходим, даже не проверяя подгружена она или нет, история тут еще не нужнаCopyClose ( _Symbol ,TimeFrame, 0 , iBars ( _Symbol ,TimeFrame),cl);
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate ( constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---int i,limit,resultcopy;
double closetf[];
if (prev_calculated== 0 )
{
resultcopy= CopyClose ( _Symbol ,TimeFrame, 0 , iBars ( _Symbol ,TimeFrame),closetf);
if (resultcopy< 0 )
{
Print ( "Подгрузка истории...." );
return ( 0 );
}
if (resultcopy<MAPeriod)
{
Comment ( "Большой период МА!!!, в истории доступно " , resultcopy, " баров" );
return (resultcopy);
}
limit=resultcopy- 1 ;
} else {
resultcopy= CopyClose ( _Symbol ,TimeFrame, 0 , iBars ( _Symbol ,TimeFrame),closetf);
if (resultcopy< 0 )
{
Print ( "Подгрузка истории...." );
return ( 0 );
}
if (resultcopy<MAPeriod)
{
Comment ( "Большой период МА!!!, в истории доступно " , resultcopy, " баров" );
return (resultcopy);
}
limit=resultcopy-prev_calculated+ 1 ;
}
limit = fmin (rates_total- 1 ,limit);
// основной цикл расчета индикатора
for (i=limit; i>= 0 && ! IsStopped (); i--)
{
BufMA[i]= iMA ( _Symbol ,TimeFrame,MAPeriod, 0 , MODE_SMA , PRICE_CLOSE ,i);
}
//---return (resultcopy);
}
나는 개발자들과 이야기를 나눴고 거기에 한 명의 친구가 있었고 나는 그들에게 1점씩 이야기했습니다.
1 넌센스, 언제 어디서나 전화를 걸 수 있습니다.
2 IsConnected는 코드의 어느 곳에서나 호출할 수 있고 작동하지만 오류 스택에 아무 것도 쓰지 않는 함수이며 true/false를 반환하고 그게 전부입니다. 연결 절차가 상당히 길고(최소 1초 이상) 로그인 시작 시점에 이미 IsConnected가 트리거된 것을 감안하면 단말의 조건에서 연결 상태를 확인하고 시세 흐름이 시작될 때까지 기다려야 한다. 시작.
3 이 함수는 또한 오류 스택에 아무 것도 쓰지 않으며 자체적으로 작업 결과를 반환합니다.
4066이 발생한 이유는 TimeCurrent 함수의 오류였습니다. 로그인이 있었고, 서버에서 터미널이 요청한 시간, 연결 품질에 따라 시간이 걸립니다. 이 또한 빠른 타이머가 있다는 것을 잊지 마십시오. 그리고 TimeCurrent의 요청에 따라 4066을 받았습니다. 그리고 나서 우리는 시간을 가졌고 우리의 기능은 정상적으로 작동하기 시작했습니다; 그들은 자신의 작업 결과로 오류 스택을 우회하여 오류를 반환합니다.
이러한 상황에서 권장하는 퀵 타이머와 단말의 시작, 서버에서 데이터 수신을 시작했는지 반드시 확인하십시오. 내 버전은 약간의 목발입니다. 데이터 수신 시작에 대해 OnCalculate에서 신호를 수신하는 것이 정확할 것입니다.
1. 내가 쓴 것을 주의 깊게 읽으십시오. 내가 처음으로 말하는게 아니야! 어디선가 착신금지 얘기를 하지 않았어요!
모든 iBarShift() , iTime() , SeriesInfo...() 함수가 TimeCurrent() 시간을 묻는다는 말씀이신가요?
가장 안정적인 솔루션은 실제로 OnCalculate() 호출 을 기다리고 거래 서버에 대한 연결 설정을 의무적으로 확인하는 것입니다. 연결(IsConnected())을 확인하지 않으면 터미널을 로드할 때 OnCalculate()에서도 다음을 얻습니다.
그러나 이것이 모든 질문을 해결하는 것은 아닙니다.
1. OnCalculate()에서 선임 TF의 데이터(최소한)를 수신하기 전에 호출해야 한다고 IsConnected()에 대한 문서에 작성되지 않은 이유는 무엇입니까?
2. OnTimer()의 IsConnected()가 실제로 작동하지 않는 이유는 무엇입니까? 결국, 무역 서버와 연결을 설정했다는 사실이 데이터를 수신할 수 있다는 것을 말해주지 않습니까?
3. 거래 서버와 연결을 설정하고 OnTimer()에서 데이터를 수신하려고 하기 때문에 데이터가 동일한 데이터에서 온 경우 iTime(), iBarShift(), SeriesInfoInteger() 및 유사한 함수가 오류를 반환해서는 안 됩니다. 정보를 가져오는 거래 서버가 아직 동기화되지 않았습니까? 그렇지 않으면 오류 4066을 반환한 다음 가지고 있는 데이터로 원하는 대로 생활하는 것과 같이 일종의 말도 안되는 것으로 판명됩니다.
나는 개발자들과 이야기를 나눴고 거기에 한 명의 친구가 있었고 나는 그들에게 1점씩 이야기했습니다.
1 넌센스, 언제 어디서나 전화를 걸 수 있습니다.
2 IsConnected는 코드의 어느 곳에서나 호출할 수 있고 작동하지만 오류 스택에 아무 것도 쓰지 않는 함수이며 true/false를 반환하고 그게 전부입니다. 접속 절차가 상당히 길고(최소 1초), 로그인 시작 시점에 이미 IsConnected가 트리거된 것을 감안할 때, 접속 상태를 확인하고 단말의 조건에서 시세 흐름이 시작될 때까지 기다려야 한다. 시작.
3 이 함수는 또한 오류 스택에 아무 것도 쓰지 않으며 자체적으로 작업 결과를 반환합니다.
4066이 발생한 이유는 TimeCurrent 함수의 오류였습니다. 로그인이 있었고, 서버에서 터미널이 요청한 시간, 연결 품질에 따라 시간이 걸립니다. 이 또한 빠른 타이머가 있다는 것을 잊지 마십시오. 그리고 TimeCurrent의 요청에 따라 4066을 받았습니다. 그리고 나서 우리는 시간을 가졌고 우리의 기능은 정상적으로 작동하기 시작했습니다; 그들은 자신의 작업 결과로 오류 스택을 우회하여 오류를 반환합니다.
이러한 상황에서 권장하는 퀵 타이머와 단말의 시작, 서버에서 데이터 수신을 시작했는지 반드시 확인하십시오. 내 버전은 약간의 목발입니다. 데이터 수신 시작에 대해 OnCalculate에서 신호를 수신하는 것이 정확할 것입니다.
문제를 해결하기 위해 무엇을 제안합니까(당신의 생각에는 그것이 존재합니까)? OnCalculate()가 1-2번 호출 될 때까지 기다리시겠습니까?
그렇습니다. OnInit()에서는 결과를 확인하지 않고 필요한 TF를 호출하기만 하면 되고(거기에 의존할 수 없음) 이미 OnCalculate에서 IsTFDataReady() 함수를 호출합니다. 요청된 모든 TF에 대해 true가 반환되는 즉시 표시기 알고리즘 실행을 시작할 수 있습니다.
1. OnCalculate()에서 선임 TF의 데이터(최소한)를 수신하기 전에 호출해야 한다고 IsConnected()에 대한 문서에 작성되지 않은 이유는 무엇입니까?
IsConnected()는 다소 까다로운 함수입니다. 서버에 대한 연결 중 하나만 상태를 반환합니다. 그러나 터미널은 둘 이상의 연결을 사용합니다. 8개의 거래 흐름만 존재하므로 IsConnected()가 true를 반환하더라도 이것이 의미하는 바가 완전히 명확하지 않습니다. 최소한 시계열을 요청하고 구축할 수는 없습니다. IsConnected()가 false를 반환하면 터미널이 여전히 오프라인 상태인지 확인할 수 있습니다.
일반적으로 터미널 연결 의 존재가 중요한 어떤 종류의 작업이 해결되고 있습니까? 내가 이해하기로는 지표는 데이터 시각화 도구입니다. 사용 가능한 데이터입니다. 새로운 데이터가 들어오면 시각화를 업데이트합니다. 그것에서 데이터의 관련성 확인이 필요하지 않아야합니다. 이것은 터미널의 작업입니다.
아마도 우리는 OHLC의 준비가 MT4와 동일하지 않은 MQL5에 대해 여전히 이야기하고 있을 것입니다.
MT4에 대해 이야기하고 있습니다. 2-3년 전에 저는 Time[0]에서 버그를 잡았습니다. 개발자가 수정한 것 같지만 시간이 지남에 따라 다시 나타납니다. 문제는 이 버그를 명확하게 재현하는 것이 불가능하다는 것입니다.
IsConnected()는 다소 까다로운 함수입니다. 서버에 대한 연결 중 하나만 상태를 반환합니다. 그러나 터미널은 둘 이상의 연결을 사용합니다. 8개의 거래 흐름만 존재하므로 IsConnected()가 true를 반환하더라도 이것이 의미하는 바가 완전히 명확하지 않습니다. 최소한 시계열을 요청하고 구축할 수는 없습니다. IsConnected()가 false를 반환하면 터미널이 여전히 오프라인 상태인지 확인할 수 있습니다.
일반적으로 터미널 연결 의 존재가 중요한 어떤 종류의 작업이 해결되고 있습니까? 내가 이해하기로는 지표는 데이터 시각화 도구입니다. 사용 가능한 데이터입니다. 새로운 데이터가 들어오면 시각화를 업데이트합니다. 그것에서 데이터의 관련성 확인이 필요하지 않아야합니다. 이것은 터미널의 작업입니다.
표시기에서 서버와의 연결, 기록에 무엇이 있는지 확인해야 할 필요성을 기억하지 못합니다. 그런 다음 그리기, 기록이 로드되었습니다. 즉, 모든 표시기 버퍼를 다시 계산합니다.
나는 어드바이저에서 다음과 같은 기능을 만들어 사용하고 있는데, 원칙적으로 서버와 연결이 잘 맞는지 확인한다.
특히 Sleep()을 사용하여 터미널에 제어를 전달한 다음 다시 서버와의 연결 및 거래 가능성을 확인합니다.
MT4에 대해 이야기하고 있습니다. 2-3년 전에 저는 Time[0]에서 버그를 잡았습니다. 개발자가 수정한 것 같지만 시간이 지남에 따라 다시 나타납니다. 문제는 이 버그를 명확하게 재현하는 것이 불가능하다는 것입니다.
그것이 어렵지 않다면 여기에 주제의 주제가 있습니다. 이전 TF의 올바른 히스토리 로드, 여기에 표시기가 있습니다. 이전 TF의 "Masha를 가져와야 합니다." 5분 이내에 정확히 98% 올바르게 작동합니다. 이 코드에서 버그를 유발하는 2%의 "함정"이 어디 있습니까?
MT4에 대한 올바른 코드에 관심
나는 개발자들과 이야기를 나눴고 거기에 한 명의 친구가 있었고 나는 그들에게 1점씩 이야기했습니다.
1 넌센스, 언제 어디서나 전화를 걸 수 있습니다.
2 IsConnected는 코드의 어느 곳에서나 호출할 수 있고 작동하지만 오류 스택에 아무 것도 쓰지 않는 함수이며 true/false를 반환하고 그게 전부입니다. 연결 절차가 상당히 길고(최소 1초 이상) 로그인 시작 시점에 이미 IsConnected가 트리거된 것을 감안하면 단말의 조건에서 연결 상태를 확인하고 시세 흐름이 시작될 때까지 기다려야 한다. 시작.
3 이 함수는 또한 오류 스택에 아무 것도 쓰지 않으며 자체적으로 작업 결과를 반환합니다.
4066이 발생한 이유는 TimeCurrent 함수의 오류였습니다. 로그인이 있었고, 서버에서 터미널이 요청한 시간, 연결 품질에 따라 시간이 걸립니다. 이 또한 빠른 타이머가 있다는 것을 잊지 마십시오. 그리고 TimeCurrent의 요청에 따라 4066을 받았습니다. 그리고 나서 우리는 시간을 가졌고 우리의 기능은 정상적으로 작동하기 시작했습니다; 그들은 자신의 작업 결과로 오류 스택을 우회하여 오류를 반환합니다.
이러한 상황에서 권장하는 퀵 타이머와 단말의 시작, 서버에서 데이터 수신을 시작했는지 반드시 확인하십시오. 내 버전은 약간의 목발입니다. 데이터 수신 시작에 대해 OnCalculate에서 신호를 수신하는 것이 정확할 것입니다.
1. 내가 쓴 것을 주의 깊게 읽으십시오. 내가 처음으로 말하는게 아니야! 어디선가 착신금지 얘기를 하지 않았어요!
모든 iBarShift() , iTime() , SeriesInfo...() 함수가 TimeCurrent() 시간을 묻는다는 말씀이신가요?