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

 
KolyanSNA :
안녕하세요! 터미널에서 글꼴 크기 를 변경하는 방법은 무엇입니까? 누구든지 제안할 수 있습니까?

아마도 그러한 필요가 있다면 OS 디스플레이 설정에서 스케일을 변경하는 것이 도움이 될 것입니다.

 

차트에서 마우스를 클릭했을 때 키보드의 버튼이 눌렸는지 여부를 OnChartEvent 에서 어떻게든 결정할 수 있습니까?

 

지표를 이해하는 데 도움을 요청합니다.

여기에서 각각의 새로운 막대 가 열릴 때 재계산이 이루어져야 합니다.

논리 - 지그재그는 최저점(두 개의 이웃 막대 아래에 있는 마지막 3개 막대의 평균 중 낮은 값)과 최고점(두 개의 이웃 막대 위에 있는 마지막 3개 막대 평균의 최고점)을 직렬로 연결해야 합니다.

상단에 새로운 상단이 오고, 지표가 새로운 것으로 다시 그려지고, 이전 것이 삭제된다면, 이해할 수 있다고 생각합니다.

사실 지표는 모든 고점과 저점을 직렬로 연결하는데 무엇이 문제인가?

 #property indicator_chart_window
#property indicator_buffers 2 
#property indicator_plots    1 
//--- plot ZigZag 
#property indicator_label1    "ZigZag" 
#property indicator_type1    DRAW_ZIGZAG 
#property indicator_color1    clrBlue 
#property indicator_style1    STYLE_SOLID 
#property indicator_width1    1 
//--- indicator buffers 
double          ZigZagBuffer1[]; 
double          ZigZagBuffer2[]; 
double a = 0 ;
int last = 0 ; //В последний раз была вершина или низина 
int lastN = 0 ; //Номер бара с экстремумом
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit () 
  { 
//--- связывание массивов и индикаторных буферов 
   SetIndexBuffer ( 0 ,ZigZagBuffer1, INDICATOR_DATA ); 
   SetIndexBuffer ( 1 ,ZigZagBuffer2, INDICATOR_DATA ); 
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0 ); 
   ArrayInitialize (ZigZagBuffer1, EMPTY_VALUE );
   ArrayInitialize (ZigZagBuffer2, EMPTY_VALUE );
//--- значение 0 (пустое значение) не будет участвовать в отрисовке 
   PlotIndexSetString ( 0 , PLOT_LABEL , "ZigZag1;ZigZag2" ); 
//--- 
   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[]) 
{ 
   if (a != iOpen ( _Symbol , PERIOD_CURRENT , 0 ))
   {
      a = iOpen ( _Symbol , PERIOD_CURRENT , 0 );
       for ( int i = Bars ( _Symbol , PERIOD_CURRENT ) - 3 ; i > 0 ; i--)
      {
         if (high[i] <= high[i+ 1 ] && high[i+ 2 ] <= high[i+ 1 ] && low[i] >= low[i+ 1 ] && low[i+ 2 ] >= low[i+ 1 ]) //В обе стороны на одном баре
         {
             if (last == 0 ) continue ; //Если с этого начинается расчет - пропускаем просто
             if (last == 1 ) //Если была вершина
            {
               if (high[lastN] > high[i+ 1 ]) //Если новая верщина не перебила старую
               {
                  ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
                  ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
                  lastN = i+ 1 ;
                   continue ;
               }
               //Если перебила
               ZigZagBuffer1[lastN] = EMPTY_VALUE ;
               ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
               ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
               last = - 1 ;
               lastN = i+ 1 ;
               continue ;
            }
             if (last == - 1 )
            {
               if (low[lastN] < low[i+ 1 ]) //Если новая низина не перебила старую
               {
                  ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
                  ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
                  lastN = i+ 1 ;
                   continue ;
               }
               //Если перебила
               ZigZagBuffer2[lastN] = EMPTY_VALUE ;
               ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
               ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
               last = 1 ;
               lastN = i+ 1 ;
               continue ;
            }
         }
         if (high[i] <= high[i+ 1 ] && high[i+ 2 ] <= high[i+ 1 ]) //Новая вершина
         {
             if (last == 0 )
            {
               last = 1 ;
               lastN = i+ 1 ;
               ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
               continue ;
            }
             if (last == 1 )
            {
               ZigZagBuffer1[lastN] = EMPTY_VALUE ;
               ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
               lastN = i+ 1 ;
               continue ;
            }
             if (last == - 1 )
            {
               ZigZagBuffer1[i+ 1 ] = high[i+ 1 ];
               lastN = i+ 1 ;
               last = 1 ;
               continue ;
            }
         }
         if (low[i] >= low[i+ 1 ] && low[i+ 2 ] >= low[i+ 1 ])//Новая низина
         {
             if (last == 0 )
            {
               last = - 1 ;
               lastN = i+ 1 ;
               ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
               continue ;
            }
             if (last == - 1 )
            {
               ZigZagBuffer2[lastN] = EMPTY_VALUE ;
               ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
               lastN = i+ 1 ;
               continue ;
            }
             if (last == 1 )
            {
               ZigZagBuffer2[i+ 1 ] = low[i+ 1 ];
               lastN = i+ 1 ;
               last = - 1 ;
               continue ;
            }
         }
      }
   }
   
   return (rates_total); 
} 
Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Roman Sharanov :

지표를 이해하는 데 도움을 요청합니다.

여기에서 각각의 새로운 막대 가 열릴 때 재계산이 이루어져야 합니다.

논리 - 지그재그는 최저점(두 개의 인접 막대 아래 마지막 3개 막대 평균의 최저점)과 최고점(두 이웃 막대 위 마지막 3개 막대의 평균 최고점)을 직렬로 연결해야 합니다.

상단에 새로운 상단이 오고, 지표가 새로운 것으로 다시 그려지고, 이전 것이 삭제된다면, 이해할 수 있다고 생각합니다.

사실 지표는 모든 고점과 저점을 직렬로 연결하는데 무엇이 문제인가?

내가 이해하는 것처럼 2개의 렌더링 버퍼가 있습니다. 둘 다 그려집니다. 각 버퍼에는 고유한 라인이 있으며, 하나의 극한값을 통과합니다. 지그재그에 3개의 버퍼가 있습니다. 2개는 최고값과 최저값에 대해 별도로 계산되고 하나는 최대값 버퍼에 기록된 마지막 최대값 이후에 특성별로 그리기 위해 최소값을 찾고 그 반대의 경우도 마찬가지입니다.

 
문제는 MT4 의 표준 라이브러리 에 대한 설명이 있는지 없는지입니다. 검색으로 찾지 못했습니다.
 
Valeriy Yastremskiy :

내가 이해하는 것처럼 2개의 렌더링 버퍼가 있습니다. 둘 다 그려집니다. 각 버퍼에는 고유한 라인이 있으며, 하나의 극한값을 통과합니다. 지그재그에 3개의 버퍼가 있습니다. 2개는 최고값과 최저값에 대해 별도로 계산되고 하나는 최대값 버퍼에 기록된 마지막 최대값 이후에 특성별로 그리기 위해 최소값을 찾고 그 반대의 경우도 마찬가지입니다.

도움말에서 - 지그재그는 2개의 버퍼를 기반으로 합니다. 예제도 2개의 버퍼를 사용합니다.

 
Valeriy Yastremskiy :
문제는 MT4 의 표준 라이브러리 에 대한 설명이 있는지 없는지입니다. 검색으로 찾지 못했습니다.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека MQL5 написана на языке MQL5 и предназначена для облегчения написания программ (индикаторов, скриптов, экспертов) конечным пользователям. Библиотека обеспечивает удобный доступ к большинству внутренних функций MQL5.
 
Artyom Trishkin :

MT4.

기사에 대한 존중. 훌륭한 일.

 
Roman Sharanov :

도움말에서 - 지그재그는 2개의 버퍼를 기반으로 합니다. 예제도 2개의 버퍼를 사용합니다.

ZZ 코드의 시작.

 //+------------------------------------------------------------------+
//|                                                       ZigZag.mq4 |
//|                   Copyright 2006-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2006-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1   Red
//---- indicator parameters
input int InpDepth= 12 ;     // Depth
input int InpDeviation= 5 ;   // Deviation
input int InpBackstep= 3 ;   // Backstep
//---- indicator buffers
double ExtZigzagBuffer[];
double ExtHighBuffer[];
double ExtLowBuffer[];

하나의 렌더 버퍼. 3개의 어레이.

코드를 보세요. 논리가 복잡합니다. 그것은 일반적으로 배트에서 어렵습니다.

주석이 러시아어로 번역된 지그재그 코드
파일:
ZigZagRu.mq4  19 kb
 
Valeriy Yastremskiy :

MT4.

기사에 대한 존중. 훌륭한 일.

중요하지 않습니다. 거의 모든 것이 적합합니다.

고맙습니다.