초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 116

 
따라서 원칙적으로 내 표시기 핸들이 OnTick 함수에서 생성되고 데이터가 동일한 틱에 즉시 복사된다는 사실에 오류가 있었던 것 같습니다. 밤에 그것이 나를 깨우쳤습니다. 이제 핸들을 OnInit 함수로 옮기려고 합니다 .
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192 :
따라서 원칙적으로 내 표시기 핸들이 OnTick 함수에서 생성되고 데이터가 동일한 틱에 즉시 복사된다는 사실에 오류가 있었던 것 같습니다. 밤에 그것이 나를 깨우쳤습니다. 이제 핸들을 OnInit 함수로 옮기려고 합니다 .

도움이되지 않았습니다. 이제 코드가 있습니다.


#property version   "1.00"

input int                   InpFastEMA= 12 ;                 // Fast EMA period
input int                   InpSlowEMA= 26 ;                 // Slow EMA period
input int                   InpSignalMA= 9 ;                 // Signal MA period
input ENUM_APPLIED_PRICE    InpAppliedPrice= PRICE_CLOSE ;   // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit ()
  {
//---
  Handle1 = iMACD ( _Symbol , PERIOD_M5 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD ( _Symbol , PERIOD_M15 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD ( _Symbol , PERIOD_H1 , InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
         CopyBuffer (Handle1, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
        
         CopyBuffer (Handle2, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
        
         CopyBuffer (Handle3, 0 , 1 , 1 , MacdArray);
         Print (MacdArray[ 0 ], " " , GetLastError ());
  }
//+------------------------------------------------------------------+

로그에는 다음과 같은 메시지가 표시됩니다.

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988e-005 0

항상 이렇다. 복사 시 오류가 없습니다.

 
sss20192 : 도움이 되지 않았습니다. 이제 코드가 있습니다.

그러나 여전히 핸들이 성공적으로 생성 되었는지 확인하지 않고 표시기의 성공적인 계산에 대해 확인하지 않고 복사를 확인하지 않습니다. 그 자체로 핸들 초기화를 OnInit()로 전송한다는 아이디어는 정확합니다.

당신은 여전히 여기에 있습니다: line Print (MacdArray[ 0 ]); 본문 맨 처음에 OnTick() - 버퍼를 복사하기 전에 배열에 어떤 가비지 값이 포함되어 있는지 확인합니다.

추가하겠습니다. 물론 함수 자체 이후에 GetLastError ()를 사용하는 것은 프로그래밍 스타일 기능이 될 수 있습니다. 그러나 나는 여전히 디렉토리의 예를 확인하고 고려할 것입니다. 내가 틀리지 않았다면 GetLastError ()의 값이 항상 0이 아니므로 함수가 성공했음을 의미합니다.

 
Yedelkin :
그러나 여전히 핸들이 성공적으로 생성 되었는지 확인하지 않고 표시기의 성공적인 계산에 대해 확인하지 않고 복사를 확인하지 않습니다. 그 자체로 핸들 초기화를 OnInit()로 전송한다는 아이디어는 정확합니다.
하지만 처음으로만. 프로그램의 다른 위치에서 일부 핸들이 유효하지 않은 것으로 판명되면 다시 가져와야 합니다. 따라서 OnInit ()에서 핸들을 받기 위한 코드를 제거한다고 해서 문제가 완전히 해결되고 100% 맞다고 할 수는 없습니다. ))
 
CopyBuffer 함수 로 얼마나 많은 데이터를 복사했는지 확인해보니 항상 1을 기록한다. 그리고 에러는 없지만 데이터는 여전히 정확하지 않다.
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : 그 자체로 핸들 초기화를 OnInit()으로 옮기는 아이디어가 맞습니다.

하지만 처음으로만. 프로그램의 다른 위치에서 일부 핸들이 유효하지 않은 것으로 판명되면 다시 가져와야 합니다. 따라서 OnInit()에서 핸들을 수신하기 위한 코드를 제거한다고 해서 문제가 완전히 해결되고 100% 맞다고 말할 수는 없습니다. ))

핸들 초기화를 OnTick()에서 OnInit()으로 옮기는 아이디어 자체가 올바르지 않다는 말씀이신가요?
 
sss20192 :
CopyBuffer 함수 로 얼마나 많은 데이터를 복사했는지 확인해보니 항상 1을 기록한다. 그리고 에러는 없지만 데이터는 여전히 정확하지 않다.

테스터에 이 코드의 결과가 있습니다.

//---

테스트 전에 내가 한 유일한 것은 지표 값을 로그로 출력하기 전에 단순히 변환하는 것이었습니다.

 Print ( DoubleToString (MacdArray[ 0 ], Digits ()), " " , GetLastError ());
 
Yedelkin :
핸들 초기화를 OnTick()에서 OnInit()으로 옮기는 아이디어 자체가 올바르지 않다는 말씀이신가요?
OnInit ()에만 있고 다른 곳에서는 그렇지 않다면 그렇습니다. 처음으로 OnInit ()에서 핸들을 얻으려고 합니다. 다음으로 표시기 데이터를 가져오기 전에 핸들이 유효한지 확인합니다. 유효한 경우 데이터를 가져오고 그렇지 않은 경우 핸들을 다시 가져오려고 합니다.
 
tol64 :

테스터에 이 코드의 결과가 있습니다.

//---

테스트 전에 내가 한 유일한 것은 지표 값을 로그로 출력하기 전에 단순히 변환하는 것이었습니다.

와 대박! 매우 감사합니다! 3일째 문제를 풀다)
 
tol64 :
Yedelkin : OnTick()에서 OnInit()로 핸들 초기화를 전달한다는 아이디어 자체가 옳지 않다는 말씀이신가요?
OnInit()에만 있고 다른 곳에서는 그렇지 않다면 예 - 잘못된 것입니다. 처음으로 OnInit()에서 핸들을 얻으려고 합니다. 다음으로 표시기 데이터를 가져오기 전에 핸들이 유효한지 확인합니다. 유효한 경우 데이터를 가져오고 그렇지 않은 경우 핸들을 다시 가져오려고 합니다.

그리고 "만약" 없이? 그리고 이 특정한 상황과 관련하여? 인간의 경우 표시기 핸들은 각 틱 의 OnTick 함수 에서 생성되었으며 데이터는 동일한 틱에 즉시 복사되었습니다. 저것들. 유효성이나 무효를 확인하지 않고 매번 동일한 표시기의 핸들을 새로 요청했습니다. 이러한 배경에 대해 OnTick()에서 OnInit()으로 핸들 초기화를 전송하는 아이디어 자체가 올바르지 않다고 계속 주장하게 될 것입니다.

추신. 분명히 당신은 그 사람을 도왔으므로 질문이 해결 된 것으로 간주 될 수 있습니다.

사유: