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

 
psyman :

웬일인지 15:00에 시작하는 사이클에서 바를 잡을 수 없습니다.

if(i<24)를 조건으로 쓰면 1일 각 막대의 시간이 로그에 표시되지만 필요한 조건이 충족되지 않습니다.


표시기를 실행하는 기간은 무엇입니까?

 
psyman :

두 경우 모두 시계.

공장:

 //+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots    1
#property strict
//--- plot Hour
#property indicator_label1    "Hour"
#property indicator_type1    DRAW_HISTOGRAM
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar     InpHour  =   15 ;   // The required hour
//--- indicator buffers
double          BufferHour[];
//--- global variables
int             hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- set global variables
   hour_req= int (InpHour> 23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferHour, INDICATOR_DATA );
//--- setting indicator parameters
   IndicatorSetString ( INDICATOR_SHORTNAME , "Hour(" +( string )hour_req+ ")" );
#ifdef __MQL4__
   SetIndexLabel ( 0 , "Hour(" +( string )hour_req+ ")" );
#else 
   PlotIndexSetString ( 0 , PLOT_LABEL , "Hour(" +( string )hour_req+ ")" );
   ArraySetAsSeries (BufferHour, true );
#endif 
   IndicatorSetInteger ( INDICATOR_DIGITS , 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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries (time, true );
#endif 
//--- Проверка количества доступных баров
   if (rates_total< 1 ) return 0 ;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 1 ;
       ArrayInitialize (BufferHour, 0 );
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for ( int i=limit; i>= 0 && ! IsStopped (); i--)
     {
       int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0 );
     }

//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour( const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour (time);
   #endif 
   MqlDateTime tm;
   if (! TimeToStruct (time,tm)) return WRONG_VALUE ;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

감사합니다만, 경험과 지식이 부족하지 않은 사람에게 쓰기가 너무 까다롭습니다 :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0 );

버퍼에 데이터를 전송할 때 시간>0을 확인하는 이유는 무엇입니까? 그렇지 않다면 왜 0.1이 할당됩니까?



주 차트를 강조 표시하고 싶었지만 선으로 표시하지 않고 요일별로 Mon, Tue, Wed... via SetIndexArrow(0, 140); (물론 더 쉬운 방법이 있을 수 있지만 아직까지는 다른 방법이 떠오르지 않았습니다.) 하지만 어떤 이유로 메인 창의 네 번째 코드에서 작동하도록 할 수 없으며 상위 5개에는 다음이 있습니다. 그런 재산이 없습니다.

 
psyman :

감사합니다만, 경험과 지식이 부족하지 않은 사람에게 쓰기가 너무 까다롭습니다 :-)


버퍼에 데이터를 전송할 때 시간>0 확인하는 이유 는 무엇입니까? 그렇지 않다면 왜 0.1이 할당됩니까?



주 차트를 강조 표시하고 싶었지만 선으로 표시하지 않고 요일별로 Mon, Tue, Wed... via SetIndexArrow(0, 140); (물론 더 쉬운 방법이 있을 수 있지만 아직까지는 다른 방법이 떠오르지 않았습니다.) 하지만 어떤 이유로 메인 창의 네 번째 코드에서 작동하도록 할 수 없으며 상위 5개에는 다음이 있습니다. 그런 재산이 없습니다.

버퍼는 시간 값으로 채워집니다. 시간이 0이면 히스토그램이 그려지지 않습니다. 따라서 시간이 0과 같은지 확인해야 합니다(0 시간을 찾도록 설정한 설정에서). 0과 같으면 시간(영) 값이 아닌 버퍼에 입력하지만 0.1 - 히스토그램 열을 표시합니다. 이 경우 표시기의 자릿수가 0으로 설정되어 있으므로 데이터 창에 값이 0.1이 아닌 0으로 표시됩니다.

 
psyman :

감사합니다만, 경험과 지식이 부족하지 않은 사람에게 쓰기가 너무 까다롭습니다 :-)


버퍼에 데이터를 전송할 때 시간>0을 확인하는 이유는 무엇입니까? 그렇지 않다면 왜 0.1이 할당됩니까?



주 차트를 강조 표시하고 싶었지만 선으로 표시하지 않고 요일별로 Mon, Tue, Wed... via SetIndexArrow(0, 140); (물론 더 쉬운 방법이 있을 수 있지만 지금까지는 다른 방법이 떠오르지 않았습니다.) 하지만 어떤 이유로 메인 창의 네 번째 코드에서 작동하도록 할 수 없으며 상위 5개에는 다음이 있습니다. 그런 재산이 없습니다.

PlotIndexSetInteger(0,PLOT_ARROW,140);

그러나 주 수와 동일한 수의 버퍼를 생성해야 합니다. 그리고 각 버퍼의 화살표 코드를 140에서 149로 설정하십시오. 1,2,3,4,5,6,7,8,9,10 - 10주이면 1년에 충분합니까? 70일만입니다. 아니면 어떻게 하시겠습니까?

 
모두에게 좋은 하루!
도와주세요!
이것은 BB MACD입니다 - 여기에서 제가 다운로드한 MetaTrader 4 표시기 https://www.mql5.com/en/code/9325
이 지표는 두 주기로 계산되며 첫 번째 주기에서 MACD 버퍼가 두 번째 주기에서 계산됩니다.
주기에서 이전 MACD 버퍼의 데이터를 사용하여 볼린저 밴드 버퍼가 계산됩니다.

메인 루프의 카운팅 방향을 변경하고 하나의 루프에서 모든 것을 한 번에 계산하려고 시도하고
Bollinger Bands를 계산할 때 추가 사이클을 동시에 제거하는 것은 실패로 끝났습니다.
표시기는 손대지 않은 상대와 같은 방식으로 그리지만 히스토리를 계산할 때 터미널 속도를 크게 떨어뜨립니다.
역사가 많을수록 브레이크가 더 강해집니다.

그러면 터미널이 끊기고 다시 시작해야 합니다.

왜 이런 일이 발생하는지 조언을 도와주세요. 그렇지 않으면 어디서 파야하는지 이해할 수 없습니다.

그리고 누군가 천천히 실행되는 프로그램의 위치를 계산하는 방법을 알려줄까요?

조언 미리 감사드립니다!


이것은 원본이며, 내 변경 사항으로 더 낮습니다.

 //+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property   copyright "Copyright © 2005, adoleh2000"
#property   link        "http://www.metaquotes.net/"
//---- indicator settings
#property   indicator_separate_window
#property   indicator_buffers 4
#property   indicator_color1   Lime     //bbMacd up
#property   indicator_color2   Magenta //bbMacd up
#property   indicator_color3   Blue     //Upperband
#property   indicator_color4   Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12 ;
extern int SlowLen = 26 ;
extern int Length = 10 ;
extern double StDv = 2.5 ;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];   // bbMacd
double ExtMapBuffer2[];   // bbMacd
double ExtMapBuffer3[];   // Upperband Line
double ExtMapBuffer4[];   // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers ( 8 );   
//---- drawing settings     
   SetIndexBuffer ( 0 , ExtMapBuffer1); // bbMacd line
   SetIndexStyle ( 0 , DRAW_ARROW );
   SetIndexArrow ( 0 , 108 );
   IndicatorDigits ( Digits + 1 );
//----
   SetIndexBuffer ( 1 , ExtMapBuffer2); // bbMacd line
   SetIndexStyle ( 1 , DRAW_ARROW );
   SetIndexArrow ( 1 , 108 );
   IndicatorDigits ( Digits + 1 );
//----   
   SetIndexBuffer ( 2 , ExtMapBuffer3); // Upperband line
   SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID , 1 );
   IndicatorDigits ( Digits + 1 );
//----   
   SetIndexBuffer ( 3 , ExtMapBuffer4); // Lowerband line
   SetIndexStyle ( 3 , DRAW_LINE , STYLE_SOLID , 1 );
   IndicatorDigits ( Digits + 1 );
//----
   SetIndexBuffer ( 4 , bbMacd);
   SetIndexBuffer ( 5 , Upperband);        
   SetIndexBuffer ( 6 , Lowerband);
   SetIndexBuffer ( 7 , avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName ( "BB MACD(" + FastLen + "," + SlowLen + "," + Length+ ")" );
   SetIndexLabel ( 0 , "bbMacd" );
   SetIndexLabel ( 1 , "Upperband" );
   SetIndexLabel ( 2 , "Lowerband" );  
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted ();
//---- check for possible errors
   if (counted_bars < 0 ) 
       return (- 1 );
//---- last counted bar will be recounted
   if (counted_bars > 0 ) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for ( int i = 0 ; i < limit; i++)
       bbMacd[i] = iMA ( NULL , 0 , FastLen, 0 , MODE_EMA , PRICE_CLOSE , i) - 
                   iMA ( NULL , 0 , SlowLen, 0 , MODE_EMA , PRICE_CLOSE , i);
//----
   for (i = 0 ; i < limit; i++)
     {
       avg[i] = iMAOnArray (bbMacd, 0 , Length, 0 , MODE_EMA , i);
       sDev = iStdDevOnArray (bbMacd, 0 , Length, MODE_EMA , 0 , i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];   // Upperband
       ExtMapBuffer4[i]=Lowerband[i];   // Lowerband
       //----
       if (bbMacd[i] > bbMacd[i+ 1 ])
           ExtMapBuffer2[i] = EMPTY_VALUE ;
       //----
       if (bbMacd[i] < bbMacd[i+ 1 ])
           ExtMapBuffer1[i] = EMPTY_VALUE ;
     }
//---- done
   return ( 0 );
  }
//+------------------------------------------------------------------+


//=================


 //+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */ #property   copyright "Copyright © 2005, adoleh2000" #property   link        "http://www.metaquotes.net/" //---- indicator settings #property   indicator_separate_window #property   indicator_buffers 4 #property   indicator_color1   Lime     //bbMacd up #property   indicator_color2   Magenta //bbMacd up #property   indicator_color3   Blue     //Upperband #property   indicator_color4   Red     //Lowerband //---- indicator parameters extern int FastLen = 12 ; extern int SlowLen = 26 ; extern int Length = 10 ; extern double StDv = 2.5 ; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];   // bbMacd double ExtMapBuffer2[];   // bbMacd double ExtMapBuffer3[];   // Upperband Line double ExtMapBuffer4[];   // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers ( 8 );   //---- drawing settings        SetIndexBuffer ( 0 , ExtMapBuffer1); // bbMacd line    SetIndexStyle ( 0 , DRAW_ARROW );    SetIndexArrow ( 0 , 108 );    IndicatorDigits ( Digits + 1 ); //----    SetIndexBuffer ( 1 , ExtMapBuffer2); // bbMacd line    SetIndexStyle ( 1 , DRAW_ARROW );    SetIndexArrow ( 1 , 108 );    IndicatorDigits ( Digits + 1 ); //----      SetIndexBuffer ( 2 , ExtMapBuffer3); // Upperband line    SetIndexStyle ( 2 , DRAW_LINE , STYLE_SOLID , 1 );    IndicatorDigits ( Digits + 1 ); //----      SetIndexBuffer ( 3 , ExtMapBuffer4); // Lowerband line    SetIndexStyle ( 3 , DRAW_LINE , STYLE_SOLID , 1 );    IndicatorDigits ( Digits + 1 ); //----    SetIndexBuffer ( 4 , bbMacd);    SetIndexBuffer ( 5 , Upperband);            SetIndexBuffer ( 6 , Lowerband);    SetIndexBuffer ( 7 , avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName ( "BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+ ")" );    SetIndexLabel ( 0 , "bbMacd" );    SetIndexLabel ( 1 , "Upperband" );    SetIndexLabel ( 2 , "Lowerband" );            //---- initialization done    return ( 0 );   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return ( 0 );   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted (); //---- check for possible errors    if (counted_bars < 0 )        return (- 1 ); //---- last counted bar will be recounted    if (counted_bars > 0 )        counted_bars--;    limit = Bars - counted_bars;              if (counted_bars== 0 ){               for (i= Bars - 1 ; i>= 1 ; i--) bbMacd[i]= 0.0 ; //обнулим первый рассчитываемый массив              MaxPeriod= MathMax ( MathMax (FastLen,SlowLen), Length); //это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл    for (i=limit; i>= 1 ; i--){ //ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA ( NULL , 0 , FastLen, 0 , MODE_EMA , PRICE_CLOSE , i) -                    iMA ( NULL , 0 , SlowLen, 0 , MODE_EMA , PRICE_CLOSE , i);                           avg[i] = iMAOnArray (bbMacd, 0 , Length, 0 , MODE_EMA , i);        sDev = iStdDevOnArray (bbMacd, 0 , Length, MODE_EMA , 0 , i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];   // Upperband        ExtMapBuffer4[i]=Lowerband[i];   // Lowerband        //----        if (bbMacd[i] > bbMacd[i+ 1 ])            ExtMapBuffer2[i] = EMPTY_VALUE ;        //----        if (bbMacd[i] < bbMacd[i+ 1 ])            ExtMapBuffer1[i] = EMPTY_VALUE ;      } //ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return ( 0 );   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest :
모두에게 좋은 하루!
도와주세요!
이것은 BB MACD입니다 - 여기에서 제가 다운로드한 MetaTrader 4 표시기 https://www.mql5.com/en/code/9325
이 지표는 두 주기로 계산되며 첫 번째 주기에서 MACD 버퍼가 두 번째 주기에서 계산됩니다.
주기에서 이전 MACD 버퍼의 데이터를 사용하여 볼린저 밴드 버퍼가 계산됩니다.

메인 루프의 카운팅 방향을 변경하고 하나의 루프에서 모든 것을 한 번에 계산하려고 시도하고
Bollinger Bands를 계산할 때 추가 사이클을 동시에 제거하는 것은 실패로 끝났습니다.
표시기는 손대지 않은 상대와 같은 방식으로 그리지만 히스토리를 계산할 때 터미널 속도를 크게 떨어뜨립니다.
역사가 많을수록 브레이크가 더 강해집니다.

그러면 터미널이 끊기고 다시 시작해야 합니다.

왜 이런 일이 발생하는지 조언을 도와주세요. 그렇지 않으면 어디서 파야하는지 이해할 수 없습니다.

그리고 누군가 천천히 실행되는 프로그램의 위치를 계산하는 방법을 알려줄까요?

조언 미리 감사드립니다!


이것은 원본이며, 내 변경 사항으로 더 낮습니다.


//=================


모든 것을 다시 가져오고 컴퓨터를 고문하지 마십시오.

iBandsOnArray, iStdDevOnArray는 어레이에 저장된 데이터에 대해 계산됩니다.

배열은 1주기로 채워집니다.

 
Alekseu Fedotov :

모든 것을 다시 가져오고 컴퓨터를 고문하지 마십시오.

iBandsOnArray, iStdDevOnArray는 어레이에 저장된 데이터에 대해 계산됩니다.

배열은 1주기로 채워집니다.

1. 모든 것을 제자리에 놓고 컴퓨터를 괴롭히지 마십시오 .

죄송하지만 반품할 수 없습니다. 표시기는 왼쪽에서 오른쪽으로 계산해야 합니다.

그리고 나는 그를 고문하지 않고 의도한 목적을 위해 그를 사용합니다.

2. iBandsOnArray, iStdDevOnArray는 어레이에 저장된 데이터에 대해 계산됩니다.

음, 예, bbMacd[] 배열의 데이터에 대해 계산된 다음 무엇입니까?

3. 어레이는 1주기로 채워집니다.

하나 또는 첫 번째?

하나의 배열을 채우려면 다음과 같은 개인 주기가 필요하다고 말하고 싶습니다.

배열이 채워져 더 이상 작업을 수행할 수 없습니까?


지표가 느려지는 이유와 발생 위치를 계산하는 방법을 찾는 것이 중요합니다.

더 많은 질문과 답변이 없습니다.

불행히도 당신은 그렇게 말하지 않았습니다.

 

어드바이저의 기간을 변경할 때 재초기화를 비활성화하는 방법은 무엇입니까?


이 있습니다:

조언자 OnDeinit 및 OnInit를 실행하면 전역 클래스 개체가 변경 되지 않습니다 .

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


이것은 mql4에도 해당됩니까?