지표 질문 - 페이지 3

 
Agent86 :
.

그래서 여하튼 나는 iMACD 십자가, EMA 십자가 또는 다른 지표 십자가와 같은 다른 조건이 발생할 때만 높은 프랙탈이 형성되도록 하려고 했습니다.
모든 조건이 충족될 때만 프랙탈이 표시기에 표시되도록 합니다.


나는 당신이 무엇을 하려는지 정확히 확신하지 못했지만 이것을 시도하고 외부 입력에 주목하십시오.

 #property indicator_chart_window      extern bool condition1 = true;
#property indicator_buffers 3          extern bool condition2 = true;
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers ( 3 );

   SetIndexArrow ( 0 , 111 );
   SetIndexStyle ( 0 , DRAW_ARROW , STYLE_DOT , 1 , Blue );
   SetIndexBuffer ( 0 , v1);
   SetIndexLabel ( 0 , "Resistance" );

   SetIndexArrow ( 1 , 111 );
   SetIndexStyle ( 1 , DRAW_ARROW , STYLE_DOT , 1 , Red );
   SetIndexBuffer ( 1 , v2);
   SetIndexLabel ( 1 , "Support" );

   SetIndexArrow ( 2 , 111 );
   SetIndexStyle ( 2 , DRAW_ARROW , STYLE_DOT , 1 , White );
   SetIndexBuffer ( 2 , v3);
   SetIndexLabel ( 2 , "High A" ); 
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double    faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 ), //MODE_MAIN
            slower = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL, 1 ); //MODE_SIGNAL
           
            
   int bars = Bars ;
//----
  
   for ( int i=bars; i>= 0 ; i--)
    {
     if (condition1)
       {
        val1= iFractals ( NULL , 0 , MODE_UPPER,i);
         if (val1 > 0 ) v1[i]=High[i];       
       }   
     if (condition2)
       {      
        val2= iFractals ( NULL , 0 , MODE_LOWER,i);
         if (val2 > 0 ) v2[i]=Low[i];
       }
     }    
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
WHRoeder :
정확히 어떻게 그 결론에 도달했으며 기능적 차이점은 무엇입니까?

나는 아마도 OOP 관점에서보고 있었기 때문에 그 결론에 도달했습니다. 예, 이것은 MQL4의 경우에는 사실이 아닙니다. 지금 기억합니다. 좋은 습관이 될 수 있지만?

 

아니면 이와 같은 것입니까?

하지만 실제로 IndicatorCounted()를 사용해야 합니다. 이렇게 하면 표시기가 모든 개체를 한 번만 그리고 새 막대가 형성될 때 새 개체를 추가하는 대신 새 틱마다 모든 개체를 다시 그리기 때문입니다.

 #property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 White

//---- buffers
double v1[];
double v2[];
double v3[];
double val1;
double val2;
double val3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
//----
   IndicatorBuffers ( 3 );

   SetIndexArrow ( 0 , 111 );
   SetIndexStyle ( 0 , DRAW_ARROW , STYLE_DOT , 1 , Blue );
   SetIndexBuffer ( 0 , v1);
   SetIndexLabel ( 0 , "Resistance" );

   SetIndexArrow ( 1 , 111 );
   SetIndexStyle ( 1 , DRAW_ARROW , STYLE_DOT , 1 , Red );
   SetIndexBuffer ( 1 , v2);
   SetIndexLabel ( 1 , "Support" );

   SetIndexArrow ( 2 , 111 );
   SetIndexStyle ( 2 , DRAW_ARROW , STYLE_DOT , 1 , White );
   SetIndexBuffer ( 2 , v3);
   SetIndexLabel ( 2 , "High A" ); 
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
    
   double    faster= 0 ;
   double    slower= 0 ;         
   int       bars = Bars ;
//----
  
   for ( int i=bars; i>= 0 ; i--)
    {
     faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN,i); //MODE_MAIN
     slower = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_SIGNAL,i); //MODE_SIGNAL
     val1= iFractals ( NULL , 0 , MODE_UPPER,i);
     val2= iFractals ( NULL , 0 , MODE_LOWER,i);
     
     if (faster > 0 )
      {
       if (val1 > 0 ) v1[i]=High[i];
      }
      
     if (faster < 0 )
      {
       if (val2 > 0 ) v2[i]=Low[i];
      }        
    }   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
diostar :
나는 아마도 OOP 관점에서보고 있었기 때문에 그 결론에 도달했습니다. 예, 이것은 MQL4의 경우 사실이 아닙니다. 지금 기억합니다. 좋은 습관이 될 수 있지만?

범위를 제한하는 것은 항상 좋은 습관입니다. 변수/객체가 사용되는 위치를 정의하고 해당 시점에서 초기화하는 것은 항상 좋은 습관입니다.

루프 외부에서 개체를 정의하면 기본 구성에 N 할당이 추가됩니다. 루프 내부에서 정의하면 값이 있는 N 구성이 생성됩니다. 일반적으로 더 빠릅니다.

변경 사항이 차이를 만든다는 것을 증명할 수 있을 때까지 최적화에 대해 걱정하지 마십시오.

 
WHRoeder :

범위를 제한하는 것은 항상 좋은 습관입니다. 변수/객체가 사용되는 위치를 정의하고 해당 시점에서 초기화하는 것은 항상 좋은 습관입니다.

루프 외부에서 개체를 정의하면 기본 구성에 N 할당이 추가됩니다. 루프 내부에서 정의하면 값이 있는 N 구성이 생성됩니다. 일반적으로 더 빠릅니다.

변경 사항이 차이를 만든다는 것을 증명할 수 있을 때까지 최적화에 대해 걱정하지 마십시오.

이것은 iterator에도 적용되어야 합니다. (나는 nt i=0;...
 
diostar :
이것은 iterator에도 적용되어야 합니다. (나는 nt i=0;...
동의하지만 그 코드를 작성하지 않았습니다.
 
좋아, 이제 작업 코드의 일부 변형이 있는 것 같습니다. 감사합니다.

그러나 루프 외부에서 변수 선언(더 빠르고 더 느림)이 왜 좋지 않은지, 루프 내부에서는 괜찮은지 약간 혼란스럽습니다.

그러나 int i = Bars는 루프 외부 또는 루프 내부에서 작동합니까?


여하튼 내가 작업하고 있던 아이디어 중 일부가 이미 이 스레드에 게시된 것을 보니 다행입니다. 그래서 이것은 좋은 소식이고 언젠가 스스로 무언가를 코딩할 수 있게 되는 데 조금 더 가까워지고 있음을 의미합니다. 따라서 약간의 진전이 없는 것보다 낫습니다. 감사해요

이제 몇 가지 표시기 시간을 비교하는 작업을 할 수 있습니다. 이제 이를 알아내려고 합니다.

와 같은:
v1[i]와 v2[i] 비교 현재 형성된 지표 Times && / || if(v1[i] time is > v2[i] time) 및 이와 같은 다른 비교.

모든 팁을 주셔서 감사합니다. 이것은 큰 도움이 되었습니다.
 
WHRoeder :

범위를 제한하는 것은 항상 좋은 습관입니다. 변수/객체가 사용되는 위치를 정의하고 해당 시점에서 초기화하는 것은 항상 좋은 습관입니다.

루프 외부에서 개체를 정의하면 기본 구성에 N 할당이 추가됩니다. 루프 내부에서 정의하면 값이 있는 N 구성이 생성됩니다. 일반적으로 더 빠릅니다.

변경 사항이 차이를 만든다는 것을 증명할 수 있을 때까지 최적화에 대해 걱정하지 마십시오.

나는 이것이 지표/ 사용자 지정 지표 뿐만 아니라 모든 사람에게 해당된다고 가정합니다.
 
Agent86 :
좋아, 이제 작업 코드의 일부 변형이 있는 것 같습니다. 감사합니다.

그러나 루프 외부에서 변수 선언(더 빠르고 더 느림)이 루프 내부에서는 괜찮은데 왜 좋지 않은지 약간 혼란스럽습니다.

그러나 int i = Bars는 루프 외부 또는 루프 내부에서 작동합니까?


차트의 모든 막대에 코드를 적용하는 지표를 생성할 때 수행 중인 작업을 고려해야 합니다. 즉, 각 과거 막대에 대한 macd 지표 값을 가져와야 합니다.

원래 코드에서 다음을 수행했습니다.

 double    faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 1 ), 
마지막 매개변수 1은 차트의 Bar 1에 있던 macd의 값입니다. 현재 막대 이전의 막대는 bar 0으로 인덱싱됩니다.

분명히 당신은 전체 히스토리 차트에 대해 조건부 연산자에서 macd의 단일 값을 사용하고 싶지 않습니다.

macd를 각 막대와 동일한 막대 색인으로 색인화해야 하므로 예를 들어 막대 500에서 이것이 필요합니다.

faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, 500 ) 

지표가 알고리즘을 적용하는 막대 번호와 일치하도록 마지막 매개변수를 변경해야 합니다.

이것이 루프 내부에 필요한 이유입니다. 따라서 마지막 매개변수에 루프 주기 반복자(i)를 사용할 수 있으므로 기록 차트의 각 막대에 대한 macd 값을 얻을 수 있습니다.

faster = iMACD ( NULL , 0 , 12 , 26 , 9 , PRICE_CLOSE ,MODE_MAIN, i ), 

나는 그것이 상황을 조금 정리하는 데 도움이되기를 바랍니다.

 
WHRoeder :
이 변경 시도
왜 (int i = Bars-1 입니까?

그리고 이것이 for(int i = Bars ??)보다 나은 이유는 무엇입니까?

조언 부탁드립니다 감사합니다