[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 279

 

내가 가진 함수를 통해 한 배열의 요소 값을 올바르게 반환하지 않는 것이 있습니다. 이 문제와 관련하여 모든 것을 순서대로 설명하겠습니다.

전역 변수 에는 다음이 있습니다.

 extern int i_TF = 0 ;
int g_maPeriod[ 3 ] = { 6 , 25 , 150 , 250 },             // Периоды обрабатываемых МА
    g_singMa[ 3 ] = { 1 , 2 , 3 , 4 };                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                  // Сигнал на покупку
#define SIGNAL_SELL           1                                  // Сигнал на продажу
#define SIGNAL_NO           - 1                                  // Сигнала нет

#define CROSS_UP             0                                  // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                  // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            - 1                                  // Признак равенства двух средних
 int crossDir[3];

이 계산에 사용된 함수:

 //+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA( int maPeriod, double & prevMA)
{
   prevMA = iMA ( NULL , i_TF, maPeriod, 0 , MODE_EMA , MODE_CLOSE, 1 );
   return ( iMA ( NULL , i_TF, maPeriod, 0 , MODE_EMA , MODE_CLOSE, 0 ));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa( int & crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA( 365 , ema365_1);

   Print ( "g_maPeriod[0] = " , g_maPeriod[ 0 ]);
   Print ( "g_maPeriod[1] = " , g_maPeriod[ 1 ]);
   Print ( "g_maPeriod[2] = " , g_maPeriod[ 2 ]);
   Print ( "g_maPeriod[3] = " , g_maPeriod[ 3 ]);
   
   for ( int i= 0 ; i< 4 ; i++)
   {
       double ema1;
       double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

       Print ( "ema1 < 365_1 " , ema1 , " < " , ema365_1);
       if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print ( "ema1 < 365_1 " , ema1 , " < " , ema365_1);
         crossDir[i] = CROSS_UP;
      }
       if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print ( "ema1 > 365_1 " , ema1 , " > " , ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

시작할 때 GetStateMa(int& crossDir[]) 함수에서 반환된 배열 요소의 값을 추가로 인쇄합니다.

   Print ( "crossDir[0] = " , crossDir[ 0 ]);
   Print ( "crossDir[1] = " , crossDir[ 1 ]);
   Print ( "crossDir[2] = " , crossDir[ 2 ]);
   Print ( "crossDir[3] = " , crossDir[ 3 ]);

반환되는 내용은 다음과 같습니다.

 2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 3 ] = 0
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 2 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 1 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: crossDir[ 0 ] = - 1
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: open # 1 buy 0.10 EURUSD at 1.29654 ok
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.3129 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.3017 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.2886 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: ema1 < 365 _1 1.2916 < 1.3225
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 3 ] = 250
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 2 ] = 150
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 1 ] = 25
2013.04 . 11 15 : 08 : 48      2009.01 . 25 23 : 46   Base150_New EURUSD,H1: g_maPeriod[ 0 ] = 6

배열 crossDir[] 의 요소 값은 모두 다르게 반환되지만 값은 모두 1 이어야 합니다.

이것은 마섹 4기와 365기를 비교하는 표현의 출력물에서 알 수 있다. 값이 올바르게 반환되지 않는 이유를 알려주십시오.

 
Ekburg :


나에게 보낸 링크에는 구체적으로 이러한 배열이 없었고 직장에 있었기 때문에 왼쪽 열에주의를 기울이지 않았기 때문에 지정해 주셔서 감사합니다.

그러나 당신 외에는 아무도 당신이 뱉는 모든 것을 삼킬 것입니다 ;)


프롬프트에서 배웠다면 어떻게 배웠습니까? 적극적이고 탐구적인 독학만이 열매를 맺습니다! 내가 당신을 위해 그것을 씹어, 그리고 당신은 합리적인 조언에 "침"! 베이비시터 고용 베이비시터를 닦아주세요!
 
안녕하세요 여러분, 저는 지표 A 에서 지표 B 를 구축했습니다( iCustom 을 통해). 두 지표 모두 차트에 있습니다. 지표 A 의 매개변수를 변경할 때 지표 B 는 자동으로 다시 작성되지 않으므로 강제로 다시 컴파일해야 합니다! 표시기 B 가 자동으로 재건되지 않는 이유는 무엇입니까?제발 말해주세요, 내 실수는 무엇입니까?
 
MK07 :
안녕하세요 여러분. 저는 지표 A 에서 지표 B 를 구축했습니다( iCustom 을 통해). 두 지표 모두 차트에 있습니다. 지표 A 의 매개변수를 변경할 때 지표 B 는 자동으로 다시 작성되지 않으므로 강제로 다시 컴파일해야 합니다! 표시기 B 가 자동으로 재건되지 않는 이유는 무엇입니까?제발 말해주세요, 내 실수는 무엇입니까?
표시기 A 자체의 설정에 의존하지 않는 특정 설정으로 표시기 A ( iCustom 을 통해)를 호출합니다. 저것들. 터미널은 지표 A 의 두 개의 독립적인 복사본을 동시에 계산합니다. 외부에서(다른 코드에서) 호출된 표시기는 터미널에 의해 가상으로 계산됩니다.
 
TarasBY :
표시기 A 자체의 설정에 의존하지 않는 특정 설정으로 표시기 A ( iCustom 을 통해)를 호출합니다. 저것들. 터미널은 지표 A 의 두 개의 독립적인 복사본을 동시에 계산합니다.

터미널이 표시기 A 의 두 번째 버전을 계산하려면 어떻게 해야 합니까?
 
MK07 :
터미널이 표시기 A 의 두 번째 버전을 계산하려면 어떻게 해야 합니까?
작업을 지정합니다.
 
borilunad :

프롬프트에서 배웠다면 어떻게 배웠습니까? 적극적이고 탐구적인 독학만이 열매를 맺습니다! 내가 당신을 위해 그것을 씹어, 그리고 당신은 합리적인 조언에 "침"! 베이비시터 고용 베이비시터를 닦아주세요!

자존심을 억누르다! 조언에 침을 뱉지 않고 수락하고 고맙게 생각하지만 그런 식의 표현은 용납하지 않습니다! 나는 문화적으로 묻고 문화적으로 대답했다!
 

안녕하세요!

Expert Advisor에서 변수 Point 값을 사용해야 합니다.

그러나 0과 같습니다.

내가 이해하는 한, 이것은 따옴표의 소수점 이하 5자리 숫자 때문입니다.

이 값을 결정하는 방법이 있습니까?

고맙습니다.

 
TarasBY :
작업을 지정합니다.

지표 A - 일반 AO(My_AO)가 그림의 맨 위에 있습니다.

표시기 B - AO 표시기(My_AO)의 히스토그램(+1/-1)은 그림의 중간입니다.

인디케이터 A (그림 하단)의 파라미터를 변경하면, 인디케이터 B 는 재컴파일 후에도 변경되지 않습니다.

지표에 어떤 일이 일어나는지 설명하기 위해 두 개의 AO 지표(My_AO)를 동시에 보여줬는데, 실제 상황에서는 하나의 AO(My_AO)만 있어야 합니다.



첫 번째 지표 코드는 A 입니다.

두 번째 코드는 지표 B 입니다.

 //---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2   2
#property  indicator_width3   2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod = 5 ;
extern int LowPeriod  = 34 ;
//---- indicator buffers
double      ExtBuffer0[];
double      ExtBuffer1[];
double      ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle( 0 , DRAW_NONE );
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexStyle( 2 , DRAW_HISTOGRAM );
   IndicatorDigits( Digits + 1 );
   SetIndexDrawBegin( 0 , 34 );
   SetIndexDrawBegin( 1 , 34 );
   SetIndexDrawBegin( 2 , 34 );
//---- 3 indicator buffers mapping
   SetIndexBuffer ( 0 ,ExtBuffer0);
   SetIndexBuffer ( 1 ,ExtBuffer1);
   SetIndexBuffer ( 2 ,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName( "My_AO" );
   SetIndexLabel( 1 , NULL );
   SetIndexLabel( 2 , NULL );
//---- initialization done
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int     limit;
   int     counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if (counted_bars> 0 ) counted_bars--;
   limit= Bars -counted_bars;
//---- macd
   for ( int i= 0 ; i<limit; i++)
      ExtBuffer0[i]= iMA ( NULL , 0 ,FastPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i)- iMA ( NULL , 0 ,LowPeriod, 0 , MODE_SMA , PRICE_MEDIAN ,i);
//---- dispatch values between 2 buffers
   bool up= true ;
   for (i=limit- 1 ; i>= 0 ; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+ 1 ];
       if (current>prev) up= true ;
       if (current<prev) up= false ;
       if (!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]= 0.0 ;
        }
       else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]= 0.0 ;
        }
        
       
     }
//---- done
   return ( 0 );
  }
 #property indicator_separate_window
#property indicator_minimum - 1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1   2
#property  indicator_width2   2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 0 ,ExtMapBuffer1);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 1 ,ExtMapBuffer2);
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
     double UP,DN;     
  
  
     int counted_bars=IndicatorCounted(),
       limit;  
       
     if (counted_bars> 0 )
      counted_bars--;
   
      limit= Bars -counted_bars;
//----
   for ( int i= 0 ;i<limit;i++)
       
      { 
        UP= iCustom ( NULL , 0 , "My_AO" , 1 ,i+ 1 );               
        DN= iCustom ( NULL , 0 , "My_AO" , 2 ,i+ 1 );    
             
        
       if (UP> 0 )       
         {ExtMapBuffer1[i+ 1 ]= 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }
         
       if (UP< 0 )       
         {ExtMapBuffer1[i+ 1 ]=- 1 ;
          ExtMapBuffer2[i+ 1 ]= 0 ;
         }  
         
                              
       if (DN> 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]= 1 ;
         }
              
       if (DN< 0 )            
         {
          ExtMapBuffer1[i+ 1 ]= 0 ;
          ExtMapBuffer2[i+ 1 ]=- 1 ;
         }
               
                       
    
    }
//----
   return ( 0 );
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07 :

지표 A - 일반 AO(My_AO)가 그림의 맨 위에 있습니다.

표시기 B - AO 표시기(My_AO)의 히스토그램(+1/-1)은 그림의 중간입니다.

표시기 A (그림 하단)의 매개변수를 변경하면 표시기 B 는 재컴파일 후에도 변경되지 않습니다.

지표에 어떤 일이 일어나는지 설명하기 위해 두 개의 AO 지표(My_AO)를 동시에 보여줬는데, 실제 상황에서는 하나의 AO(My_AO)만 있어야 합니다.

첫 번째 지표 코드는 A 입니다.

두 번째 코드는 지표 B 입니다.

그리고 이 순서는 정상입니다(이것이 터미널의 원리입니다).

표시기 A 의 매개변수를 변경할 때 표시기 B 가 판독값을 변경하도록 하려면 표시기(파일, 터미널 의 전역 변수 , 컴퓨터 RAM) 간에 정보를 교환하십시오. 표시기 A 는 초기화 중에 초기화된 매개변수를 전송하고 표시기 B 는 주기적으로 확인합니다. 표시기 A 의 매개변수 변경 가능성에 대해 변경 사항이 감지되면 표시기 B 도 새 매개변수로 다시 초기화해야 합니다(강제 init() 실행).