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

 

안녕하세요, 문제는 0을 통한 전환이 아니라 한 버퍼에서 다른 버퍼로의 전환에 있을 가능성이 큽니다. 한 막대에서 신호가 끝나고 다음 막대에서 신호가 이미 다른 버퍼에 있습니다. 두 개의 인접한 막대 사이에 어떤 색상을 표시하시겠습니까? 불명.

원한다면 노란색 선으로 세 번째 버퍼를 만들고 이 두 개 아래에 넣으면 좋을 것입니다!

 
Aleksei Stepanenko :

안녕하세요, 문제는 0을 통한 전환이 아니라 한 버퍼에서 다른 버퍼로의 전환에 있을 가능성이 큽니다. 한 막대에서 신호가 끝나고 다음 막대에서 신호가 이미 다른 버퍼에 있습니다. 두 개의 인접한 막대 사이에 어떤 색상을 표시하시겠습니까? 불명.

원한다면 노란색 선으로 세 번째 버퍼를 만들고 이 두 개 아래에 넣으면 좋을 것입니다!

Alexey, 도와주셔서 감사합니다.

세 가지 색상이 필요하지 않습니다. 두 가지면 충분합니다. 이전 색상의 선으로 빈 공간을 그리고 싶습니다. " 신호가 한 막대에서 끝나고 다음 막대에서 신호가 이미 다른 버퍼에 있습니다"라는 말의 의미를 이해하지 못했습니다. 각 막대에는 버퍼 중 하나에 값이 있으므로 차트에 표시가 있어야 합니다. 아니면 제가 이해하지 못하는 것이 있습니까?

 

글쎄, 시간은 차트에서 불연속적이며 최소 단위는 1 bar입니다. 즉, 막대 사이에 부분 시간이 없습니다. 그림을 히스토그램으로 바꾸면 두 개의 막대가 생깁니다. 두 개의 열은 색상이 다릅니다. 그러나 그들 사이에는 아무 것도 없습니다. 그리고 선은 하나의 버퍼의 값을 연결하지만 다른 값은 연결하지 않는 방식으로 그려집니다(이러한 속성이 만들어짐). 따라서 구멍.

아름다움을 원한다면 두 버퍼의 겹침에 최종 값을 부여할 수 있습니다. 새 버퍼에 신호를 주지만 여전히 한 막대에 대해 이전 버퍼에 계속 신호를 줍니다.

그러나 그러한 지표의 신호를 Expert Advisor로 가져오면 부정확성이 있을 것입니다.


또는 히스토그램은 추가적인 번거로움 없이 좋은 옵션입니다. 나는 히스토그램에 투표합니다.

 
Grigori.SB :

Alexey, 도와주셔서 감사합니다.

세 가지 색상이 필요하지 않습니다. 두 가지면 충분합니다. 이전 색상의 선으로 빈 공간을 그리고 싶습니다. " 신호가 한 막대에서 끝나고 다음 막대에서 신호가 이미 다른 버퍼에 있습니다"라는 말의 의미를 이해하지 못했습니다. 각 막대에는 버퍼 중 하나에 값이 있으므로 차트에 표시가 있어야 합니다. 아니면 제가 이해하지 못하는 것이 있습니까?

조건 없이 하나의 버퍼를 남겨두고 첫 번째 버퍼에 조건이 있는 두 번째 버퍼를 부과합니다.

 #property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed

//---- input parameters
extern int     FastEMA= 12 ;  
extern int     SlowEMA= 26 ;  
extern int     Signal= 9 ;  

//---- buffers
double DiffBuffer_up[];
double DiffBuffer_dn[];
//
double MainBuffer[];
double SignalBuffer[];

ENUM_TIMEFRAMES TimeFrame;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int     draw_begin= MathMax (FastEMA,SlowEMA);
   string short_name= "MACD Stephen" ;
   //---- indicators
   SetIndexStyle( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 ,DiffBuffer_up);
   SetIndexStyle( 1 , DRAW_LINE );
   SetIndexBuffer ( 1 ,DiffBuffer_dn);
   short_name= StringConcatenate (short_name, " (" +( string )FastEMA+ "," +( string )SlowEMA+ "," +( string )Signal+ ")" );
   IndicatorShortName(short_name);
   SetIndexDrawBegin( 0 ,draw_begin);
   SetIndexDrawBegin( 1 ,draw_begin);
   SetIndexLabel( 0 , "Up" );
   SetIndexLabel( 1 , "Down" );
   IndicatorDigits( 6 );
   SetLevelValue( 0 , 0 );
   
   TimeFrame=GetTF();
   
   return ( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

   return ( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int limit, iChart, iTF, delta= 0 ;
   datetime TimeArray[];
   //if(TimeFrame>Period()) delta=(int)MathCeil(TimeFrame/Period());
   int counted_bars=IndicatorCounted();
   //---- check for possible errors
   if (counted_bars< 0 ) return (- 1 );
   //---- the last counted bar will be recounted
   if (counted_bars> 0 ) counted_bars--;
  limit= Bars -counted_bars+delta;

  ArrayCopySeries(TimeArray,MODE_TIME, Symbol (),TimeFrame);
   ArraySetAsSeries (MainBuffer, true );
   ArraySetAsSeries (SignalBuffer, true );
   ArrayResize (MainBuffer,   100000 );
   ArrayResize (SignalBuffer, 100000 );
  
  iTF= 0 ;
   for (iChart= 0 ; iChart<limit; iChart++)
  {
       while (Time[iChart]<TimeArray[iTF]) iTF++;
      MainBuffer[iChart]= EMPTY_VALUE ;
      SignalBuffer[iChart]= EMPTY_VALUE ;
      MainBuffer[iChart]  = iMACD ( Symbol (),TimeFrame,FastEMA,SlowEMA,Signal, PRICE_CLOSE ,MODE_MAIN,iTF);
      SignalBuffer[iChart]= iMACD ( Symbol (),TimeFrame,FastEMA,SlowEMA,Signal, PRICE_CLOSE ,MODE_SIGNAL,iTF);
       double diff=MainBuffer[iChart]-SignalBuffer[iChart];
      DiffBuffer_up[iChart]=diff;
      
      
       if (diff> 0 ) //{
        DiffBuffer_dn[iChart]=diff; 
         //DiffBuffer_dn[iChart]=EMPTY_VALUE;
       //}
       //else {
         
         //DiffBuffer_up[iChart]=EMPTY_VALUE;
       //}
  }
   return ( 0 );
}
 
Aleksei Stepanenko :

글쎄, 시간은 차트에서 불연속적이며 최소 단위는 1 bar입니다. 즉, 막대 사이에 부분 시간이 없습니다. 그림을 히스토그램으로 바꾸면 두 개의 막대가 생깁니다. 두 개의 열은 색상이 다릅니다. 그러나 그들 사이에는 아무 것도 없습니다. 그리고 선은 하나의 버퍼의 값을 연결하지만 다른 값은 연결하지 않는 방식으로 그려집니다(이러한 속성이 만들어짐). 따라서 구멍.

아름다움을 원한다면 두 버퍼의 겹침에 최종 값을 부여할 수 있습니다. 새 버퍼에 신호를 주지만 여전히 한 막대에 대해 이전 버퍼에 계속 신호를 줍니다.

그러나 그러한 지표의 신호를 Expert Advisor로 가져오면 부정확성이 있을 것입니다.

또는 히스토그램은 추가적인 번거로움 없이 좋은 옵션입니다. 나는 히스토그램에 투표합니다.

정말 고마워요, 알렉시.

이제 내 머리 속에서도 선반 위의 모든 것이 분해되었습니다. 나 자신도 할 수 있지만 유리의 후속 조언처럼 짧고 우아하지는 않았습니다.

 
Iurii Tokman :

조건 없이 하나의 버퍼를 남겨두고 첫 번째 버퍼에 조건이 있는 두 번째 버퍼를 부과합니다.

허리 숙여, 유리.

그런 우아하고 간결한 솔루션은 상상조차 할 수 없었습니다.

 
Grigori.SB :

허리 숙여, 유리.

그런 우아하고 간결한 솔루션은 상상조차 할 수 없었습니다.

나는 이것을 발명한 것이 아닙니다. 여기 포럼에서 당신이 알아낸 것처럼
코드 기반에는 많은 솔루션이 있으며 이들 뿐만 아니라

 
Grigori.SB :


고마워 "고마워!

 
내 질문이 항상 무시되는 이유는 무엇입니까?
 
darirunu1 :
내 질문이 항상 무시되는 이유는 무엇입니까?

질문에 따라 다릅니다...