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

 
Karputov Vladimir :
지표에서 또는 EA/스크립트에서?
표시기에서.
 

Yuri Evseenkov :

fromme2you :

또 다른 질문: MT4 및 MQL 코드 실행 환경의 개발자를 어떻게 긴장시켜 그가 (그들이) 내 예나 유사한 의미에서 예외 처리를 위한 언어 개발에 마음과 손을 쏟을 수 있습니까?


서비스 데스크에 연락하여 포럼에 주제/설문조사를 작성하십시오.

얼마 전까지만 해도 MT4는 일반적으로 묻혔습니다. 이제 추세는 바뀌지 않았다면 적어도 최근에 플랫폼과 언어가 크게 현대화되었습니다.

Renata의 오늘 게시물 참조:

레나트 파트훌린 :

...

MT4의 개발은 중단 되었으며 화장품으로만 수정될 것입니다.

 
Alex :

안녕하세요. 아는 사람이이 문제를 해결하는 방법을 알아내는 데 도움을 줄 수 있습니까? 예를 들어 마지막 50개 막대를 분석하여 특정 시간(예: 01:00)의 막대 시가를 찾아야 합니다 . mql5에서 작업에 더 잘 접근하는 방법을 모르겠습니다.


현재 날짜 계산 + 필요한 시간 추가, 그리고 이미 날짜 추가를 통해 이 방법은 mql4에서 작동했습니다.

mql5에는 시간 출력이 있는 특수 구조가 있지만 어떤 이유로 인해 작동하지 않는 것으로 알고 있습니다.

답변에 미리 감사드립니다.

누군가가 생각의 방향을 이해하기 위해 코드를 던진다면 매우 감사할 것입니다.
알렉스 :
표시기에서.

여기서는 나중에 더 잘 이해할 수 있도록 막대의 번호를 먼저 살펴보는 것이 좋습니다. 즉, 먼저 MQL5 표시기에서 가장 오른쪽 막대에 번호가 매겨지는 방식을 정확히 이해해야 합니다.

이렇게 하려면 표시기의 OnCalculate에서 다음 주석 출력을 입력합니다.

 //+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,Buffer, INDICATOR_DATA );
//---
   ArrayInitialize (Buffer, 1 );
//---
   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[])
  {
//---
   Comment ( "rates_total=" , IntegerToString (rates_total),
           ", time[rates_total-1]=" , TimeToString (time[rates_total- 1 ], TIME_DATE | TIME_MINUTES | TIME_SECONDS ));

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

이 코드는 다음과 같은 결과를 제공합니다.

기본적으로 MQL5 표시기 배열의 번호 지정

즉, 기본적으로 MQL5 표시기 배열에서 가장 오른쪽 막대의 인덱스는 "rates_total-1"과 같습니다.

질문으로 돌아가서 - 마지막 50개 막대를 가져와서 통과해야 합니다. 또한 막대 여는 시간(time[] 배열)을 분석하여 막대 시간이 지정된 시간과 같으면 이 막대의 인덱스를 기억하십시오. 그런 다음 이 인덱스를 사용하여 open[] 배열에서 시가를 가져옵니다.

다음과 같이 보입니다.

 //+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property indicator_chart_window
#property indicator_plots    0
//--- input parameters
input datetime time_open= D'01:00' ;     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                           // время искомого бара (минуты)
bool first_start= false ;                 // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   MqlDateTime str1;
   TimeToStruct (time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start= false ;
//---
   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[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if (!first_start)
     {
       int index=- 1 ;
       for ( int i=rates_total- 1 ;i>rates_total- 1 - 50 ;i--)
        {
         MqlDateTime str2;
         TimeToStruct (time[i],str2);
         if (str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start= true ;
             Print ( "Бар " , IntegerToString (i), " имеет время открытия " , TimeToString (time[i], TIME_DATE | TIME_MINUTES | TIME_SECONDS ),
                   " и цену открытия " , DoubleToString (open[i], Digits ()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir :

여기서는 나중에 더 잘 이해할 수 있도록 막대의 번호를 먼저 살펴보는 것이 좋습니다. 즉, 먼저 MQL5 표시기에서 가장 오른쪽 막대에 번호가 매겨지는 방식을 정확히 이해해야 합니다.

이렇게 하려면 표시기의 OnCalculate에서 다음 주석 출력을 입력합니다.

이 코드는 다음과 같은 결과를 제공합니다.


즉, 기본적으로 MQL5 표시기 배열에서 가장 오른쪽 막대의 인덱스는 "rates_total-1"과 같습니다.

질문으로 돌아가서 - 마지막 50개 막대를 가져와서 통과해야 합니다. 또한 막대 여는 시간(time[] 배열)을 분석하여 막대 시간이 지정된 시간과 같으면 이 막대의 인덱스를 기억하십시오. 그런 다음 이 인덱스를 사용하여 open[] 배열에서 시가를 가져옵니다.

다음과 같이 보입니다.

Karputov Vladimir, 감사합니다. 나는 이것을 정리할 것이다. mql5에서는 시계열에 대한 액세스가 더 유연해진 것처럼 보이지만 "아마추어 초심자" 프로그래머에게는 모든 것이 더 복잡해졌습니다. :))
 
Alex :
Karputov Vladimir, 감사합니다. 나는 이것을 정리할 것이다. mql5에서는 시계열에 대한 액세스가 더 유연해진 것처럼 보이지만 "아마추어 초심자" 프로그래머에게는 모든 것이 더 복잡해졌습니다. :))
습관의 문제. 그러면 모든 것이 체계적이고 쉽고 정확하다는 것을 이해하게 될 것입니다.
 
Karputov Vladimir :
습관의 문제. 그러면 모든 것이 구조화되고 쉽고 정확하다는 것을 이해하게 될 것입니다.

또 다른 질문입니다. 옵션

 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])


내가 이해하는 한, 그들은 지표가 적용되는 쌍에 대한 책임이 있습니다. 그리고 다른 통화 쌍의 도움으로 동일한 정보를 꺼낼 수 없습니까? 즉, Copy ... 기능을 통해서만 동일한 OCHL 어레이를 만드는 보다 보편적인 솔루션을 얻을 수 있습니까?
 
Alex :

또 다른 질문입니다. 옵션

내가 이해하는 한, 그들은 지표가 적용되는 쌍에 대한 책임이 있습니다. 그리고 다른 통화 쌍의 도움으로 동일한 정보를 꺼낼 수 없습니까? 즉, Copy ... 기능을 통해서만 동일한 OCHL 어레이를 만드는 보다 보편적인 솔루션을 얻을 수 있습니까?
외래 기호에 액세스할 때 이해하고 알아야 하는 뉘앙스가 있습니다. 데이터 액세스 구성 . 즉, 다른 심볼의 시계열 데이터를 요청하는 경우 먼저 이 데이터가 준비되어 있는지 확인해야 합니다. 이것은 다른 사람의 기호에서 요청한 데이터의 정확성을 확인하는 유일한 방법입니다.
 
Karputov Vladimir :
외래 기호에 액세스할 때 이해하고 알아야 하는 뉘앙스가 있습니다. 데이터 액세스 구성 . 즉, 다른 심볼의 시계열 데이터를 요청하는 경우 먼저 이 데이터가 준비되어 있는지 확인해야 합니다. 이것은 다른 사람의 캐릭터에서 요청한 데이터의 정확성을 확인할 수 있는 유일한 방법입니다.

이해했다. 고맙습니다.

또 다른 질문: Print() 함수에서 항상 값을 문자열 유형으로 변환합니다. 어떤 목적으로 이 작업을 수행하고 있습니까? 번역이 없으면 int, double 등의 유형은 Print()에서도 동일한 방식으로 표시됩니다.

 
Alex :

이해했다. 고맙습니다.

또 다른 질문: Print() 함수에서 항상 값을 문자열 유형으로 변환합니다. 어떤 목적으로 이 작업을 수행하고 있습니까? 번역이 없으면 int, double 등의 유형은 Print()에서도 동일한 방식으로 표시됩니다.

숫자가 컴퓨터의 메모리에 저장되는 방식과 표시되는 방식은 매우 다릅니다. 특히 부동 소수점 숫자의 경우 소수점 이하 자릿수를 제한하는 것이 항상 더 좋습니다.

따라서 나는 항상 인쇄를 통해 숫자 출력의 형식을 올바르게 지정하려고 합니다. IntegerToStringDoubleToString 을 사용합니다.

 
Karputov Vladimir :

숫자가 컴퓨터의 메모리에 저장되는 방식과 표시되는 방식은 매우 다릅니다. 특히 부동 소수점 숫자의 경우 소수점 이하 자릿수를 제한하는 것이 항상 더 좋습니다.

따라서 나는 항상 인쇄를 통해 숫자 출력의 형식을 올바르게 지정하려고 합니다. IntegerToStringDoubleToString 을 사용합니다.

답변과 인내에 감사드립니다.


블라디미르, 아마도 나는 이미 당신을 고문했을 것입니다 :) 그러나 기본의 기본을 따라 이동하는 것이 매우 어렵습니다. 복사 기능으로 테스트 작업을 하려고 했는데... Printe에 숫자가 있지만 표시기가 그려지지 않습니다... 아무것도 이해하지 못합니다.


 //+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link        ""
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot UpBar
#property indicator_label1   "UpBar"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1   clrGreen
#property indicator_style1   STYLE_SOLID
#property indicator_width1   6
//--- plot DnBar
#property indicator_label2   "DnBar"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2   clrRed
#property indicator_style2   STYLE_SOLID
#property indicator_width2   6
//--- input parameters
input int    Histori= 30 ;
input ENUM_TIMEFRAMES TimeFrame= 0 ; 
input string   Simvol= "EURUSD" ;
//--- indicator buffers
double          UpBar[];
double          DnBar[];
double          O_Price[];
double          C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,UpBar, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,UpBar, INDICATOR_DATA );
   SetIndexBuffer ( 2 ,O_Price, INDICATOR_CALCULATIONS );
   SetIndexBuffer ( 3 ,C_Price, INDICATOR_CALCULATIONS );



   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[])
 {
ArraySetAsSeries (O_Price, true );
ArraySetAsSeries (C_Price, true );
CopyOpen (Simvol,TimeFrame, 0 ,Histori,O_Price);
CopyClose (Simvol,TimeFrame, 0 ,Histori,C_Price);

     for ( int t= 3 ; t<Histori; t++) 
       {
          UpBar[t]= MathAbs ( NormalizeDouble ((O_Price[t]-C_Price[t]), Digits ()));   
           Print ( DoubleToString (UpBar[t], Digits ()));
       }

   return (rates_total);
  }
사유: