기고글 토론 "MQL5 Cookbook: 가격 다이버전스를 분석하기 위한 다중 기호 지표 개발"

 

새로운 기고글 MQL5 Cookbook: 가격 다이버전스를 분석하기 위한 다중 기호 지표 개발 가 게재되었습니다:

이 글에서는 지정된 기간의 가격 다이버전스를 분석하기 위해 다중 기호 지표의 개발을 고려할 것입니다. 핵심 주제는 다중 통화 표시기 프로그래밍에 대한 이전 글 "MQL5 Cookbook: MQL5의 다중기호 변동성 지표 개발"에서 이미 논의되었습니다. 따라서 이번에는 극적으로 변경된 새로운 기능에 대해서만 설명하겠습니다. 다중 통화 표시기 프로그래밍이 처음이라면 먼저 이전 글을 읽는 것이 좋습니다.

"수직선" 모드의 주간 시간대

이 글에서는 다음 질문을 고려할 것입니다.

  • 차트 속성 변경.
  • CHARTEVENT_OBJECT_DRAG(차트 개체 끌기) 및 CHARTEVENT_CHART_CHANGE(차트 크기 조정 또는 속성 대화 상자 창을 사용하여 차트 속성 수정) 이벤트 처리.
  • 둘 이상의 색상을 사용하는 렌더링 표시기 버퍼.
  • 차트 고/저를 설정하기 위해 가시성 영역 내의 표시기 버퍼에서 고점과 저점을 정의합니다.
  • 시리즈의 반전.

작성자: Anatoli Kazharski

 

그냥 오타인가요, 아니면 정말 그래야 하나요?

아무리 여러 번 시도해도 '복사 팀'의 모든 함수가 0을 반환하지 않고 -1 또는 >0만 반환합니다.

//+------------------------------------------------------------------+
//| 모든 문자에 대해 사용 가능한 데이터 수를 확인합니다 ||.
//+------------------------------------------------------------------+
bool CheckAvailableData()
  {
   int attempts=100;
   
//---
   for(int s=0; s<SYMBOLS_COUNT; s++)
     {
      //--- 그런 문자가 있는 경우
      if(symbol_names[s]!=empty_symbol)
        {
datetime time[];                    // 배열로 막대 개수 확인
   int      total_period_bars   =0;    // 현재 기간의 막대 수
   datetime terminal_first_date =NULL; // 터미널에서 현재 기간의 사용 가능한 데이터의 첫 번째 날짜
         //--- 터미널에서 현재 기간 데이터의 첫 번째 날짜를 가져옵니다.
         terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
         //--- 지정된 날짜부터 사용 가능한 막대 수를 가져옵니다.
         total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
         //--- 이 막대의 준비 상태 확인
         for(int i=0; i<attempts; i++)
           {
            //--- 지정된 양의 데이터를 복사합니다.
            if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
              {
               //--- 필요한 양이 복사되면 루프를 중지합니다.
               if(ArraySize(time)>=total_period_bars)
                  break;
              }
           }
         //--- 복사된 데이터가 적으면 다시 시도해야 합니다.
         if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
           {
            msg_last=msg_prepare_data;
            ShowCanvasMessage(msg_prepare_data);
            OC_prev_calculated=0;
            return(false);
           }
        }
     }
//--- 가격 차이의 시작점에 대해 수직선 모드인 경우 종료합니다.
   if(StartPriceDivergence==VERTICAL_LINE)
      return(true);
   else
     {
      datetime time[];                    // 배열로 막대 개수 확인
      int      total_period_bars   =0;    // 현재 기간의 막대 수
      datetime terminal_first_date =NULL; // 터미널에서 현재 기간의 사용 가능한 데이터의 첫 번째 날짜
      //--- 터미널에서 현재 기간 데이터의 첫 번째 날짜를 가져옵니다.
      for(int i=0; i<attempts; i++)
         if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
            break;
      //--- 지정된 날짜부터 사용 가능한 막대 수를 가져옵니다.
      for(int i=0; i<attempts; i++)
         if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
            break;
      //--- 이 막대의 준비 상태 확인
      for(int i=0; i<attempts; i++)
         //--- 지정된 양의 데이터를 복사합니다.
         if(CopyTime(Symbol(),timeframe_start_point,
            terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
            break;
      //--- 복사된 데이터가 적으면 다시 시도해야 합니다.
      if(ArraySize(time)<=0 || total_period_bars<=0)
        {
         msg_last=msg_prepare_data;
         ShowCanvasMessage(msg_prepare_data);
         OC_prev_calculated=0;
         return(false);
        }
     }
//---
   return(true);
  }
 
Fleder:

그냥 오타인가요, 아니면 정말 그래야 하나요?

아무리 여러 번 시도해도 '복사 팀'의 모든 함수는 0을 반환하지 않고 -1 또는 >0만 반환합니다.

일반적으로는 >0을 반환해야 하지만 이 경우에는 후속 검사에서 0을 반환하지 않습니다.
 
tol64:
일반적으로 >0을 수행해야 하지만 이 경우 후속 확인을 통해 수행하지 않아도 됩니다.

그러나 이 표현식은 항상 참입니다:

if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
 
Fleder:

그러나 이 표현식은 항상 참입니다:

if를 아예 제거할 수 있습니다. 이 경우에는 중요하지 않습니다.
 
tol64:
if를 아예 제거할 수도 있습니다. 이 경우 중요하지 않습니다.
글쎄요, 그게 제 생각입니다 :-)
 

일반적으로 심볼에 대한 기록 데이터 로딩은 도움말에 기록된 방식대로 이루어지지 않습니다.

실제로는 다음과 같이 발생합니다:

예를 들어 mql5 프로그램에서 CopyTime 함수를 사용하여 일부 시계열 데이터를 요청하는 경우

함수를 사용하여 데이터를 요청했는데 이 데이터가 터미널에 없는 경우(아직 로드되지 않은 경우) 터미널은 요청된 양이 아닌 서버에서 이 데이터를 다운로드합니다(도움말 예제에서는 100바),

그러나 "차트의 최대 막대" 매개변수가 허용하는 만큼 필요한 시계열의 막대를 RAM에 "배치"할 수 있습니다.

전체 기록이 서버에서 다운로드되므로 더 높은 기간의 막대 하나만 요청하면 충분합니다(예: PERIOD_W1).

 
Fleder:

일반적으로 심볼에 대한 기록 데이터 로딩은 도움말에 기록된 방식대로 이루어지지 않습니다.

실제로는 다음과 같이 발생합니다:

예를 들어 mql5 프로그램에서 CopyTime 함수를 사용하여 일부 시계열 데이터를 요청하는 경우

함수를 사용하여 데이터를 요청했는데 이 데이터가 터미널에 없는 경우(아직 로드되지 않은 경우) 터미널은 요청된 양이 아닌 서버에서 이 데이터를 다운로드합니다(도움말 예제에서는 100바),

그러나 "차트의 최대 막대" 매개변수가 허용하는 만큼 필요한 시계열의 막대를 RAM에 "배치"할 수 있습니다.

더 높은 기간의 막대 하나만 요청하면 충분합니다(예: PERIOD_W1). 그러면전체 기록이 서버에서 다운로드됩니다.

도움말은 원하는 모든 것을 말할 수 있습니다. 원하는 대로 자유롭게 하세요. ;)

도움말의 예는 다른 문서인 다른 프로그램용 메타트레이더 5 시세 준비 방법 >>>에서 설명했습니다.

 
tol64:

인증서에는 원하는 내용이 무엇이든 적을 수 있습니다. 원하는 대로 자유롭게 작성할 수 있습니다. ;)

도움말의 예는 다른 문서인 다른 프로그램용 메타트레이더 5 견적 준비 방법 >>>에서 설명했습니다.

그게 제가 한 일입니다. 방금 코드에서 서버의 나머지 "언로드 된 바"를 계산하는 것을 보았습니다.

그리고 나는 터미널이 신경 쓰지 않고 형성하는 데 필요한만큼 펌핑한다고 생각했습니다.

 

글의 마지막에"이 지표는 더 나은 방향으로 무한히 발전할 수 있습니다" 라고 썼습니다.

제 생각에는 가격 차이를 고려하는 것은 인간의 눈에는 거의 쓸모가 없습니다. 인간은 로봇이 아니니까요!

하지만 로봇에게는 흥미로운 주제입니다.

몇 가지 렌더링 옵션을 제안하셨습니다:

1. 라인에서.

2. "하루."

저는 현재 "주" 모드에서만 비슷한 작업을 하고 있습니다.

 
Fleder:

글의 마지막에"이 지표는 더 나은 방향으로 무한히 발전할 수 있습니다" 라고 썼습니다.

제 생각에는 가격 차이를 고려하는 것은 인간의 눈에는 거의 쓸모가 없습니다. 인간은 로봇이 아니니까요!

하지만 로봇에게는 흥미로운 주제입니다.

몇 가지 렌더링 옵션을 제안하셨습니다:

1. 라인에서.

2. "하루."

저도 현재 "주" 모드로만 비슷한 작업을 하고 있습니다.

다른 문제를 다루고 있기 때문에 조만간 다른 글을 쓸 수 있을지 잘 모르겠습니다. 하지만 이 기사에 따르면 개발은 아직 다중 통화 계산과 캔버스에서 이러한 계산을 시각화하는 단계라고 합니다.

예, 사람은 로봇이 아니지만 때로는 아이디어를 얻기 위해 다른 방식으로 연구 주제를 살펴볼 필요가 있습니다. ;)