타이머를 사용하는 것이 좋습니다. 당신은 그것이 당신에게 효과가 없다고 대답했습니다. 나는 당신이 시도한 것의 예를 물었습니다. 그러나 당신은 이미 한 것보다 더 자세한 내용을 게시할 수 없다고 말했습니다.
이제 다른 남자가 당신에게 타이머를 제안했고 당신은 그것에 만족하는 것 같습니다. ;-)
죄송합니다. 지금까지 말씀하신 내용을 이해하지 못했습니다. 나는 당신을 knave의 파트너로 간주하고 아무도 작동하는 모델을 게시하지 않았기 때문에 현상금이 50%가 되도록 규칙을 정하겠습니다. 두 사람에게 맥주를 사주는 게 어때? 진심으로, 저에게 BTC 주소를 알려주시면 두 분 모두 보상을 받을 수 있도록 하겠습니다. :)
나는 이것을 서비스 데스크와 함께 끝내고 있지만 MetaQuotes가 이것을 읽는 경우를 대비하여 나는 이것이 여전히 플랫폼의 주요 결함 이라고 생각합니다. 이것이 스레딩의 문제인 경우 코드에 임의로(추정된 양) 대기 시간을 던지는 것보다 이러한 유형의 이벤트 를 처리하는 더 나은 방법이 있어야 합니다.
샘플 코드로 더 구체적인 질문을 게시하세요. 버그가 있을 수 있습니다. 접근 방식은 저에게 효과적입니다.
다음은 실패한 표시기 액세스의 코드 예입니다. 반복, 새로고침, 대기(두 가지 다른 대기 방법) 후에도.
//| THROWAWAY.mq5 |
//| nicholishen |
//| www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link "www.reddit.com/u/nicholishenFX"
#property version "1.00"
#property indicator_chart_window
#include <Indicators\Trend.mqh>
#include <errordescription.mqh>
CiMA ima;
int m_bufferSize = - 1 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
static int iCnt = 0 ;
//--- indicator buffers mapping
Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
//---
return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int tickCnt = 0 ;
tickCnt++;
//---
if (rates_total != prev_calculated || m_bufferSize < 1 ){
ResetLastError ();
datetime createTime = TimeCurrent ();
ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
ima.Refresh(); //no wait time!
CIndicatorBuffer *buff = ima.At( 0 );
m_bufferSize = buff.Total();
int call = 0 ;
int sleep = 200 ;
// try with Sleep function ...
while (buff.Total() <= 0 && call < 10 ){
Sleep (sleep);
ima.Refresh(); // Refreshed 10x since create
m_bufferSize = buff.Total();
call++;
Print ( __LINE__ , " " , __FUNCTION__ , " " ,buff.Name(),
" Buffer size = " ,m_bufferSize, " | Call (" ,
call, ")" , " Sleep(" ,sleep, ")"
);
sleep+= 100 ;
}
// try wait with looping
if (buff.Total() <= 0 ){
datetime waitTime = timeLoop(createTime);
Print ( "Time Between Create and Refresh() = " , TimeToString (waitTime, TIME_SECONDS ));
ima.Refresh();
m_bufferSize = buff.Total();
}
if (m_bufferSize < 1 ){
Print (ErrorDescription( GetLastError ()));
return (rates_total);
} else {
for ( int i= 0 ;i<m_bufferSize;i++){
if (i> 2 ) return (rates_total);
else {
Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
" Buffer size = " ,m_bufferSize,
" | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
DoubleToString (ima.Main(i), _Digits ),
" | Tick-count = " ,tickCnt
);
}
}
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason){
}
datetime timeLoop( datetime timeIn){
int cnt = 0 ;
while ( TimeCurrent () - timeIn < 10 && ! IsStopped ()){
Comment ( "Time looping i = " ,cnt);
cnt++;
}
return TimeCurrent () - timeIn;
}
출력은 다음과 같습니다.
-----------------------2017.01.31 23:48:03---------------------- -------
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(1) 슬립(200)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(2) 슬립(300)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(3) 슬립(400)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(4) 슬립(500)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(5) 슬립(600)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(6) 슬립(700)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(7) 슬립(800)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(8) 슬립(900)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(9) 슬립(1000)
60 OnCalculate MAIN_LINE 버퍼 크기 = -1 | 콜(10) 슬립(1100)
생성과 Refresh() 사이의 시간 = 00:00:11
요청한 데이터를 찾을 수 없음
81 OnCalculateMAIN_LINE 버퍼 크기 = 1024 | H1 iMA(0) 값 = 113.227 | 틱 수 = 2
81 OnCalculateMAIN_LINE 버퍼 크기 = 1024 | H1 iMA(1) 값 = 113.269 | 틱 수 = 2
81 OnCalculateMAIN_LINE 버퍼 크기 = 1024 | H1 iMA(2) 값 = 113.313 | 틱 수 = 2
다음은 실패한 표시기 액세스의 코드 예입니다. 반복, 새로고침, 대기(두 가지 다른 대기 방법) 후에도.
수면은 지표에서 작동하지 않습니다. 인터페이스 스레드를 중단할 수 없습니다.
대신 OnTimer()를 사용해 보십시오.
수면은 지표에서 작동하지 않습니다. 인터페이스 스레드를 중단할 수 없습니다.
대신 OnTimer()를 사용해 보십시오.
그게 다야! 그것이 해결 방법입니다! 나는 당신에게 키스할 수 있습니다!
이렇게 하면 OnInit()가 플랫폼으로 돌아가고 OnTimer()가 플랫폼을 건너뛰고 두 번째 패스를 호출할 수 있습니다. EventSetMillisecondTimer를 1ms로 설정하고 한 번만 호출했는데 이제 작동합니다.
//| THROWAWAY.mq5 |
//| nicholishen |
//| www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link "www.reddit.com/u/nicholishenFX"
#property version "1.00"
#property indicator_chart_window
#include <Indicators\Trend.mqh>
#include <errordescription.mqh>
CiMA ima;
int m_bufferSize = - 1 ;
bool timedEvent = false ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit ()
{
int waitMS = 1 ;
Print ( "-----------------------" , TimeCurrent (), "--------------------------" );
ima.Create( _Symbol , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
EventSetMillisecondTimer (waitMS);
Print ( "OnTimer set to " ,waitMS, " ms" );
//---
return ( INIT_SUCCEEDED );
}
void OnTimer ()
{
//---
ima.Refresh();
EventKillTimer ();
timedEvent = true ;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
static int tickCnt = 0 ;
tickCnt++;
if (!timedEvent) return rates_total;
//---
if (rates_total != prev_calculated || m_bufferSize < 1 ){
ResetLastError ();
CIndicatorBuffer *buff = ima.At( 0 );
m_bufferSize = buff.Total();
if (m_bufferSize <= 0 ) ima.Refresh();
// try wait with looping
if (m_bufferSize < 1 ){
Print (ErrorDescription( GetLastError ()));
} else {
for ( int i= 0 ;i<m_bufferSize;i++){
if (i> 2 ) break ;
else {
Print ( __LINE__ , " " , __FUNCTION__ ,buff.Name(),
" Buffer size = " ,m_bufferSize,
" | " ,ima.PeriodDescription(), " iMA(" ,i, ") value = " ,
DoubleToString (ima.Main(i), _Digits ),
" | Tick-count = " ,tickCnt
);
}
}
}
}
//--- return value of prev_calculated for next call
return (rates_total);
}
//+------------------------------------------------------------------+
산출:
-----------------------2017.02.01 01:31:01---------------------- -------
OnTimer가 1ms로 설정됨
75 OnCalculateMAIN_LINE 버퍼 크기 = 1024 | H1 iMA(0) 값 = 113.142 | 틱 수 = 2
75 OnCalculateMAIN_LINE 버퍼 크기 = 1024 | H1 iMA(1) 값 = 113.181 | 틱 수 = 2
그게 다야! 그것이 해결 방법입니다! 나는 당신에게 키스할 수 있습니다!
그게 다야! 그것이 해결 방법입니다! 나는 당신에게 키스할 수 있습니다!
시원한!
타이머를 사용하는 것이 좋습니다. 당신은 그것이 당신에게 효과가 없다고 대답했습니다. 나는 당신이 시도한 것의 예를 물었습니다. 그러나 당신은 이미 한 것보다 더 자세한 내용을 게시할 수 없다고 말했습니다.
이제 다른 남자가 당신에게 타이머를 제안했고 당신은 그것에 만족하는 것 같습니다. ;-)
시원한!
타이머를 사용하는 것이 좋습니다. 당신은 그것이 당신에게 효과가 없다고 대답했습니다. 나는 당신이 시도한 것의 예를 물었습니다. 그러나 당신은 이미 한 것보다 더 자세한 내용을 게시할 수 없다고 말했습니다.
이제 다른 남자가 당신에게 타이머를 제안했고 당신은 그것에 만족하는 것 같습니다. ;-)
시원한!
타이머를 사용하는 것이 좋습니다. 당신은 그것이 당신에게 효과가 없다고 대답했습니다. 나는 당신이 시도한 것의 예를 물었습니다. 그러나 당신은 이미 한 것보다 더 자세한 내용을 게시할 수 없다고 말했습니다.
이제 다른 남자가 당신에게 타이머를 제안했고 당신은 그것에 만족하는 것 같습니다. ;-)
알겠습니다. 은행 송금과 모든 주요 신용 카드를 사용할 수 있습니다. $100 아닌가요?
100달러?! ...더 준다고 했는데...
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
[MQL5 BUG] [해결됨]다른 작업 시간 프레임의 표시기에서 호출/생성될 때 표시기가 제대로 인스턴스화되지 않습니다.
Stanislav Korotky , 2017.02.01 09:27
시원한!
타이머를 사용하는 것이 좋습니다. 당신은 그것이 당신에게 효과가 없다고 대답했습니다. 나는 당신이 시도한 것의 예를 물었습니다. 그러나 당신은 이미 한 것보다 더 자세한 내용을 게시할 수 없다고 말했습니다.
이제 다른 남자가 당신에게 타이머를 제안했고 당신은 그것에 만족하는 것 같습니다. ;-)
죄송합니다. 지금까지 말씀하신 내용을 이해하지 못했습니다. 나는 당신을 knave의 파트너로 간주하고 아무도 작동하는 모델을 게시하지 않았기 때문에 현상금이 50%가 되도록 규칙을 정하겠습니다. 두 사람에게 맥주를 사주는 게 어때? 진심으로, 저에게 BTC 주소를 알려주시면 두 분 모두 보상을 받을 수 있도록 하겠습니다. :)
거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼
[MQL5 BUG] [해결됨]다른 작업 시간 프레임의 표시기에서 호출/생성될 때 표시기가 제대로 인스턴스화되지 않습니다.
Alain Verleyen , 2017.02.01 10:36
이제 MT5 버그가 수정되었습니다...나는 특히 당신의 모든 도움에 대해 감사하고 싶습니다... 당신의 겸허함이 없었다면 나는 내가 어디에서 노력할 동기를 찾았을지 모릅니다! /에스
진심으로, 저에게 BTC 주소를 알려주시면 두 분 모두 보상을 받을 수 있도록 하겠습니다. :)