지표 질문

 

안녕하세요 여러분,

나는 포럼의 전문가로부터 큰 도움을 받아 iFractals가 있는 코드 기반 표시기에서 배열에 대한 몇 가지 일반적인 주제를 배우고 있었습니다.


암튼

표시기에 추가 기능 을 추가하기 위해 조건 연산자 또는 논리 연산을 추가할 수 없습니다.

 //+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


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

//---- buffers
double v1[ 1000 ];
double v2[ 1000 ];
double v3[ 1000 ];
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 i= Bars ;
//----
  
     for (i= Bars ; i>= 0 ; i--)
     {
      val1= iFractals ( NULL , 0 , MODE_UPPER,i);
       if (val1 > 0 )
         {        
          v1[i]=High[i]; 
                         
           Print ( "v1[" , i, "]= " , v1[i], " if" );
          }    
               
       else           
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2= iFractals ( NULL , 0 , MODE_LOWER,i);
       if (val2 > 0 )
         {
          v2[i]=Low[i];
          
           Print ( "v2[" , i, "]= " , v2[i], " if" );
         }
          
       else           
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

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

아이디어를 가지고 놀기 위해 코드의 다양한 영역에 if(빠른 > 느린)를 삽입해 보았습니다. 일반적으로 이러한 아이디어는 EA에서는 작동하지만 지표에서는 작동하지 않습니다.

IE if(v1 > 0 && 더 빠름 > 더 느림)

그러나 이로 인해 표시기가 사라집니다.

내가 생각한 많은 다른 조합은 원하는 지표 if(기타 조건) 등을 생성해야 한다고 생각했습니다.
모두 인쇄 문 출력을 생성하지 않습니다.

내가 여기서 놓치고 있는 점은 무엇입니까?

조언 부탁드립니다
감사해요

 

double v1[1000];
double v2[1000];
double v3[1000];<------ leave out the '1000' initialization for indicator buffers, as they don't require 

 
diostar :


글쎄, 나는 처음에 그것을했지만 내가하고 싶은 버퍼의 값을 인쇄 할 수 없었습니다.

자, 다시 말하겠습니다.

버퍼의 요소 수를 선언하지 않으면 표시기는 v1[i]=High[i]와 같이 작동합니다.
그러나 인쇄(v1[i]); 요소 수가 선언되지 않은 경우 선언되지 않은 배열 값을 인쇄할 방법이 없기 때문에 출력되지 않으므로 항상 0이 인쇄됩니다.

따라서 전역적으로 선언하지 않으면 표시기가 작동하지만 if(faster>slower) 여전히 표시기가 사라지고 값도 인쇄할 수 없습니다.

선언하고 v1[i]=High[i]로 다시 초기화하면 인쇄할 수 있지만 && 더 빠른 > 더 느린 것과 같은 추가는 표시기를 다시 제거 합니다.

이유를 완전히 이해하지 못합니다.

감사해요
 

나는 당신의 코드를 가지고 버퍼 선언에서 값을 가져왔고 그것은 잘 작동합니다. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954인 경우


 
RaptorUK :

나는 당신의 코드를 가지고 버퍼 선언에서 값을 가져왔고 그것은 잘 작동합니다. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913 if <----높음

------> 현재 프랙탈이 일치하지 않음 높음이 낮음 이전 낮음 <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962 if <----낮음

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948 if <---- 높음

------> 현재 프랙탈이 일치하지 않음 높음이 낮음 이전 낮음 <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD, H1: v1[15]= 1.5992 if<----낮음

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996 if <---- 높음

------> 현재 교대 프랙탈 일관성 <---------

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919 if <----낮음
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954 if <----높음


흥미롭습니다. 결과에 대한 thx 에이전트86V2. 프랙탈 은 실제로 흥미롭지만 수익성 있는 거래 방법 중 하나입니다.

 
RaptorUK :

나는 당신의 코드를 가지고 버퍼 선언에서 값을 가져왔고 그것은 잘 작동합니다. . .

2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[4]= 1.5913인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[8]= 1.5962인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[11]= 1.5948인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[15]= 1.5992인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v1[18]= 1.5996인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[20]= 1.5919인 경우
2011.09.27 13:04:03 Agent86V2 GBPUSD,H1: v2[27]= 1.5954인 경우


다른 스레드에서는 그렇지 않은 0 값을 생성하지 않고 코드를 인쇄할 수도 있습니다.
이해가 되지 않아 죄송합니다. 라고 생각했는데 아직도 뭔가 부족하네요.

 int start()
   {
   double test[];
   
   test[ 39 ] = 45.6 ;
   Print ( "test[39]= " ,test[ 39 ] );
   

       return ( 0 );
   }
위와 같이 선언하도록 지시했습니다.

그리고 당신은 이 주제를 인용했습니다:

배열에 관한 책을 읽었을 때 어디에서 이렇게 말하는지 보았습니까?

"배열을 선언할 때 각 차원의 데이터 유형, 배열 이름 및 요소 수를 지정해야 합니다."

따라서 한편으로는 먼저 double test[40]를 선언하지 않고는 이 스크립트에서와 같이 배열을 인쇄할 수 없습니다. 알려주신대로인데 이제 선언 없이도 인쇄가 가능한 것 같습니다.

따라서 선언에 관계없이 버퍼의 값을 인쇄할 수 있는 것으로 보입니다.

그러나 if(빠른 > 느린) 또는 && 빠른 > 느린과 같이 일반적으로 원하는 결과를 생성하는 추가 조건을 추가할 수 없습니다.
EMA가 작동하지 않는 이유를 이해하고 싶은 모든 것이 될 수 있습니다.
표시기 최고값이 사라지고 v1 인쇄 출력이 인쇄를 종료합니다. 나는 그것이 조건과 일치하고 출력을 인쇄하기를 기대했습니다.

동일한 결과로 이에 대한 추가 코드 블록을 추가하려고 시도했습니다.

감사해요
 

나는 또한 이것을 썼다. . .

RaptorUK :

표시기 버퍼는 특수 Arrays입니다. . . 배열과 버퍼를 혼동하지 마십시오. 비슷하지만 다릅니다.

원래 코드에서 v1[] 및 v2[]는 버퍼이고 최신 코드에서는 배열입니다. 배열을 선언할 때 크기를 지정해야 합니다. 예를 들어 v1[50]에는 v1[0]의 50개 요소가 있습니다. v1[49]로. 더 많은 요소가 필요하고 값이 버퍼에서 자동으로 이동하면 버퍼가 자동으로 크기를 조정합니다. 현재 형성 중인 막대인 막대 0을 고려하십시오. 이 막대가 완료되면 해당 막대와 관련된 표시기 값이 인덱스 1로 이동해야 합니다. . . 이것은 Buffers 를 사용하여 자동으로 수행됩니다. . 배열과 비슷한 것을 원하면 할 수 있지만 직접 코딩해야 합니다.

 
Agent86 :

그러나 if(빠른 > 느린) 또는 && 빠른 > 느린과 같이 일반적으로 원하는 결과를 생성하는 추가 조건을 추가할 수 없습니다.
EMA가 작동하지 않는 이유를 이해하고 싶은 모든 것이 될 수 있습니다.
표시기 최고값이 사라지고 v1 인쇄 출력이 인쇄를 종료합니다. 나는 그것이 조건과 일치하고 출력을 인쇄하기를 기대했습니다.

동일한 결과로 이에 대한 추가 코드 블록을 추가하려고 시도했습니다.

감사해요

작동하지 않는 코드를 보여주세요. . . 나는 기술 지표 를 사용하지 않습니다. . . 절대, 그래서 내가 당신이 EMA에 대해 무엇을 의미하는지 알고 있다고 가정하지 마십시오. ;-) 당신은 당신의 코드를 보여줘야 합니다.
 
RaptorUK :

나는 또한 이것을 썼다. . .

랩터영국 :

표시기 버퍼는 특수 Arrays입니다. . . 배열과 버퍼를 혼동하지 마십시오. 비슷하지만 다릅니다.

원래 코드에서 v1[] 및 v2[]는 버퍼이고 최신 코드에서는 배열입니다. 배열을 선언할 때 크기를 지정해야 합니다. 예를 들어 v1[50]에는 v1[0]의 50개 요소가 있습니다. v1[49]로. 더 많은 요소가 필요하고 값이 버퍼에서 자동으로 이동하면 버퍼가 자동으로 크기를 조정합니다. 현재 형성 중인 막대인 막대 0을 고려하십시오. 이 막대가 완료되면 해당 막대와 관련된 표시기 값이 인덱스 1로 이동해야 합니다. . . 이것은 Buffers 를 사용하여 자동으로 수행됩니다. . 배열과 비슷한 것을 원하면 할 수 있지만 직접 코딩해야 합니다.

진실. "비슷하면서도 다른". 이 말보다 더 좋은 표현은 없을 것 같아요.
 
알겠습니다. 비슷하지만 다릅니다. 처음에는 코드의 어느 지점에서든 v1[i]를 인쇄하는 데에도 큰 문제가 있었지만 이제는 원래 예상대로 인쇄되는 것 같습니다.
첫 번째 표시기 루프 내에서 인쇄할 수 없었기 때문에 보조 루프만 생성했지만 지금은 인쇄 중입니다.
어쨌든 나는 이것을 다시 해시하지 않을 것입니다.

따라서 작동하지 않는 코드는 다음과 같은 몇 가지 예입니다.

 //+------------------------------------------------------------------+
//|                                   
//+------------------------------------------------------------------+


#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 = 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 i= Bars ;
//----
  
     for (i= Bars ; i>= 0 ; i--)
     {
      val1= iFractals ( NULL , 0 , MODE_UPPER,i);
       if (val1 > 0 && faster > slower) 
         // I think I need to add some more comparisons for the Low[i] also
         // the comparison works but shows indicator when faster < slower too.
         // adding additional code blocks instead of above and including the part below and inserting this instead 
         //                                               if(faster>slower)
         //                                                     {
         //                                                      v1[i]=High[i];
         //                                                     }
         //                                                      causes indicator to disappear
         
         {                             
          v1[i]=High[i]; 
                         
           Print ( "v1[" , i, "]= " , v1[i], " if" );
          }    
               
       else           
         {
         //v1[i]=v1[i+1];
         //Print ("v1[", i, "]= ", v1[i], " else");
         }
      
      val2= iFractals ( NULL , 0 , MODE_LOWER,i);
       if (val2 > 0 )
         {
          v2[i]=Low[i];
          
           Print ( "v2[" , i, "]= " , v2[i], " if" );
         }
          
       else           
         {
         //v2[i]=v2[i+1]; 
         //Print ("v2[", i, "]= ", v2[i], " else");         
         }
      }

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

감사해요

 
Agent86 :

따라서 작동하지 않는 코드는 다음과 같은 몇 가지 예입니다.

감사해요

알겠습니다. 문제가 무엇인지 알려주거나 몇 가지 단서를 드릴 수 있습니다. . . . 실마리 먼저, 내가 말하길 원한다면 말만 하면 내가 말해줄게. .

루프 내부, for (i= Bars ; i>= 0 ; i--) . . 더 빠르고 더 느림 에 대한 값은 무엇입니까?