D1 기간의 시가를 교차하는 M1 기간의 막대를 계산하는 지표

 

인사말! 이 지표에 대한 도움이 필요합니다. D1 기간에 공개 가격 수준에 도달한 M1 기간 의 Bar 수 를 계산하기 위해 다른 방법을 시도했습니다. 코드를 작성하려는 시도를 첨부했지만 성공적으로 실행할 수 없습니다. 열심히 노력했지만 벽에 부딪혀 이제 여기 친절한 신사들에게 도움을 요청합니다!

이 표시기에 필요한 것은 다음과 같습니다.

1. M1 기간의 Bar 가격이 D1 기간의 Open 가격과 만나면 계산됩니다. 각 D1 기간에 대해 M1 기간에 1440개의 막대가 있으므로 모든 1440개 막대가 테스트됩니다.

2. 각 D1 Bar에 대해 총 카운트/D1 Bar가 합산되고 특정 값으로 평균됩니다. 평균이 30이라고 가정하면 이 30은 D1 막대의 수입니다.

 //+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link        "XXX"
#property version    "1.00"
#property indicator_separate_window      // Indicator is drawn in the main window
#property indicator_buffers 1        // Number of buffers
#property indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;   // Bar index
extern int Aver_Bars= 30 ;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                           // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer ( 0 ,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle ( 0 , DRAW_LINE , STYLE_SOLID , 2 ); // Line style
//--------------------------------------------------------------------
   SetIndexBuffer ( 1 ,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
   if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double    Sum_H;  
//--------------------------------------------------------------------
   Counted_bars= IndicatorCounted (); // Number of counted bars
   i= Bars -Counted_bars- 1 ;           // Index of the first uncounted
   while (i>= 0 )                       // Loop for uncounted bars
     {
      Sum_H= 0 ;                       // Nulling at loop beginning
    
       for (n=i;n<=i+Aver_Bars- 1 ;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                           // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 ,i);
   double L= iLow ( NULL , PERIOD_M1 ,i);
   double O= iOpen ( NULL , PERIOD_D1 ,i);
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );
   }

3. 그런 다음 평균 값이 지표로 표시됩니다.

 
누구라도 도와주세요! 이것이 가능합니까?
 

귀하의 코드에서 무엇을 하려고 하는지 알 수 없지만 2곳에서 변수 ia 값을 제공하지 않습니다. 이 문제를 해결해야 합니다.

 int start()                         // Special function start()
  {
   if (Crosses()) count++;
   int i , n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;                // Number of counted bars
   double    Sum_H;  
//--------------------------------------------------------------------
   Counted_bars= IndicatorCounted (); // Number of counted bars
   i= Bars -Counted_bars- 1 ;           // Index of the first uncounted
   while (i>= 0 )                       // Loop for uncounted bars
     {
      Sum_H= 0 ;                       // Nulling at loop beginning
    
       for (n=i;n<=i+Aver_Bars- 1 ;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                           // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return ( 0 );                           // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 , i );
   double L= iLow ( NULL , PERIOD_M1 , i );
   double O= iOpen ( NULL , PERIOD_D1 , i );
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );
   }
 

무뚝뚝하게해서 죄송합니다. 그러나 귀하의 코드는 귀하의 능력을 훨씬 뛰어 넘는 것을 달성하려고 노력하고 있음을 보여줍니다.

예시

 bool Crosses()
   {
   int i;
   double H= iHigh ( NULL , PERIOD_M1 ,i);
   double L= iLow ( NULL , PERIOD_M1 ,i);
   double O= iOpen ( NULL , PERIOD_D1 ,i);
 
       if (O > L && O < H)
         
   return ( true );

else
return ( EMPTY_VALUE );

예를 들어 i = 1이라고 가정해 보겠습니다.

 double O= iOpen ( NULL , PERIOD_D1 ,1);

이것은 어제의 시가 를 반환합니다.

   double H= iHigh ( NULL , PERIOD_M1 , 1 );
   double L= iLow ( NULL , PERIOD_M1 , 1 );

이 2는 마지막으로 닫힌 1분 막대에 대한 값을 반환합니다.


그래서 당신은 1분 전의 값을 어제 열린 값과 비교하고 있습니다.

i = 2이면 2분 전의 값을 2일 전의 값과 비교하게 됩니다.

이것이 당신이 원하는 것이 될 수 없다는 것을 알아야 합니다.

 
GumRai :

무뚝뚝하게해서 죄송합니다. 그러나 귀하의 코드는 귀하의 능력을 훨씬 뛰어 넘는 것을 달성하려고 노력하고 있음을 보여줍니다.

예시

예를 들어 i = 1이라고 가정해 보겠습니다.

이것은 어제의 시가를 반환합니다.

이 2는 마지막으로 닫힌 1분 막대에 대한 값을 반환합니다.


그래서 당신은 1분 전의 값을 어제 열린 값과 비교하고 있습니다.

i = 2이면 2분 전의 값을 2일 전의 값과 비교하게 됩니다.

이것이 당신이 원하는 것이 될 수 없다는 것을 알아야 합니다.


안녕하세요 검라이님

시간을 내어 도와주셔서 감사합니다. 맞습니다. 저는 EA 코딩을 배우기 위해 열심히 노력하는 초보자일 뿐입니다. 내가 하려는 일이 다음과 같습니다.

1. PERIOD_D1 Open을 자체 D1 막대의 매분 PERIOD_M1 막대와 비교하므로 D1 막대와 비교할 1440 M1 막대가 있습니다. 그런 다음 (O > L && O < H) 조건 충족하는 M1 막대를 계산합니다.

2. 계산된 막대를 배열에 저장하고 다음 D1 막대로 다시 진행하고 주기를 다시 반복합니다.

3. 계산된 막대는 일일 차트의 지표에 의해 표시됩니다. 따라서 명령문을 충족하는 M1 막대가 5라고 하면 이 5는 일일 Bar1의 값으로 표시됩니다. 그런 다음 다음 일일 막대에 대해 계산된 M1 막대가 10이라고 말하면 이전 막대가 Bar2로 이동함에 따라 Bar1에 다시 표시됩니다.

이 간단한 문장을 가장 잘 코딩하는 방법을 알려주세요. 추가 설명이 필요하면 알려주십시오. 감사합니다.

 
Zaldy :


안녕하세요 검라이님

시간을 내어 도와주셔서 감사합니다. 맞습니다. 저는 EA 코딩을 배우기 위해 열심히 노력하는 초보자일 뿐입니다. 내가 하려는 일이 다음과 같습니다.

1. PERIOD_D1 Open을 자체 D1 막대의 매분 PERIOD_M1 막대와 비교하므로 D1 막대와 비교할 1440 M1 막대가 있습니다. 그런 다음 (O > L && O < H) 조건 충족하는 M1 막대를 계산합니다.

2. 계산된 막대를 배열에 저장하고 다음 D1 막대로 다시 진행하고 주기를 다시 반복합니다.

3. 계산된 막대는 일일 차트의 지표에 의해 표시됩니다. 따라서 명령문을 충족하는 M1 막대가 5라고 하면 이 5는 일일 Bar1의 값으로 표시됩니다. 그런 다음 다음 일일 막대에 대해 계산된 M1 막대가 10이라고 말하면 이전 막대가 Bar2로 이동함에 따라 Bar1에 다시 표시됩니다.

이 간단한 문장을 가장 잘 코딩하는 방법을 알려주세요. 추가 설명이 필요하면 알려주십시오. 감사합니다.


기꺼이 도와드리겠지만, 배우는 데 도움이 되지 않을 것이므로 코드를 작성하지 않겠습니다.

먼저 1440 M1 막대가 항상 1일 기간에 해당하는 것은 아니라는 점을 인식해야 합니다. 막대 중에 눈금이 없으면 해당 막대가 기록에서 누락되고 예상보다 적을 수 있습니다.

따라서 D1 양초를 열려면 날짜/시간 값이 필요합니다. 당신은 이것을 할 수 있습니까? 그것을 시도하고 코드를 게시

 

그렇게 빠르지 않다

나는 ur가 하려고 하는 것과 ur 코드( if (O > L && O < H) )가 u 원하는 것을 얻지 못할 것이라는 것을 알고 있습니다.

@ 차트가 첨부되어 있습니다.



위를 향한 화살표 는 오늘의 오프닝입니다

& 오른쪽을 향한 화살표 는 코드와 일치하는 첫 번째 막대입니다( if (O > L && O < H) ) 따라서 count = 1

그러나 오늘 오프닝 위에 닫힌 막대에주의를 기울이면 실제로 = 2로 간주됩니다 (최소한 (틱 차트에서만 c 할 수없는 몇 개의 십자가가 더있을 수 있음))

그러나 ur 코드 개수 = 1

 
qjol :

그렇게 빠르지 않다

나는 ur가 하려고 하는 것과 ur 코드( if (O > L && O < H) )가 u 원하는 것을 얻지 못할 것이라는 것을 알고 있습니다.

@ 차트가 첨부되어 있습니다.



위를 향한 화살표 는 오늘의 오프닝입니다

& 오른쪽을 향한 화살표 는 코드와 일치하는 첫 번째 막대입니다( if (O > L && O < H) ) 따라서 count = 1

그러나 오늘 오프닝 위에 닫힌 막대에주의를 기울이면 실제로 = 2로 간주됩니다 (최소한 (틱 차트에서만 c 할 수없는 몇 개의 십자가가 더있을 수 있음))

그러나 ur 코드 개수 = 1


제가 이해한 바로는, 그는 시가에 걸쳐 있는 막대를 세고 싶어합니다. 하지만 제가 틀릴 수도 있습니다. :)
 
  1. Zaldy : 도와주세요! 이것이 가능합니까?
    우리에게 소리치지 마십시오. 물론 가능합니다.
  2. 정수와 부울은 변환 가능합니다. 거짓 == 0, 참 = 0이 아닙니다.
     return ( true ); else return ( EMPTY_VALUE );
    return ( true ); else return ( 2147483647 );
    return ( true ); else return ( true );
  3. 또한 D1, 차트, M1의 세 가지 기간을 다루고 있습니다. 변환해야 합니다.
    컴파일되거나 테스트되지 않았습니다.
       Counted_bars= IndicatorCounted (); // Number of counted bars
       for (iCht = Bars - 1 - Counted_bars; iCht >= 0 ; iCht--){ // Chart bars
          int      iD1    = iBarShift ( NULL , PERIOD_D1 , Time [iCht];
           double   openD1 = iOpen ( NULL , PERIOD_D1 , iD1);
           int      iM1Beg = iBarShift ( NULL , PERIOD_M1 , Time [iCht],
                   iM1End = - 1 ;
           if (iCht > 0 ) iM1End = iBarShift ( NULL , PERIOD_M1 , Time [iCht- 1 ];
          for (Buf_0[i] = 0 ; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh ( NULL , PERIOD_M1 , iM1Beg),
                    lM1 =   iLow ( NULL , PERIOD_M1 , iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
             if ( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    컴파일되거나 테스트되지 않았습니다.
 
qjol :

그렇게 빠르지 않다

나는 ur가 하려고 하는 것과 ur 코드( if (O > L && O < H) )가 u 원하는 것을 얻지 못할 것이라는 것을 알고 있습니다.

@ 차트가 첨부되어 있습니다.



위를 향한 화살표 는 오늘의 오프닝입니다

& 오른쪽을 향한 화살표 는 코드와 일치하는 첫 번째 막대입니다( if (O > L && O < H) ) 따라서 count = 1

그러나 오늘 오프닝 위에 닫힌 막대에주의를 기울이면 실제로 = 2로 간주됩니다 (최소한 (틱 차트에서만 c 할 수없는 몇 개의 십자가가 더있을 수 있음))

그러나 ur 코드 개수 = 1


안녕하세요 Qjol, 예 오른쪽을 향한 화살표가 제가 원하는 첫 번째 카운트입니다. D1 Open만 십자형으로 교차하는 사람들만 계산됩니다. 귀하의 노력에 다시 한 번 감사드립니다.
 
WHRoeder :
  1. Zaldy : 아무나 도와주세요! 이것이 가능합니까?
    우리에게 소리치지 마십시오. 물론 가능합니다.
  2. 정수와 부울은 변환 가능합니다. 거짓 == 0, 참 = 0이 아닙니다.
  3. 또한 D1, 차트, M1의 세 가지 기간을 다루고 있습니다. 변환해야 합니다.
    컴파일되거나 테스트되지 않았습니다.
    컴파일되거나 테스트되지 않았습니다.

WHRoeder에게 감사하고 여기에 캡을 사용해서 죄송합니다! 나는 당신의 제안을 시도하고 결과를 위해 여기로 돌아올 것입니다.
사유: