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

 
Seric29 :

글쎄, 예를 들어 같음, 빼기, 더하기, 부등식, 곱셈 등과 같이 하나의 표현식을 검사하는 많은 작은 함수를 리벳으로 고정하는 것을 제외하고.

비교 등을 위해 캐시에 CompareDoublesWithEpsilon(double d1,d2,epsilon) 유형의 함수가 있어야 하므로 사용하십시오.


PS/ "뺄셈, 덧셈, 곱셈에 대한 표현식 확인"이 무엇이며 이해하지 못했습니다 :-(

 

더 높은 시간대에서 M1 의 바가 열리는 시간을 확인하는 방법은 무엇입니까?

어린아이에서 큰아이를 보면

   int limit=rates_total-prev_calculated;
   if (limit> 1 )
     {
      limit=rates_total- 2 ;
       ArrayInitialize (BufferUP, EMPTY_VALUE );
       ArrayInitialize (BufferDN, EMPTY_VALUE );
     }
   for ( int i=limit; i>= 0 ; i--)
     {
   int yy=   iBarShift ( Symbol (), PERIOD_H1 ,time[i]);
     Print (" iTime : ", iTime ( Symbol (), PERIOD_H1 ,yy));
     }
 
yiduwi :

더 높은 시간대에서 M1 의 바가 열리는 시간을 확인하는 방법은 무엇입니까?

어린아이에서 큰아이를 보면

내가 올바르게 이해한다면 다음과 같습니다.

datetime time_h1=iTime(_Symbol,PERIOD_H1,1);  // время открытия прошлого бара H1

int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1

datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия

//PS - 차이점은 h2에서만 가능하며 월요일 아침에만 가능합니다 :-)

 
Maxim Kuznetsov :

내가 올바르게 이해한다면 다음과 같습니다.

datetime time_h1=iTime(_Symbol,PERIOD_H1,1);  // время открытия прошлого бара H1

int bar_m1=iBarShift(_Symbol,PERIOD_M1,time_h1); // соотв. ему бар периода M1

datetime time_m1=iTime(_Symbol,PERIOD_M1,bar_m1); // время его открытия

//PS - 차이점은 h2에서만 가능하며 월요일 아침에만 가능합니다 :-)

마지막 막대 H1 의 여는 시간 이 01:00:00 이라고 가정하면 01:01:00에 열린 M1 막대에서 time_m1 변수로 시간을 가져오는 방법은 무엇입니까?

 
yiduwi :

마지막 막대 H1 의 여는 시간 이 01:00:00 이라고 가정하면 01:01:00에 열린 M1 막대에서 time_m1 변수로 시간을 가져오는 방법은 무엇입니까?

time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 갑자기 :-) 시간에 1분 = 60초를 추가하면 됩니다.

그러나 요일/세션/주 또는 이국적인 통화/인덱스/펀드의 변경에 빠질 위험이 있는 경우 완전한 확실성을 위해 iBarShift, iTime을 다시 한 번 타십시오. 괜찮은 장소에서 첫 번째 거래로 바가 형성되기 때문입니다. (볼륨이 없는 막대는 없음) 거래가 없습니다. "황소"가 있을 것입니다.

 
Maxim Kuznetsov :

time_m1_plus_1=time_h1 + 1 * PeriodSeconds(PERIOD_M1); // 갑자기 :-) 시간에 1분 = 60초를 추가하면 됩니다.

이것은 중요합니다. 필요한 것) 지정된 시간이 모든 시간대의 막대 안에 있는지 확인하려면 다음을 수행해야 합니다.

   for ( int i=limit; i>= 0 ; i--)
     {
       if (time[i]<= StringToTime ( "2019.04.23 01:01:00" ) && time[i]+ Period ()* PeriodSeconds ( PERIOD_M1 )>= StringToTime ( "2019.04.23 01:01:00" )
        {
         BufferUP[i]=low[i]- 10 * Point ; //
         }
        }

그러나 시간이 정확하고 분 없이 "2019.04.23 01:00:00" 이면 화살표는 두 개의 막대에 있습니다. 막대는 01:00:00이고 이전 막대는 00:00:00입니다. 하나 더 넣어?

 


낮과 계절의 모든 부분이 좋음))

칠면조가 작성했습니다. 작동하지만 전문가 섹션에 지속적으로 오류를 기록합니다.

문제를 해결하려고 시도합니다 ... 지금까지 "어느 것이 맨 위로" ..)))

말해봐, pliz, 내가 경험 부족으로 엉망이 된 곳 ....

코드에서 문제가 있는 부분을 빨간색으로 강조 표시했습니다... 아니면 녹색이 더 좋을 것입니다!?)))

추신: MT5의 핸들 작동 조건 때문에 핸들 옵션을 원칙적으로 거부합니다.

코드에 심각한 버그가 있는 경우 약간의 임금을 지불할 용의가 있습니다.

그러나 나는 문제의 본질에 접근하고 싶다!!!!

 //+------------------------------------------------------------------+
//|                                   Ind Sliding Line Level MT5.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_width1    1    
//----
enum method
  {
   Simple= MODE_SMA ,
   Exponential= MODE_EMA ,
  };
//----
enum applied
  {
   CLOSE= PRICE_CLOSE ,
   OPEN= PRICE_OPEN ,
   HIGH= PRICE_HIGH ,
   LOW= PRICE_LOW
  };
//--- входные параметры
input int     InpMAPeriod = 10 ;                       // Период мультитаймфреймовой линии
input int     InpBars = 50 ;                           // Расчитать баров (Период линии х 5)
input int     InpMAShift = 0 ;                         // Сдвиг линии
//--- параметры для выбранного таймфрема
input string TimeBar = "2019.04.19 00:00" ;           //Дата начала отсчета
input bool DataBars = false ;                         //Считать по дате (true)
input int MAShift = 2 ;                               //Сдвиг бара таймфрема 
input ENUM_TIMEFRAMES Timeframes = PERIOD_D1 ;       //Таймфрейм скользящей
input method  MethodLine = Simple;                   //Метод  расчета скользящей
input applied AppliedPrice = CLOSE;                 //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle = STYLE_DASH ;         //Стиль всех скользящих линий
input color ColorLine = clrRed ;                     //Цвет скользящей и таймфрейма
input int maWidthAll = 0 ;                           //Толщина всех скользящих линий
input bool Ray = true ;                               //Сдвиг тренда вправо до шкалы
input bool LineTrend = true ;                         //Выбор Линия(true) Отрезок(false)
input bool HLines = false ;                       //Выключатель горизонтального уровня 
//----
int     i,period_ma,beginbar,nn,BigPeriod;
double ExtLineBuffer[],ArrayPrice[];
double SMA= 0.0 ,EMA= 0.0 ;
double bp,bp1,bp2,bp3;
datetime time_1,time_2;
string smaname= "" ,emaname= "" ;
string tooltipsma= "" ,tooltipema= "" ;
string type_ma= "" ,pr= "" ;
bool    sma= false ,ema= false ,ok;
//+------------------------------------------------------------------+
//|   simple moving average multytimeframes                          |
//+------------------------------------------------------------------+
void CalculateSimpleMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int j,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 ) // first calculation
     {
      limit=period_ma+begin;
       //--- set empty value for first limit bars
       for (j= 0 ;j<limit- 1 ;j++) ExtLineBuffer[j]= 0.0 ;
       //--- calculate first visible value
       double fvalue= 0 ;
       for (j=begin;j<limit;j++)
         fvalue+=price[j];
      fvalue/=period_ma;
      ExtLineBuffer[limit- 1 ]=fvalue;
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (j=limit;j<rates_total && ! IsStopped ();j++)
      ExtLineBuffer[j]=ExtLineBuffer[j- 1 ]+(price[j]-price[j-period_ma])/period_ma;
//---
  }
//+------------------------------------------------------------------+
//|  exponential moving average multytimeframes                      |
//+------------------------------------------------------------------+
void CalculateExponentialMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int     q,limit;
   double SmoothFactor= 2.0 /( 1.0 +period_ma);
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      limit=period_ma+begin;
      ExtLineBuffer[begin]=price[begin];
   for (q=begin+ 1 ;q<limit;q++)
         ExtLineBuffer[q]=price[q]*SmoothFactor+ExtLineBuffer[q- 1 ]*( 1.0 -SmoothFactor);
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (q=limit;q<rates_total && ! IsStopped ();q++)
      ExtLineBuffer[q]=price[q]*SmoothFactor+ExtLineBuffer[q- 1 ]*( 1.0 -SmoothFactor);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
  period_ma= int (InpMAPeriod< 1 ? 1 : InpMAPeriod);
  smaname= "Ind SMA " + string (InpMAPeriod);
  emaname= "Ind EMA " + string (InpMAPeriod);
//---
   SetIndexBuffer ( 0 ,ExtLineBuffer, INDICATOR_DATA );
   switch (Timeframes)
     {
       case PERIOD_MN1 : BigPeriod= PERIOD_MN1 ; ok= true ;  pr= "MN1" ;   break ;
       case PERIOD_W1 :  BigPeriod= PERIOD_MN1 ; ok= true ;  pr= "W1" ;   break ;
       case PERIOD_D1 :  BigPeriod= PERIOD_W1 ;  ok= true ;  pr= "D1" ;   break ;
       case PERIOD_H12 : BigPeriod= PERIOD_D1 ;  ok= true ;  pr= "H12" ;   break ;
       case PERIOD_H8 :  BigPeriod= PERIOD_D1 ;  ok= true ;  pr= "H8" ;   break ;
       case PERIOD_H4 :  BigPeriod= PERIOD_D1 ;  ok= true ;  pr= "H4" ;   break ;
       case PERIOD_H3 :  BigPeriod= PERIOD_H4 ;  ok= true ;  pr= "H3" ;   break ;
       case PERIOD_H2 :  BigPeriod= PERIOD_H4 ;  ok= true ;  pr= "H2" ;   break ;
       case PERIOD_H1 :  BigPeriod= PERIOD_H4 ;  ok= true ;  pr= "H1" ;   break ;
       case PERIOD_M30 : BigPeriod= PERIOD_H1 ;  ok= true ;  pr= "M30" ;   break ;
       case PERIOD_M20 : BigPeriod= PERIOD_H1 ;  ok= true ;  pr= "M20" ;   break ;
       case PERIOD_M15 : BigPeriod= PERIOD_M30 ; ok= true ;  pr= "M15" ;   break ;
       case PERIOD_M12 : BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M12" ;   break ;
       case PERIOD_M10 : BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M10" ;   break ;
       case PERIOD_M6 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M6" ;   break ;
       case PERIOD_M5 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M5" ;   break ;
       case PERIOD_M4 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M4" ;   break ;
       case PERIOD_M3 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M3" ;   break ;
       case PERIOD_M2 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M2" ;   break ;
       case PERIOD_M1 :  BigPeriod= PERIOD_M15 ; ok= true ;  pr= "M1" ;   break ;
     }
   switch (MethodLine)
     {
       case Simple:       sma= true ;  type_ma= "SMA " ;   break ;
       case Exponential:  ema= true ;  type_ma= "EMA " ;   break ;
     }
//--- set accuracy
   IndicatorSetInteger ( INDICATOR_DIGITS , _Digits );
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,period_ma);
//---- line shifts when drawing
   PlotIndexSetInteger ( 0 , PLOT_SHIFT ,InpMAShift);
//---
   PlotIndexSetInteger ( 0 , PLOT_LINE_COLOR ,ColorLine);
//---
   IndicatorSetString ( INDICATOR_SHORTNAME ,type_ma+ " " + string (period_ma));
//---- sets drawing line empty value--
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
//----
   ChartRedraw ( 0 );
//---- initialization done
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   ObjectsDeleteAll ( 0 ,smaname);
   ObjectsDeleteAll ( 0 ,emaname);
   ObjectsDeleteAll ( 0 , "No Period " );
   Comment ( "" ); 
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
//--- минимальное количество баров
   if (rates_total<period_ma- 1 +begin)
   return ( 0 );
//--- Количество начальных баров без отрисовки и значений 
       PlotIndexSetInteger ( 0 , PLOT_DRAW_BEGIN ,period_ma- 1 +begin);
   if (prev_calculated== 0 )
     {
       ArrayInitialize (ExtLineBuffer, 0 );
       ArrayInitialize (ArrayPrice, 0 );
     }
//--- calculation
   switch (MethodLine)
     {
       case Simple:       CalculateSimpleMA(rates_total,prev_calculated,begin,price);       break ;
       case Exponential:  CalculateExponentialMA(rates_total,prev_calculated,begin,price);   break ;
     }
//считаем количество элементов буфера
int size= ArraySize (ExtLineBuffer);
         ArrayResize (ArrayPrice,size, 100000 );
//---- Расчет и построение горизонтального уровня выбранного таймфрейма
 if (DataBars== false )
    beginbar=MAShift;
 if (DataBars== true )
    beginbar= iBarShift ( _Symbol ,Timeframes, StringToTime (TimeBar));
    time_1= iTime ( _Symbol ,Timeframes,beginbar);
    time_2= iTime ( _Symbol ,Timeframes, 0 );

 if (HLines== true )
  {
//+------------------------------------------------------------------+
//|   Simple Moving Average                                          |
//+------------------------------------------------------------------+
 if (sma== true && ok== true && Period ()<=BigPeriod)   //SMA
   {
int   lim=period_ma+beginbar;
double firstValue= 0.0 ;
   for (i=beginbar;i<lim;i++)
   switch (AppliedPrice)
     {
       case 1 : firstValue+= iClose ( _Symbol ,Timeframes,i); break ;
       case 2 : firstValue+= iOpen ( _Symbol ,Timeframes,i);   break ;
       case 3 : firstValue+= iHigh ( _Symbol ,Timeframes,i);   break ;
       case 4 : firstValue+= iLow ( _Symbol ,Timeframes,i);   break ;
   default :  firstValue+= iClose ( _Symbol ,Timeframes,i); break ;
     }
      firstValue/=period_ma;
//-----
      SMA= NormalizeDouble (firstValue, _Digits );
   if (LineTrend== true )
      tooltipsma= "Line " +type_ma+ string (InpMAPeriod)+ "  " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + DoubleToString (SMA, _Digits );
   else
      tooltipsma= "Trend " +type_ma+ string (InpMAPeriod)+ "  " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + "Original Price: " + DoubleToString (SMA, _Digits );
   if (LineTrend== true )
      HLine( 0 ,smaname,tooltipsma,time_1,SMA,MAStyle,maWidthAll,ColorLine);
   else
      PlotTrend( 0 ,smaname,tooltipsma, 0 ,time_1,SMA,time_2,SMA,ColorLine,MAStyle,maWidthAll, true , false , false , true );
//----
   } //sma==true 
//----------------------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//|   Exponential Moving Average                                       |
//+------------------------------------------------------------------+
 if (ema== true && ok== true && Period ()<=BigPeriod)   //EMA
   {
int p,lmt;
double    SmoothFactor= 2.0 /( 1.0 +period_ma);
   if (prev_calculated== 0 )
       lmt= 0 ;
   else 
       lmt=InpBars;
   for (p=lmt;p>=beginbar;p--)
     {
   switch (AppliedPrice)
     {
       case 1 : ArrayPrice[lmt]= iClose ( _Symbol ,Timeframes,lmt); break ;
       case 2 : ArrayPrice[lmt]= iOpen ( _Symbol ,Timeframes,lmt); break ;
       case 3 : ArrayPrice[lmt]= iHigh ( _Symbol ,Timeframes,lmt); break ;
       case 4 : ArrayPrice[lmt]= iLow ( _Symbol ,Timeframes,lmt); break ;
   default :  ArrayPrice[lmt]= iClose ( _Symbol ,Timeframes,lmt); break ;
     }
   switch (AppliedPrice)
     {
       case 1 : ArrayPrice[p]= iClose ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ;
       case 2 : ArrayPrice[p]= iOpen ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor);   break ;
       case 3 : ArrayPrice[p]= iHigh ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor);   break ;
       case 4 : ArrayPrice[p]= iLow ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor);   break ;
   default :  ArrayPrice[p]= iClose ( _Symbol ,Timeframes,p)*SmoothFactor+ArrayPrice[p+ 1 ]*( 1.0 -SmoothFactor); break ;
     }
     } //for
/ /------------------------------------------------------------------------------------------------------------- 
      EMA= NormalizeDouble (ArrayPrice[beginbar], _Digits );
   if (LineTrend== true )
      tooltipema= "Line " +type_ma+ string (InpMAPeriod)+ "  " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + DoubleToString (EMA, _Digits );
   else
      tooltipema= "Trend " +type_ma+ string (InpMAPeriod)+ "  " +pr+ "\n" + TimeToString ( iTime ( _Symbol ,Timeframes,beginbar), TIME_DATE | TIME_MINUTES )+ "\n" + "Original Price: " + DoubleToString (EMA, _Digits );
   if (LineTrend== true )
      HLine( 0 ,smaname,tooltipema,time_1,EMA,MAStyle,maWidthAll,ColorLine);
   else
      PlotTrend( 0 ,smaname,tooltipema, 0 ,time_1,EMA,time_2,EMA,ColorLine,MAStyle,maWidthAll, true , false , false , true );
       ArrayFree (ArrayPrice);
//----
   }   //ema==true
   }   //if(HLines==true)
      
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
//| Вывод горизонтальной линии на график                             |
//+------------------------------------------------------------------+
bool HLine( const long               chart_ID= 0 ,
           string                   name= "" ,
           string                   tooltip= "" ,
           datetime                 time= 0 ,
           double                   price= 0 ,
           int                      style= STYLE_SOLID ,
           int                      width= 1 ,
           color                    clr= clrBlack )
  {
//--- сбросим значение ошибки 
   ResetLastError (); 
//---
 if (! ObjectCreate (chart_ID,name, OBJ_HLINE , 0 , 0 ,price)) 
     { 
       Print ( __FUNCTION__ , ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ()); 
   return ( false ); 
     }       
       ObjectSetInteger (chart_ID,name, OBJPROP_STYLE , style);
       ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH , width);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR , clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN , true ); 
       ObjectSetString (chart_ID,name, OBJPROP_TOOLTIP ,tooltip);
//----
   return ( true );
  }
//+------------------------------------------------------------------+
//|  Построение трендовой линии на графике                           |
//+------------------------------------------------------------------+
bool PlotTrend( const long               chart_ID= 0 ,
               string                   name= "" ,
               string                   tooltip= "" ,
               const int                subwindow= 0 ,
               datetime                 time1= 0 ,
               double                   price1= 0 ,
               datetime                 time2= 0 ,
               double                   price2= 0 ,
               const color              clr= clrBlack ,
               const ENUM_LINE_STYLE    style= STYLE_SOLID ,
               const int                width= 2 ,
               const bool               back= true ,
               const bool               selection= false ,
               const bool               ray= false ,
               const bool               hidden= true )
  {
//----
   ResetLastError ();
 if ( ObjectFind (chart_ID,name)!=subwindow)
   {
 if (! ObjectCreate (chart_ID,name, OBJ_TREND ,subwindow,time1,price1,time2,price2))
   {
   Print ( __FUNCTION__ , ": не удалось создать трендовую линию! Код ошибки = " , GetLastError ()); 
   return ( false );
   }
   }
 else
   {
   ObjectMove (chart_ID,name, 0 ,time1,price1);
   ObjectMove (chart_ID,name, 1 ,time2,price2);
   }
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_RAY ,ray);
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
   ObjectSetString (chart_ID,name, OBJPROP_TOOLTIP ,tooltip);
//----
   return ( true );
  }
//+------------------------------------------------------------------+
 
kopeyka2 :

칠면조가 작성했습니다. 작동하지만 전문가 섹션에 지속적으로 오류를 기록합니다.

내 로그는 깨끗하고 임의로 모드를 전환했습니다(EMA도 테스트했습니다). 오류가 나타날 수 있는 설정의 변형을 제공하십시오.

어떻게 작동하고 동시에 오류를 줄 수 있는지 흥미로웠습니다.

 
yiduwi :

이것은 중요합니다. 필요한 것) 지정된 시간이 모든 시간대의 막대 안에 있는지 확인하려면 다음을 수행해야 합니다.

그러나 시간이 정확하고 분 없이 "2019.04.23 01:00:00" 이면 화살표는 두 개의 막대에 있습니다. 막대는 01:00:00이고 이전 막대는 00:00:00입니다. 하나 더 넣어?

if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {

  // время time[i] попало внутрь бара открытого в time_m1

}

 
Igor Zakharov :

내 로그는 깨끗하고 임의로 모드를 전환했습니다(EMA도 테스트했습니다). 오류가 나타날 수 있는 설정의 변형을 제공하십시오.

어떻게 작동하고 동시에 오류를 줄 수 있는지 흥미로웠습니다.

EMA20 23.04.2019 10:00


EMA 라인 20 23.04.2019 00:00

온라인 연결 없이 MT5를 켜면 "array out ...." 메시지가 즉시 나타납니다.

오류는 다양하지만 항상 존재합니다. 그들은 온라인에서 번식할 수 있지만 MT가 켜져 있을 때 더 자주 나타납니다.


여기에 "버뮤다 평행 육면체"의 신비가 있습니다.