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

 
azolotta :
좋아, 하지만 코드를 다시 작업하는 방법, 예를 들어 마지막 3개 막대(if의 조건에 해당)에서 가장 높은 값을 선택하고 그 위에 포인트를 두어야 하는 경우(바로 이 높은 위치에!) 낮은 점을 찾으십시오.

이것을 시도하지만 확실하지 않음

 //+------------------------------------------------------------------+
//|                                                           AZ.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Anastasiya Zolotareva"
#property link        "insta"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 5
//--- plot myAZ
#property indicator_label1    "myAZ"
#property indicator_color1   Black
#property indicator_color2   Blue
#property indicator_color3   Orange
#property indicator_color4   Blue
#property indicator_color5   Orange
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_SOLID
#property indicator_style3 STYLE_SOLID
#property indicator_style4 STYLE_SOLID
#property indicator_style5 STYLE_SOLID
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1

extern int barsToProcess= 200 ; //количество последних баров в истории
//--- indicator buffers
double myAZBuffer[];
double ExtHighBuffer01[];
double ExtLowBuffer01[];
double ExtHighBuffer02[];
double ExtLowBuffer02[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---- drawing settings
   SetIndexStyle( 0 , DRAW_NONE );
   SetIndexStyle( 1 , DRAW_ARROW );
   SetIndexShift( 1 ,- 2 );
   SetIndexStyle( 2 , DRAW_ARROW );
   SetIndexShift( 2 ,- 2 );
   SetIndexStyle( 3 , DRAW_ARROW );
   SetIndexShift( 3 ,- 3 );
   SetIndexStyle( 4 , DRAW_ARROW );
   SetIndexShift( 4 ,- 3 );

//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,myAZBuffer);
   SetIndexBuffer ( 1 ,ExtHighBuffer01);
   SetIndexBuffer ( 2 ,ExtLowBuffer01);
   SetIndexBuffer ( 3 ,ExtHighBuffer02);
   SetIndexBuffer ( 4 ,ExtLowBuffer02);
   IndicatorShortName( "AZ" );
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|         deinit                                                         |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| 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 ((rates_total-prev_calculated-barsToProcess)<= 0 ) return ( 0 );
   int limit, val_index;
   if (barsToProcess> 0 ) limit=barsToProcess; 
   else
   limit=rates_total-prev_calculated-barsToProcess- 1 ;
  
   for ( int n=limit;n>= 0 ;n--)
     {
       if (Close[n+ 1 ]>Open[n+ 1 ] && Open[n+ 2 ]>=Close[n+ 2 ])
        {
         val_index= iLowest ( NULL , 0 , MODE_LOW , 3 ,n+ 1 );
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer01[n]=Low[val_index];
        }
       else
       if (Open[n+ 1 ]>Close[n+ 1 ] && Close[n+ 2 ]>=Open[n+ 2 ])
        {
         val_index= iHighest ( NULL , 0 , MODE_HIGH , 3 ,n+ 1 );
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer01[n]=High[val_index];
        }
       else
       if (Close[n+ 1 ]>Open[n+ 1 ] && Open[n+ 3 ]>Close[n+ 3 ])
        {
         val_index= iLowest ( NULL , 0 , MODE_LOW , 3 ,n+ 1 );
         myAZBuffer[n]=Low[val_index];
         ExtLowBuffer02[n]=Low[val_index];
        }
       else
       if (Close[n+ 1 ]<Open[n+ 1 ] && Close[n+ 3 ]>Open[n+ 3 ])
        {
         val_index= iHighest ( NULL , 0 , MODE_HIGH , 3 ,n+ 1 );
         myAZBuffer[n]=High[val_index];
         ExtHighBuffer02[n]=High[val_index];
        }
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
 
MakarFX :

이것을 시도하지만 확실하지 않음

불행히도 교대 근무는 좋은 선택이 아닙니다. 내 코드를 표준 지그재그에 붙여넣을 수 있다고 생각합니다. 지금은 여기저기 찔러보고 있지만, 지금까지는 아무 소용이 없습니다. 지그재그로 통과하는 것이 가능하다고 생각하십니까? 결국, 나는 발견 된 정점이 교대로 연결되어야 합니다. 예를 들어 high-low-high와 같이 high-high 또는 low-low 옵션이 있는 경우 이러한 두 번째 고점과 저점이 포함되어서는 안 됩니다. 배열이지만 반대를 기다립니다.

 
azolotta :

불행히도 교대로 변속하는 것은 좋은 선택이 아닙니다. 내 코드를 표준 지그재그에 붙여넣을 수 있다고 생각합니다. 지금은 여기저기 찔러보고 있지만, 지금까지는 아무 소용이 없습니다. 지그재그로 통과하는 것이 가능하다고 생각하십니까? 결국, 나는 발견 된 정점이 교대로 연결되어야 합니다. 예를 들어 high-low-high와 같이 high-high 또는 low-low 옵션이 있는 경우 이러한 두 번째 고점과 저점 이 포함되어서는 안 됩니다. 배열이지만 반대를 기다립니다 .

아니요. 이전 것을 재설정하고 현재 하나를 표시기 버퍼에 추가해야 합니다.

 
azolotta :

불행히도 교대 근무는 좋은 선택이 아닙니다. 내 코드를 표준 지그재그에 붙여넣을 수 있다고 생각합니다. 지금은 여기저기 찔러보고 있지만, 지금까지는 아무 소용이 없습니다. 지그재그로 통과하는 것이 가능하다고 생각하십니까? 결국, 나는 발견 된 정점이 교대로 연결되어야 합니다. 예를 들어 high-low-high와 같이 high-high 또는 low-low 옵션이 있는 경우 이러한 두 번째 고점과 저점이 포함되어서는 안 됩니다. 배열이지만 반대를 기다립니다.

어쨌든 지연이 발생합니다. 2-3개의 이전 막대에 대한 조건이 충족될 때까지 추첨되지 않습니다.

내가 알기로는 높은 곳에서 낮은 곳으로 지그재그가 필요합니까?
 
MakarFX :

어쨌든 지연이 발생합니다. 2-3개의 이전 막대에 대한 조건이 충족될 때까지 추첨되지 않습니다.

내가 알기로 높은 곳에서 낮은 곳으로 지그재그가 필요합니까?

예, 이상적으로는 높은 곳에서 낮은 곳으로 지그재그가 필요합니다(내 조건에 따라 이 고점과 저점이 있고 연속으로 두 개 이상의 고점/저점이 있는 경우 이러한 두 번째 고/저점이 없어야 합니다. 표시되지만 반전을 기다립니다). 표시기가 마지막 6개의 최저점과 마지막 6개의 최고점을 표시하는 것으로 충분합니다. 그리고 나서야 추가 필요를 위해 스크립트/EA에서 발견된 지그재그 지점을 호출하고 싶습니다.

 

안녕하세요!

디버그 모드에 값이 표시되지 않는 이유를 알려줄 수 있는 사람이 있습니까?

MT5 프로그램을 업데이트한 후 문제가 시작된 것 같습니다.

그리고 열에 있는 값의 빨간색 - 값은 무엇을 의미합니까?

 
Mikhail Toptunov :

안녕하세요!

디버그 모드에 값이 표시되지 않는 이유를 알려줄 수 있는 사람이 있습니까?

MT5 프로그램을 업데이트한 후 문제가 시작된 것 같습니다.

그리고 열에 있는 값의 빨간색 - 값은 무엇을 의미합니까?

1. 최소한의 정보만 기재해주세요. (터미널 재시작 후 Log 탭의 처음 세 줄)

2. 빌드 업데이트

 
azolotta :

예, 이상적으로는 높은 곳에서 낮은 곳으로 지그재그가 필요합니다(내 조건에 따라 이 고점과 저점이 있고 연속으로 두 개 이상의 고점/저점이 있는 경우 이러한 두 번째 고/저점이 없어야 합니다. 표시되지만 반전을 기다립니다). 표시기가 마지막 6개의 최저점과 마지막 6개의 최고점을 표시하는 것으로 충분합니다. 그리고 나서야 추가 필요를 위해 스크립트/EA에서 발견된 지그재그 지점을 호출하고 싶습니다.

저는 프로그래머가 아니어서 아직 어떻게 도와야 할지 모르겠습니다만, 제 생각에는...
 
MakarFX :
저는 프로그래머가 아니어서 아직 어떻게 도와야 할지 모르겠습니다만, 제 생각에는...
 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,                                                           |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает экстремум ЗигЗага по его номеру.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
double GetExtremumZZPrice( string sy= "" , int tf= 0 , int ne= 0 , int dp= 12 , int dv= 5 , int bs= 3 ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   double zz;
   int     i, k= iBars (sy, tf), ke= 0 ;

   for (i= 1 ; i<k; i++) {
    zz= iCustom (sy, tf, "ZigZag" , dp, dv, bs, 0 , i);
     if (zz!= 0 ) {
      ke++;
       if (ke>ne) return (zz);
    }
  }
   Print ( "GetExtremumZZPrice(): Экстремум ЗигЗага номер " ,ne, " не найден" );
   return ( 0 );
}

사용자 지정 표시기   지그재그   가격 수준을 반환합니다. 이 함수는 다음과 같은 선택적 매개변수를 허용합니다.
  •   - 악기의 이름.   ""   또는   없는   - 현재 기호. 기본값   NULL .
  • tf   - 기간. 기본값   0   - 현재 기호.
  •   - 극한수.   0   - 마지막,   하나   - 이전,   2   - 이전 등
  • dp ,   DVD ,   bs   - ZigZaga 매개변수: ExtDepth, ExtDeviation, ExtBackstep.

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.
 
Iurii Tokman :

사용자 지정 표시기   지그재그   가격 수준을 반환합니다. 이 함수는 다음과 같은 선택적 매개변수를 허용합니다.
  •   - 악기의 이름.   ""   또는   없는   - 현재 기호. 기본값   NULL .
  • tf   - 기간. 기본값   0   - 현재 기호.
  •   - 극한수.   0   - 마지막,   하나   - 이전,   2   - 이전 등
  • dp ,   DVD ,   bs   - ZigZaga 매개변수: ExtDepth, ExtDeviation, ExtBackstep.

이건 맞지 않아, 지그재그가 아닌 극단이 필요해