MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 771

 
Igor Zakharov :

그냥 달력이 아닙니다. 30일전(일요일,토요일)

shift 매개변수가 없는 함수로 판단하면 5k로 하고 있는데 4번째 분기에서 질문이 나왔네요 :)

예, 30개 막대는 어제부터 21영업일입니다. (2019년 2월 24일 - 2019년 1월 25일)

나는 얻었다

월 평균 촛불 크기 : 598

주당 평균 양초 크기: 519

그리고 iATR()은 10자리 숫자를 제공합니다...

그래서 아직도 사용법을 잘 모르겠습니다.

 
Alexander Layzerevich :

그리고 iATR()은 10자리 숫자를 제공합니다...

일반적으로 소수점 이하 자릿수(예: 가격. 포인트로 변환하려면 _Point로 나누어야 함).

그림 참조: 오늘 유로/달러 - 해당 월의 일일 포인트 560점.


 
Igor Zakharov :

일반적으로 소수점 이하 자릿수(예: 가격. 포인트로 변환하려면 _Point로 나누어야 함).

그림 참조: 오늘 유로/달러 - 월별 560 일일 포인트.


MQL4에서 확인되었습니다. 나는 이것을 다음과 같이 얻는다.

IATR

 
Igor Zakharov :

일반적으로 소수점 이하 자릿수(예: 가격. 포인트로 변환하려면 _Point로 나누어야 함).

그림 참조: 오늘 유로/달러 - 월별 560 일일 포인트.


MQL5에서 확인되었습니다. 테스트를 위해 다음 코드를 작성했습니다.

 //************************************************************************************************/
double iPointOrderStep()
{
   int Awerage30 = ( iATR ( Symbol (), PERIOD_D1 , 21 ));
   Print ( "Awerage30 = " , Awerage30);
   int Awerage7 = ( iATR ( Symbol (), PERIOD_D1 , 5 ));
   Print ( "Awerage7 = " , Awerage7);
   
   double iPointOrderStep = NormalizeDouble (((Awerage30+Awerage7)/ 2 ), 0 );
   Print ( "iPointOrderStep = " , iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/

출력은 다음과 같습니다.

IATR

저것들. 그것은 한 가지를 보여 주지만 다른 가치를 부여합니다 ...

 
Alexander Layzerevich :

MQL5에서 확인되었습니다. 테스트를 위해 다음 코드를 작성했습니다.

출력은 다음과 같습니다.

저것들. 그것은 한 가지를 보여 주지만 다른 가치를 부여합니다 ...

MQL5에서 표시기와 함께 작업하는 이 구성은 적합하지 않습니다.

   int Awerage30 = ( iATR ( Symbol (), PERIOD_D1 , 21 ));
   Print ( "Awerage30 = " , Awerage30);

먼저 방금 수행한 핸들을 생성해야 하며 그 후에는 CopyBuffer 에서 이미 값을 가져올 수 있습니다.

 // этот код в Init()
      int handleATR= iATR (Symbol(), PERIOD_D1 ,21);
       if (handleATR== INVALID_HANDLE ) return ;

// это уже в сам советник/индикатор: OnTick()
       double hATR[];
       CopyBuffer (handleATR, 0 , 0 , 1 ,hATR);
// double ATR = hATR[0]; // здесь значение ATR
 
Vitaly Muzichenko :

MQL5에서 표시기와 함께 작업하는 이 구성은 적합하지 않습니다.

먼저 방금 수행한 핸들을 생성해야 하며 그 후에는 CopyBuffer 에서 이미 값을 가져올 수 있습니다.

감사합니다. 코드를 살펴보고 다시 작성하겠습니다.

저는 MT4로 작성하고 #include <MT4Orders.mqh>를 사용하여 MT5에서 테스트합니다.

라이브러리가 표시기를 지원하지 않을 수 있습니다.

 
Alexander Layzerevich :

감사합니다. 코드를 살펴보고 다시 작성하겠습니다.

저는 MT4로 작성하고 #include <MT4Orders.mqh>를 사용하여 MT5에서 테스트합니다.

라이브러리가 표시기를 지원하지 않을 수 있습니다.

예, 거래 기능 만 있습니다.

 
Alexander Layzerevich :

감사합니다. 코드를 살펴보고 다시 작성하겠습니다.

저는 MT4로 작성하고 #include <MT4Orders.mqh>를 사용하여 MT5에서 테스트합니다.

라이브러리가 표시기를 지원하지 않을 수 있습니다.

이것은 두 플랫폼을 결합하는 매우 빠른 옵션이며 작동하지만 mql5에서는 이 작업을 수행하지 않는 것이 좋습니다.

 double ATR( string symb, ENUM_TIMEFRAMES tf, int period, int index) {
 #ifdef __MQL4__
   return ( iATR (symb,tf,period,index));
 #else
   double buf[ 1 ];
   int handle= iATR (symb,tf,period);
   if (handle< 0 ) {
     PrintFormat ( "Failed to create handle ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
   } else {
     if ( CopyBuffer (handle, 0 ,index, 1 ,buf)< 0 ) {
     PrintFormat ( "Failed to copy data from the indicator ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }

음, mql4와 같은 방식으로 표시기를 적용하십시오.

 double atr=ATR( Symbol (), PERIOD_D1 , 30 );
 
Vitaly Muzichenko :

이것은 두 플랫폼을 결합하는 매우 빠른 옵션이며 작동하지만 mql5에서는 이 작업을 수행하지 않는 것이 좋습니다.

음, mql4와 같은 방식으로 표시기를 적용하십시오.

코드 주셔서 감사합니다.

다음과 같이 밝혀졌습니다.

 //************************************************************************************************/
double iPointOrderStep()
{
   double Awerage30 = ( int )((ATR( Symbol (), PERIOD_D1 , 21 , 1 ))/ Point ());
//   Print ("Awerage30 = ", Awerage30);
   double Awerage7 = ( int )((ATR( Symbol (), PERIOD_D1 , 5 , 1 ))/ Point ());
//   Print ("Awerage7 = ", Awerage7);
   
   double iPointOrderStep = NormalizeDouble (((Awerage30+Awerage7)/ 2 / 6 ), 0 );
//   Print ("iPointOrderStep = ", iPointOrderStep);
   return (iPointOrderStep);
}   
//************************************************************************************************/
double ATR( string symb, ENUM_TIMEFRAMES tf, int period, int index) {
 #ifdef __MQL4__
   return ( iATR (symb,tf,period,index));
 #else
   double buf[ 1 ];
   int handle= iATR (symb,tf,period);
   if (handle< 0 ) {
     PrintFormat ( "Failed to create handle ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
   } else {
     if ( CopyBuffer (handle, 0 ,index, 1 ,buf)< 0 ) {
     PrintFormat ( "Failed to copy data from the indicator ATR %s/%s, Error: %d" ,symb,sTF(tf), GetLastError ());
     return ( WRONG_VALUE );
    }
   }
   return (buf[ 0 ]);
 #endif
 }
//************************************************************************************************/

이제 Expert Advisor를 시작할 때 평균 데이터를 얻었습니다. 그리고 이 데이터는 함수가 호출될 때마다 다시 계산됩니다.

순환을 제한하려면 계산된 데이터로 버퍼 레코드를 만들어야 합니다.

재계산을 위한 조건을 설정해야 하는 것으로 나타났습니다. "월요일"에 버퍼에 아무것도 없으면 (로봇 재시작)

저것들. 변수 선언 bufferStep = -1; 그리고 OnTick() 에서 bufferStep <0 또는 "월요일"이면 다시 계산합니다.

여기에 다시 플러그가 있습니다. 로봇이 오늘이 "월요일"임을 어떻게 알릴 수 있습니까?

 
Alexander Layzerevich :

코드를 주셔서 감사합니다.

다음과 같이 밝혀졌습니다.

이제 Expert Advisor를 시작할 때 평균 데이터를 얻었습니다. 그리고 이 데이터는 함수가 호출될 때마다 다시 계산됩니다.

순환을 제한하려면 계산된 데이터로 버퍼 레코드를 만들어야 합니다.

재계산을 위한 조건을 설정해야 하는 것으로 나타났습니다. "월요일"에 버퍼에 아무것도 없으면 (로봇 재시작)

저것들. 변수 선언 bufferStep = -1; OnTick() 에서 bufferStep <0 또는 "월요일"이면 다시 계산합니다.

여기에 다시 플러그가 있습니다. 로봇이 오늘이 "월요일"임을 어떻게 알릴 수 있습니까?

글쎄, 어떻게 든 나는 월요일을 사용하지 않을 것이고, 나는 단지 며칠 전을 사용할 것입니다. 그리고 각 틱 에 대한 계산으로 어드바이저를 로드하지 않도록 값은 각각의 새 막대에 수신됩니다.