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

 
Igor Makanu :

처음이나 다른 곳에서 초기화하지 않고 방금 선언했습니다.

나는 사용하기 전에 썼다. 변수 SredRazmax, SredRazmin, Sredn이 배열 값의 합계인 경우 합계를 올바르게 계산하려면 변수를 재설정한 다음 배열 요소를 추가하고 이 변수에 저장해야 합니다.

저것들.

음, 두 번째로 궁금한 점은 표시기에서 OnCalculate()모든 틱에서 호출된다는 것입니다. 즉, 각 틱에서 지그재그 정점을 지속적으로 계산합니다. 초당 약 40-60회.

고마워,하지만 나는 그들을 재설정하려고 시도하고 OnCalculate() 대신 OnStart사용 하려고 시도했는데 값이 여전히 점프하고 ww=0(배열 값이 지속적으로 표시됨)인 경우 나에게 명확하지 않은데 왜 값이 평균으로 점프하여 모든 틱이 고려되지 않고 배열의 값만 고려되도록 하는 방법은 무엇입니까?  

 
Dmitry Belov :

감사합니다. 재설정을 시도했고 OnCalculate() 대신 OnStart사용 하려고 했습니다.

왜 이런 일이 발생하는지 설명할 수 없다고 생각합니다. 사실 OnStart()가 스크립트에서 사용되고 OnCalculate()가 표시기에서 사용되기 때문에 스크립트가 MQL의 표시기와 어떻게 다른지 파악해야 합니다.

어떤 작업이 있는지 완전히 명확하지 않습니까? 무엇의 값을 표시하시겠습니까? 코드에서 전체 차트에서 ZigZag 피크가 있는 가격을 더하고 출력에 "Average range"를 쓰고 값( SredRazmax-SredRazmin)/nn을 표시하고 모든 막대에 대해 계산합니다.

그리기에 표시기 버퍼 를 사용하지 않는 경우 표시기가 필요한 이유는 무엇입니까? 표시기의 버퍼는 막대에 연결되어 있으며 새 막대가 나타날 때 값이 이동합니다.

 
Igor Makanu :

왜 이런 일이 발생하는지 설명할 수 없다고 생각합니다. 사실 OnStart()가 스크립트에서 사용되고 OnCalculate()가 표시기에서 사용되기 때문에 스크립트가 MQL의 표시기와 어떻게 다른지 파악해야 합니다.

어떤 작업이 있는지 완전히 명확하지 않습니까? 무엇의 값을 표시하시겠습니까? 코드에서 전체 차트에서 ZigZag 피크가 있는 가격을 더하고 출력에 "Average range"를 쓰고 값( SredRazmax-SredRazmin)/nn을 표시하고 모든 막대에 대해 계산합니다.

그리기에 표시기 버퍼 를 사용하지 않는 경우 표시기가 필요한 이유는 무엇입니까? 표시기의 버퍼는 막대에 연결되어 있으며 새 막대가 나타날 때 값이 이동합니다.

솔직히 말해서 작업을 간단하게 했을 뿐인데(처음에는 공식이 조금 다르게 생겼음), 배열의 0값이 일정하게 유지되면 평균값이 점프하는 이유를 이해할 수 있을 거라고 생각했습니다. 배열을 채우는 사이클과 평균을 계산하는 사이클이 두 개 있는데 nn 한계도 있지만 실제로 그래프를 표시하고 싶었고 그래프는 표준 지그재그이지만 iCustom을 통해 도대체 무엇을 그리는지 , 그리고 평균 ... 0 정점에서 이전 정점보다 크면 이전 정점을 빼고 이전 정점에서 이전 정점을 뺍니다(빼기 기호가 있으므로 빼기 1을 곱해야 합니다. ) 이 모든 것이 합산되어 지정된 정점 수 nn으로 나뉩니다. 우리는 피크의 평균 범위를 얻습니다. 앞으로 다른 지그재그 평균을 얻고 싶었지만 "점프" 값에 걸림돌이 있었습니다.

원래 이렇습니다.

 //+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;
extern int nn= 30 ;

int shift, ww= 0 ;
double zz, SredRazmax= 0.0 ; 
double HZZ[];


int OnInit ()
  {
//--- indicator buffers mapping
     SetIndexBuffer ( 0 ,HZZ);
   SetIndexStyle ( 0 , DRAW_SECTION );
//---
   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[])
  {
//---
   for (shift = 0 ; shift <= Bars - 1 ; shift++){
      zz = iCustom ( NULL , 0 , "ZigZag" , ExtDepth, ExtDeviation, ExtBackstep, 0 , shift);
           if (zz > 0.0 )   {
           HZZ[ww]=zz;
            ww++;          }
           else {
           continue ;
           }
    }
//---------------------------------------------+
//расчет среднего значения           
//---------------------------------------------+      
   for (ww= 0 ;ww<=nn;ww++){
       if (HZZ[ww]>HZZ[ww+ 1 ]){
          SredRazmax += (HZZ[ww]- HZZ[ww+ 1 ]);      
         }     
         else if (HZZ[ww]<HZZ[ww+ 1 ]){
         SredRazmax += (HZZ[ww]- HZZ[ww+ 1 ])*(- 1 );
        }
         else {
         continue ;
           }
     }  
        
   if (SredRazmax> 0 ){    
   
       Comment ( "Средний размах = " , SredRazmax/nn, "," ,HZZ[ 0 ], "," ,HZZ[ 1 ], "," ,HZZ[ 2 ], "," ,HZZ[ 3 ], "," ,HZZ[ 4 ]);      
        }
   
       
//--- return value of prev_calculated for next call
 return ( 0 );

  
 
  }
 
Dmitry Belov :

솔직히 말해서 작업을 간단하게 했을 뿐인데(처음에는 공식이 조금 다르게 생겼음), 배열의 0값이 일정하게 유지되면 평균값이 점프하는 이유를 이해할 수 있을 거라고 생각했습니다. 배열을 채우는 사이클과 평균을 계산하는 사이클이 두 개 있는데 nn 한계도 있지만 실제로 그래프를 표시하고 싶었고 그래프는 표준 지그재그이지만 iCustom을 통해 도대체 무엇을 그리는지 , 그리고 평균 ... 0 정점에서 이전 정점보다 크면 이전 정점을 빼고 이전 정점에서 이전 정점을 뺍니다(빼기 기호가 있으므로 빼기 1을 곱해야 합니다. ) 이 모든 것이 합산되어 지정된 정점 수 nn으로 나뉩니다. 우리는 피크의 평균 범위를 얻습니다. 앞으로 다른 지그재그 평균을 구하고 싶었지만 "점프" 값에 걸림돌이 있었습니다.

원래 이렇습니다.

작업은 원칙적으로 잘 이해하지 못했습니다. 너무 늦었습니다. 너무 늦었습니다. 잠자기에는 너무 늦었습니다. 내 비전에 따라 수정했습니다. 표시기가 0 막대에서 어떻게 작동하는지 의심되는 것 같습니다. 확인하지 않음), 그러나 그것은 당신의 공식에 따라 주석을 그리고 표시합니다

 //+------------------------------------------------------------------+
//|                                                           01.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_chart_window

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 1

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

extern int ExtDepth= 12 ;
extern int ExtDeviation= 5 ;
extern int ExtBackstep= 3 ;
extern int nn= 30 ;

int   ww= 0 ;
double zz,SredRazmax;
double HZZ[];
bool up,dn;
double lastzz;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,HZZ);
   SetIndexStyle ( 0 , DRAW_SECTION );
   SetIndexEmptyValue ( 0 , 0.0 );
   up = false ;
   dn = false ;
   lastzz= 0.0 ;
   SredRazmax= 0.0 ;
//---
   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[])
  {
//---
   int shift,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if (prev_calculated== 0 )
     {
      limit=rates_total- 1 ;
      up = false ;
      dn = false ;
      lastzz= 0.0 ;
      SredRazmax= 0.0 ;
       ArrayInitialize (HZZ, 0.0 );
     }
   else limit=rates_total-prev_calculated+ 1 ;
   for (shift=limit; shift>= 0 ; shift--)
     {
      zz= iCustom ( NULL , 0 , "ZigZag" ,ExtDepth,ExtDeviation,ExtBackstep, 0 ,shift);
       if (zz> 0.0 )
        {
         HZZ[shift]=zz;
         if (lastzz>zz) {up= true ;  dn= false ;}
         if (lastzz<zz) {up= false ; dn= true ;}
         if (up) SredRazmax+=zz-lastzz;
         if (dn) SredRazmax+=(zz- lastzz)*(- 1 );
         lastzz=zz;
        }
       else HZZ[shift]= 0.0 ;
     }
   Comment ( "Средний размах = " ,SredRazmax/nn, "," ,HZZ[ 0 ], "," ,HZZ[ 1 ], "," ,HZZ[ 2 ], "," ,HZZ[ 3 ], "," ,HZZ[ 4 ]);
   return (rates_total);
  }
//+------------------------------------------------------------------+
 

이 문제를 해결하는 데 도움이 되셨나요? (혹시 가능하다면.)

특정 조건에서 어드바이저는 Alert 를 발행합니다. 호출한 창이 경고와 함께 활성화될 수 있습니까?

 
Vatal :

이 문제를 해결하는 데 도움이 되셨나요? (혹시 가능하다면.)

특정 조건에서 고문은 경보를 발령합니다. 호출한 경고 창과 함께 활성화될 수 있습니까?

문서에 예가 있습니다. 어드바이저가 일하고 있는 차트의 아이디를 얻어야 하고...
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
В этом разделе представлены примеры для работы со свойствами графика. Для каждого свойства приведены одна или две законченные функции, которые позволяют задавать/получать значение этого свойства. Эти функции можно использовать в своих MQL4 программах как есть. На рисунке показана графическая панель для наглядной демонстрации того, как изменение...
 
Igor Makanu :

작업은 원칙적으로 잘 이해하지 못했습니다. 너무 늦었습니다. 너무 늦었습니다. 잠자기에는 너무 늦었습니다. 내 비전에 따라 수정했습니다. 표시기가 0 막대에서 어떻게 작동하는지 의심되는 것 같습니다. 확인하지 않음), 그러나 그것은 당신의 공식에 따라 주석을 그리고 표시합니다

네, 시간을 내어 주셔서 감사합니다. 정말 잘 그리셨습니다. 제가 뭔가를 잘못한 것 같습니다. 하지만 여기에서는 주석에 배열을 표시하지 않습니다(결국 거기에는 꼭짓점만 있어야 합니까?) 그리고 빼기와 숫자로 잘못 계산됩니다..., 지그재그의 꼭짓점 사이의 범위가 같지 않습니다. 아이디어는 마지막 (방금 형성된) 피크에서 이전의 작은 것을 빼고 더 크고 숫자가 마이너스 기호가 될 이전의 작은 피크에서 이전 것을 빼는 것입니다. 1) 등등, 이 모든 것을 nn번 더하고 nn으로 나누면 평균 오버행을 얻습니다. 약 4시간에 USDJPY로 1.69(to)입니다. 앞으로는 피크 사이의 평균 막대 수 를 계산하고 싶었습니다. 이제 나는 당신의 코드, 내가 무엇을 잘못했는지, 왜 그리지 않았는지, 왜 잘못 계산되었는지 알아내려고 노력할 것입니다.

 
Dmitry Belov :
네, 시간을 내어 주셔서 감사합니다. 정말 잘 그리셨습니다. 제가 뭔가를 잘못한 것 같습니다. 하지만 여기서는 주석에 배열을 표시하지 않습니다(꼭지점만 있어야 하기 때문에?) 그리고 빼기와 숫자로 잘못 계산됩니다..., 지그재그의 꼭짓점 사이의 범위가 같지 않습니다. 아이디어는 마지막 (방금 형성된) 정점에서 이전의 작은 정점을 빼고 더 크고 숫자가 마이너스 기호가 될 이전의 작은 정점에서 이전 정점을 빼는 것입니다. 1) 등등, 이 모든 것을 nn번 더하고 nn으로 나누면 평균 오버행을 얻습니다. 약 4시간에 USDJPY로 1.69(to)입니다. 앞으로는 피크 사이의 평균 막대 수 를 계산하고 싶었습니다. 이제 나는 당신의 코드, 내가 무엇을 잘못했는지, 왜 그리지 않았는지, 왜 잘못 계산되었는지 알아내려고 노력할 것입니다.

주석의 꼭짓점은 표시되지 않습니다. HZZ[] 표시기 버퍼에는 ZigZag 표시기 버퍼의 복사된 값이 포함되어 있습니다. 그렇지 않으면 그릴 수 없습니다. 의도적으로 정점 감지를 위아래 2가지 조건으로 분리했습니다.

 if (up) SredRazmax+=zz-lastzz;
if (dn) SredRazmax+=(zz- lastzz)*(- 1 );

이제 직접 계산을 수행할 수 있습니다. 3Z의 현재 정점은 변수 zz이고 이전 정점은 변수 lastzz에 있습니다. 3Z의 여러 정점을 알아야 하는 경우 저장할 다른 배열을 만들어야 합니다. 이 데이터, 새로운 표시기 버퍼는 모든 것을 복잡하게 만들 것입니다. 새 막대가 나타나면 표시기 버퍼에 연결된 모든 배열이 차트와 함께 "슬라이드"합니다.

추신: 코드는 내 예이며 0이 아닌 첫 번째 막대로 순환해야 한다고 생각합니다. SredRazmax 값을 지속적으로 다시 계산합니다. 지금 확인할 수 없습니다. PC에 터미널이 없습니다.

 
Igor Makanu :

주석의 꼭짓점은 표시되지 않습니다. HZZ[] 표시기 버퍼에는 ZigZag 표시기 버퍼의 복사된 값이 포함되어 있습니다. 그렇지 않으면 그릴 수 없습니다. 의도적으로 정점 감지를 위아래 2가지 조건으로 분리했습니다.

이제 직접 계산을 수행할 수 있습니다. 3Z의 현재 정점은 변수 zz이고 이전 정점은 변수 lastzz에 있습니다. 3Z의 여러 정점을 알아야 하는 경우 저장할 다른 배열을 만들어야 합니다. 이 데이터, 새로운 표시기 버퍼는 모든 것을 복잡하게 만들 것입니다. 새 막대가 나타나면 표시기 버퍼에 연결된 모든 배열이 차트와 함께 "슬라이드"합니다.

추신: 코드는 내 예이며 0이 아닌 첫 번째 막대로 순환해야 한다고 생각합니다. SredRazmax 값을 지속적으로 다시 계산합니다. 지금 확인할 수 없습니다. PC에 터미널이 없습니다.

내 표시기는 로드되자마자 올바른 값을 표시한 다음 각 틱마다 평균 값을 증가시킵니다. 지그재그 배열의 출력 값에는 변경 사항이 없지만 상단은 유지됩니다. 내가 이해하지 못하는 것은 왜 그런가? 언어에 대한 경험과 지식이 부족합니다. 나는 그리기를 거부합니다. 이것은 iCustum이 취하는 일반적인 지그재그입니다(이제 배열이 차트에 겹쳐질 수 없다는 것을 이해하므로 악마는 무엇을 그립니다.). 배열은 "슬라이드"하지만 값은 단순히 다시 계산됩니다. 그렇죠? 이해합니다 감사합니다 ... 노력하겠습니다 ... 배우십시오 ...
 
어드바이저(표준 ma)에게 무엇을 사(판매)해야 하는지 설명하는 방법은 평균을 넘는 순간에만 필요하며 일반적으로 ma_1>ma_2일 때는 필요하지 않습니다. 그리고 그는 끊임없이 구매, 그는 멈출 수 없습니다