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

 
Alexey Viktorov :
디스플레이 색상을 clrNONE으로 설정합니다.

즉, 버퍼만 출력할 수 있고 변수는 따로 출력할 수 없나요?

 
psyman :

즉, 버퍼만 출력할 수 있고 변수는 따로 출력할 수 없나요?

예, 이 방법으로만 가능합니다. SetIndexLabel(0, ""); 이 값은 데이터 창 에 표시되지 않습니다. 그리고 iCustom() 기능도 사용할 수 없습니다.
 
Igor Makanu :

대답 해줘서 고마워.

그래서 내가 이해하는 한 버퍼를 만든 다음 채워야합니다.

RSI 값을 입력한 다음 이 버퍼 를 iMAOnArray()에 공급합니다.

어드바이저를 위해 이 작업을 수행한 사람이 있고 서브 창에서 어드바이저 테스트 중에 표시됩니까?

iCustom을 통해 EA 테스트는 일반적으로 느려집니다.

 

https://www.mql5.com/ru/docs/strings/stringadd 참조의 예제에서 코드를 가져와 스크립트에 삽입했습니다. 실행 결과는 MQL4 및 MQL5에서 유사합니다.


HE       0        22 : 42 : 49.015     Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH       0        22 : 42 : 50.187     Test Script (EURUSD,H1) time for ' StringAdd (a,b)' = 1156 milliseconds, i = 1000000
EP       0        22 : 42 : 50.781     Test Script (EURUSD,H1) time for ' StringConcatenate (c,a,b)' = 594 milliseconds, i = 1000000


StringAdd() 및 StringConcatenate() 가 "+"보다 빨라야한다고 생각했습니다. 왜 그렇지?

 
Northwest :

iCustom을 통해 EA 테스트는 일반적으로 느려집니다.

사실이 아니며 일반적으로 그 반대도 마찬가지입니다. 표시기 버퍼에 대한 메모리 할당은 MQL 스크립트가 아닌 터미널에서 처리됩니다. 일반적으로 이러한 문제는 표시기에서 최적이 아닌 계산의 문제입니다. 많은 초보자가 표시기 호출 한 번으로 전체 기록 데이터 길이를 계산합니다.

글쎄요, 이미 MQL의 기본 사항을 파악했다면 기사를 읽으십시오. 모든 것이 오랫동안 작성되었습니다.

https://www.mql5.com/ru/articles/4602


북서쪽 :

어드바이저를 위해 이 작업을 수행한 사람이 있고 하위 창에서 어드바이저 테스트 중에 표시됩니까?

아무도 하지 않았습니다. 고문이 지표와 어떻게 다른지, 지표 버퍼가 있는 사람과 없는 사람, 거래 기능이 있는 사람, 누가 ....

추신: 하위 창은 표시기만 생성할 수 있습니다. 하위 창을 생성하면 조언자 https://www.mql5.com/en/docs/constants/objectconstants/enum_object 를 사용하여 이 하위 창에 그래픽 개체를 추가할 수 있습니다.

ZYZY: 템플릿을 사용하여 하위 창을 얻을 수 있습니다. 몇 달 전에 주제가 있었지만 지금은 다른 작업이 있다고 생각합니다.

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu :

사실이 아니며 일반적으로 그 반대도 마찬가지입니다. 표시기 버퍼에 대한 메모리 할당은 MQL 스크립트가 아닌 터미널에서 처리됩니다. 일반적으로 이러한 문제는 표시기에서 최적이 아닌 계산의 문제입니다. 많은 초보자가 표시기 호출 한 번으로 전체 기록 데이터 길이를 계산합니다.

글쎄요, 이미 MQL의 기본 사항을 파악했다면 기사를 읽으십시오. 모든 것이 오랫동안 작성되었습니다.

https://www.mql5.com/ru/articles/4602


아무도 하지 않았습니다. 고문이 지표와 어떻게 다른지, 지표 버퍼가 있는 사람과 없는 사람, 거래 기능이 있는 사람, 누가 ....

추신: 하위 창은 표시기만 생성할 수 있습니다. 하위 창을 생성하면 조언자 https://www.mql5.com/en/docs/constants/objectconstants/enum_object 를 사용하여 이 하위 창에 그래픽 개체를 추가할 수 있습니다.

ZYZY: 템플릿을 사용하여 하위 창을 얻을 수 있습니다. 몇 달 전에 주제가 있었지만 지금은 다른 작업이 있다고 생각합니다.

죄송합니다. 내가 제대로 표현하지 못했나봐

하위 창의 경우 Expert Advisor의 작동이 아닌 테스트만을 의미했습니다.

Advisor를 테스트하는 과정에서 지표 차트의 시각화와 관련하여 사용하면

내장 표시기 기능, 테스트 중에 차트에 쉽게 그려짐

고문 그게 바로 내 말이었습니다.

그리고 어드바이저 코드에 내장된 지표 계산 코드 중 일부를 사용하는 경우 이 지표는

Expert Advisor 테스트 중에는 표시되지 않습니다.

아이커스텀은 어드바이저 테스트 과정에서 사용시 차트에 표시됩니다.

모든 표시기 및 표시기 코드는 고문과 함께 하나의 ex4로 컴파일할 수 있지만 필요하지 않습니다.

이 문제에서 iCustom을 우회하는 방법을 알고 싶었지만 그렇지 않은 경우에도 문제가 되지 않습니다.

자세한 답변 감사합니다.

 

여기에 Artem이 표시기 템플릿을 배치했습니다. 여기에 OnCalculate 의 일부가 있습니다.

 //--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if (limit> 1 ) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total- 1 ;
       // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

나는 그것을 사용하지만 한 가지 질문이 나를 괴롭힌다.))

전체 기록 계산에 limit=rates_total-1이 사용되고 limit=rates_total이 아닌 이유는 무엇 입니까?

 
psyman :

전체 기록 계산에 limit=rates_total-1이 사용되고 limit=rates_total이 아닌 이유는 무엇 입니까?

배열 바로 외부에 "비행"이 있는지 확인하십시오. 0에서 ... 총 수 -1까지의 막대 번호 매기기, 프로그래밍의 일반적인 상황 - 번호 매기기는 0부터 시작합니다. 명백한 예로서, 배열 double x[5]를 선언하고 마지막 요소 x[5] = 100;

추신: 아직 묻지 않은 질문에 답하고 있습니다. .... OrderTotal()도 0에서 OrderTotal()-1까지 번호가 매겨집니다. ;)

 
Igor Makanu :

추신: 아직 묻지 않은 질문에 답하고 있습니다.... OrderTotal()도 0에서 OrderTotal()-1;)까지 번호가 매겨집니다.

통과하는 동안 질문이 발생했습니다. 이제 상위 5개 안에 들지만 여전히 배열에 대한 평균화를 이길 수 없습니다. 하지만 어떤 주제에 쓸지 모르겠습니다. 여기로 둡니다.

지표는 시가 차액을 계산하고 이를 기반으로 MA를 구축합니다. 디버깅을 위해 MA=2를 선택했지만 SimpleMAOnBuffer 및 iMAOnArray를 사용할 때 설명할 수 없는 줄 이동이 발생하고 iMAOnArray는 마지막 막대에 0 값을 제공합니다.


 //+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property version    "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots    2
//--- plot OC
#property indicator_label1    "OC"
#property indicator_type1    DRAW_COLOR_HISTOGRAM
#property indicator_color1    clrSteelBlue , clrRed , clrGreen
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1

#property indicator_label2    "MA1"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrBrown
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1


//--- indicator buffers
double    OC[], OC_color[], MA1_buf[];
input int MA1= 2 ;

int OnInit ()
  {
  
   IndicatorSetString ( INDICATOR_SHORTNAME , "t1" );
   
   SetIndexBuffer ( 0 ,OC, INDICATOR_DATA );
   SetIndexBuffer ( 1 ,OC_color, INDICATOR_COLOR_INDEX );
   
   SetIndexBuffer ( 2 , MA1_buf, INDICATOR_DATA ); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if (rates_total< 4 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total- 1 ;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       // необходимые действия по расчёту индикатора
     
     OC[i]= fmax (open[i],close[i])- fmin (open[i],close[i]);
     if (OC[i]> 0.001 )
      {   OC_color[i]= 1 ;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated, 0 ,MA1,OC,MA1_buf);

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




double iMAOnArray( double &array[],
                       int total,
                       int period,
                       int ma_shift,
                       int ma_method,
                       int shift)
  {
   double buf[],arr[];
   if (total== 0 ) total= ArraySize (array);
   if (total> 0 && total<=period) return ( 0 );
   if (shift>total-period-ma_shift) return ( 0 );
   switch (ma_method)
     {
       case MODE_SMA :
        {
         total= ArrayCopy (arr,array, 0 ,shift+ma_shift,period);
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0 ;
         int     i,pos=total- 1 ;
         for (i= 1 ;i<period;i++,pos--)
            sum+=arr[pos];
         while (pos>= 0 )
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period- 1 ];
            pos--;
           }
         return (buf[ 0 ]);
        }
       case MODE_EMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double pr= 2.0 /(period+ 1 );
         int     pos=total- 2 ;
         while (pos>= 0 )
           {
             if (pos==total- 2 ) buf[pos+ 1 ]=array[pos+ 1 ];
            buf[pos]=array[pos]*pr+buf[pos+ 1 ]*( 1 -pr);
            pos--;
           }
         return (buf[shift+ma_shift]);
        }
       case MODE_SMMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0 ;
         int     i,k,pos;
         pos=total-period;
         while (pos>= 0 )
           {
             if (pos==total-period)
              {
               for (i= 0 ,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]= 0 ;
                 }
              }
             else sum=buf[pos+ 1 ]*(period- 1 )+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return (buf[shift+ma_shift]);
        }
       case MODE_LWMA :
        {
         if ( ArrayResize (buf,total)< 0 ) return ( 0 );
         double sum= 0.0 ,lsum= 0.0 ;
         double price;
         int     i,weight= 0 ,pos=total- 1 ;
         for (i= 1 ;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while (pos>= 0 )
           {
            buf[pos]=sum/weight;
             if (pos== 0 ) break ;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return (buf[shift+ma_shift]);
        }
       default : return ( 0 );
     }
   return ( 0 );
  }
 
psyman :

통과하는 동안 질문이 발생했습니다. 이제 상위 5개 안에 들지만 여전히 배열에 대한 평균화를 이길 수 없습니다. 하지만 어떤 주제에 쓸지 모르겠습니다. 여기로 둡니다.

MQL5 표시기 버퍼 및 시계열은 반대입니다. 기본적으로 MT5의 맨 왼쪽 막대는 막대 #0이고 MT4에서는 맨 오른쪽 막대가 막대 #0이고 표시기 버퍼의 번호는 동일하게 지정됩니다.

추신: 아아, 저는 MT5를 어지럽히고 싶지 않습니다. 아이디어를 확인할 수 있는 MT4가 충분합니다. MT5가 준비된 것만 보고, MT5에서 무언가를 작성하면 아무에게도 보여주지 않습니다.)))