초보자의 질문 MQL4 MT4 MetaTrader 4 - 페이지 223

 

다른 쪽 끝에서 표시기 버퍼를 채우려고 합니다(ArraySetAsSeries(..., false)). 잠시 동안 모든 것이 제대로 작동하지만 버퍼에 문제가 발생하고 가장 최근의 배열 인덱스가 채워집니다. .
제가 알기로는 터미널이 어느 시점에서 버퍼를 끊기 때문에 배열의 맨 마지막 인덱스까지 버퍼가 채워져 있는 것처럼 보입니다. 아마도 어느 시점에서 배열 버퍼를 해제해야 하지만 언제? 테스트 케이스를 고칠 수 있습니까?


 #property indicator_buffers 1

double ExtMapBuffer[]; // AQUA   "Line"
int       LastData;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping

   SetIndexBuffer ( 0 ,ExtMapBuffer);
   SetIndexStyle( 0 , DRAW_LINE , STYLE_SOLID , 7 , clrAqua );
   SetIndexEmptyValue( 0 , 0.0 );
   SetIndexLabel( 0 , "Line" );

   LastData= 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     i;
   bool Series= false ;
   ArraySetAsSeries (ExtMapBuffer,Series);
   ArraySetAsSeries (high,Series);

   i=prev_calculated- 1 ;

   if (i< 1 ) 
     {
      LastData= 0 ;
      i= 1 ;
       while (i<rates_total- 1 )
        {
         ExtMapBuffer[i]=high[i];
         i++; 
         LastData=i;
        }
     }
   else
     {
      i=LastData;
     }

   while (i<rates_total- 1 )
     {
      ExtMapBuffer[i]=high[i];
      i++;
      LastData=i;
     }

   return (rates_total);
  }
//+------------------------------------------------------------------+
 

안녕하세요.

이 표시기가 히스토리에 화살표 를 거의 그리지 않는 이유와 거래를 시작하면 화살표를 자주 그리기 시작하는 이유를 알려주세요.

그런 다음 MT4를 닫았다가 다시 열면 지표가 실시간으로 기관총처럼 거래를 그리는 같은 장소에서 다시 1-2 거래가 있습니다.

그리고 히스토리를 보면 지표가 잘 매매되어야 할 것 같지만, 실시간 매매를 켜면 뭐든지 시작됩니다.

왜 그런지 말해줘? 표시기 코드는 다음과 같습니다.

 //---- indicator settings
#property   indicator_chart_window
#property   indicator_buffers 2
#property   indicator_color1   Blue
#property   indicator_color2   Red
//---- indicator parameters
extern int   period = 4 ; //12
extern int   shift  = 0 ; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 2 );
//---- drawing settings
   SetIndexStyle( 0 , DRAW_ARROW , 2 );
   SetIndexArrow( 0 , 233 );
   SetIndexStyle( 1 , DRAW_ARROW , 2 );
   SetIndexArrow( 1 , 234 );

   SetIndexBuffer ( 0 ,BufferUp); //стрелка синяя верх
   SetIndexBuffer ( 1 ,BufferDn); //стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "T3MA-ALARM (" +period+ ")" );
//---- initialization done
   if ( Digits == 3 || Digits == 5 ) q= 10 ;
   st=st*q;
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete ( "low" );
   ObjectDelete ( "high" );
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int     i;
   ArraySetAsSeries (Ma, true );
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if (counted_bars< 0 ) return (- 1 );
   if (counted_bars> 0 ) counted_bars--;
   int limit1= Bars -counted_bars;
   if (counted_bars== 0 ) limit1-= 1 + MathMax (period,shift)+ 2 ;

   int buffer_size= ArraySize (BufferUp);
   ArrayResize (Ma,buffer_size);
   ArrayResize (MaOn,buffer_size);

   ArrayResize (y0,buffer_size+shift+ 2 );
   ArrayResize (y1,buffer_size+shift+ 2 );
   ArrayResize (y2,buffer_size+shift+ 2 );

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 0 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 0 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 0 ; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+ 1 +shift]=MaOn[i+ 1 +shift];
      y2[i+ 2 +shift]=MaOn[i+ 2 +shift];

       if (y0[i+shift]-y1[i+ 1 +shift]< 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]> 0 ){BufferDn[i+ 1 ]=High[i+ 1 ]+st* Point ;}
       if (y0[i+shift]-y1[i+ 1 +shift]> 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]< 0 ){BufferUp[i+ 1 ]=Low[i+ 1 ]-st* Point ;}
       //---- Signal Trend Up || Dn ---------------------------------------------   
       if (y0[i]-y1[i+ 1 ]> 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n BUY TREND " ,DoubleToStr(Close[i], Digits ));

       else if (y0[i]-y1[i+ 1 ]< 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n SELL TREND " ,DoubleToStr(Close[i], Digits ));
     }

//---- done
   return ( 0 );
  }
//+---------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE. В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA...
 

세 곳에서 0을 1로 바꾸십시오.

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
 
Aleksei Stepanenko :

세 곳에서 0을 1로 바꾸십시오.

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
        // вот сюда
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)

나도 옮기겠다.

 
Vitaly, 나는 사람들이 질문을 작성하고 그들의 사업에 대해 갈 것이라는 것을 알아차렸고, 여기서 우리는 서로 즐겁게 지냈습니다. 때때로 계산이 포함된 여러 시트.
 
Aleksei Stepanenko :

세 곳에서 0을 1로 바꾸십시오.

매우 감사합니다. 그리고 그가 현재 기간의 현재 촛불이 끝날 때만 거래를 열도록 하는 방법은 무엇입니까? :)) 지금 그는 거래가 언제인지 이해하지 못합니다 ... 화살표가 올바르게 그려지는 것처럼 보이고 촛불을 보면 모든 것이 괜찮아 보이지만 거래 자체가 열려 있습니다. 일반적으로 촛불이 있어야 할 곳이 아닌 모든 곳에서 촛불의 중간 또는 끝 부분에 더 가깝습니다. :(

 //---- indicator settings
#property   indicator_chart_window
#property   indicator_buffers 2
#property   indicator_color1   Blue
#property   indicator_color2   Red
//---- indicator parameters
extern int   period = 4 ; //12
extern int   shift  = 0 ; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,st= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers( 2 );
//---- drawing settings
   SetIndexStyle( 0 , DRAW_ARROW , 2 );
   SetIndexArrow( 0 , 233 );
   SetIndexStyle( 1 , DRAW_ARROW , 2 );
   SetIndexArrow( 1 , 234 );

   SetIndexBuffer ( 0 ,BufferUp); //стрелка синяя верх
   SetIndexBuffer ( 1 ,BufferDn); //стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "T3MA-ALARM (" +period+ ")" );
//---- initialization done
   if ( Digits == 3 || Digits == 5 ) q= 10 ;
   st=st*q;
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete ( "low" );
   ObjectDelete ( "high" );
  }
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
//---- ArraySetAsSeries --------------------------------------------------  
   double Ma[],MaOn[];
   double y0[],y1[],y2[];
//   int i;
   int     i;
   ArraySetAsSeries (Ma, true );
//---- IndicatorCounted --------------------------------------------------
   int counted_bars=IndicatorCounted();
   if (counted_bars< 0 ) return (- 1 );
   if (counted_bars> 0 ) counted_bars--;
   int limit1= Bars -counted_bars;
   if (counted_bars== 0 ) limit1-= 1 + MathMax (period,shift)+ 2 ;

   int buffer_size= ArraySize (BufferUp);
   ArrayResize (Ma,buffer_size);
   ArrayResize (MaOn,buffer_size);

   ArrayResize (y0,buffer_size+shift+ 2 );
   ArrayResize (y1,buffer_size+shift+ 2 );
   ArrayResize (y2,buffer_size+shift+ 2 );

   int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
     {
      y0[i+shift]=MaOn[i+shift];
      y1[i+ 1 +shift]=MaOn[i+ 1 +shift];
      y2[i+ 2 +shift]=MaOn[i+ 2 +shift];

       if (y0[i+shift]-y1[i+ 1 +shift]< 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]> 0 ){BufferDn[i+ 1 ]=High[i+ 1 ]+st* Point ;}
       if (y0[i+shift]-y1[i+ 1 +shift]> 0 && y1[i+ 1 +shift]-y2[i+ 2 +shift]< 0 ){BufferUp[i+ 1 ]=Low[i+ 1 ]-st* Point ;}
       //---- Signal Trend Up || Dn ---------------------------------------------   
       if (y0[i]-y1[i+ 1 ]> 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n BUY TREND " ,DoubleToStr(Close[i], Digits ));

       else if (y0[i]-y1[i+ 1 ]< 0 ) Comment ( "\n SWAPLONG = " ,MarketInfo( Symbol (),MODE_SWAPLONG),
         "   SWAPSHORT = " ,MarketInfo( Symbol (),MODE_SWAPSHORT), "\n SELL TREND " ,DoubleToStr(Close[i], Digits ));
     }

//---- done
   return ( 0 );
  }
//+---------------------------------------------------------------------+
 

일반적으로 막 닫은 양초에 대한 모든 정보가 이미 있는 경우 새 양초 가 생성될 때 거래를 시작하는 것이 일반적입니다.

 datetime LastTime= 0 ;


void OnTick ()
   {
   if (LastTime== iTime (symbol,frame, 0 )) return ;
   LastTime= iTime (symbol,frame, 0 );
 
Vitaly Muzichenko :

나도 옮기겠다.

그리고 정확히 어디에서 그것을 보여주었습니까?

 int limit= ArraySize (Ma);
//---- EMA --------------------------------------------------------------- 
// а не вот сюда?
   for (i=limit1; i>= 1 ; i--)  Ma[i]  = iMA ( NULL , 0 ,period, 0 , MODE_EMA , PRICE_CLOSE ,i);
        
   for (i=limit1; i>= 1 ; i--)  MaOn[i]=iMAOnArray(Ma,limit,period, 0 , MODE_EMA ,i);

   for (i=limit1; i>= 1 ; i--)
 
Aleksei Stepanenko :

일반적으로 막 닫은 양초에 대한 모든 정보가 이미 있는 경우 새 양초 가 생성될 때 거래를 시작하는 것이 일반적입니다.

그리고 이 코드가 제대로 작동하도록 삽입하기에 가장 좋은 위치는 어디입니까? 그리고 나는 길의 맨 처음에만 아주 잘 이해하지 못합니다 ...
 
Aleksei Stepanenko :
Vitaly, 나는 사람들이 질문을 작성하고 그들의 사업에 대해 갈 것이라는 것을 알아차렸고, 여기서 우리는 서로 즐겁게 지냈습니다. 때때로 계산이 포함된 여러 시트.
보시다시피 항상 그런 것은 아닙니다. :))