지표를 무료로 작성해 드립니다 - 페이지 98

 
AVK :
고마워, 알렉시. 모두 제일 좋다.

.

 

안녕하세요!

이 지표를 작성했습니다


 //+------------------------------------------------------------------+
//|                                                      MTF_H&L.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property strict
#property indicator_chart_window
#property indicator_buffers    2
#property indicator_width1      1
#property indicator_color1      clrTeal
#property indicator_type1      DRAW_LINE
#property indicator_width2      1
#property indicator_color2      clrCrimson
#property indicator_type2      DRAW_LINE
//---
input ENUM_TIMEFRAMES    period01 =   PERIOD_D1 ;
input ENUM_TIMEFRAMES    period02 =   PERIOD_M15 ;
input int                percount =   10 ;         //Ограничение истории

double Buffer1[];
double Buffer2[];
int     index1=- 1 ;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   SetIndexBuffer ( 0 , Buffer1, INDICATOR_DATA );
   SetIndexBuffer ( 1 , Buffer2, INDICATOR_DATA );
//---
   IndicatorDigits( Digits );
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
//---
   int i, limit, barcount;
   barcount=period01/ Period ()*percount;
   if (barcount != 0 ) limit = barcount; 
   else limit = rates_total - 2 ;
   
   for (i=limit;i>= 0 ;i--)
   {
       if (TimeSeconds(time[i])== 0 )
      index1= iBarShift ( Symbol (), period02, time[i], false );

       if (TimeHour(time[i])== 0 &&TimeMinute(time[i])<period02)
      {
      Buffer1[i]= iOpen ( NULL ,period02,index1);
      Buffer2[i]= iOpen ( NULL ,period02,index1);
      }
       else 
      {
      Buffer1[i]= iHigh ( NULL ,period02,index1);
       if (Buffer1[i]<Buffer1[i+ 1 ]){
      Buffer1[i]=Buffer1[i+ 1 ];}
      
      Buffer2[i]= iLow ( NULL ,period02,index1);
       if (Buffer2[i]>Buffer2[i+ 1 ]){
      Buffer2[i]=Buffer2[i+ 1 ];}
      }
   }
//---
   return (rates_total);
  }
//+------------------------------------------------------------------+

표시기를 수정하는 데 도움이 되거나 방법을 알려주세요.

1) 새로운 기간이 시작될 때 표시기가 "iOpen"으로 시작하도록 기준점 "period01"을 설정하는 방법을 모르겠습니다.

2) 그런 "성"을 사용하지 않기 위해 "iHighest"를 사용하는 방법을 알 수 없습니다.

 if (Buffer1[i]<Buffer1[i+ 1 ]){
   Buffer1[i]=Buffer1[i+ 1 ];}

도와주세요, 제발.

 
MakarFX :

안녕하세요!

이 지표를 작성했습니다


표시기를 수정하는 데 도움이 되거나 방법을 알려주세요.

1) 새로운 기간이 시작될 때 표시기가 "iOpen"으로 시작하도록 기준점 "period01"을 설정하는 방법을 모르겠습니다.

2) 그런 "성"을 사용하지 않기 위해 "iHighest"를 사용하는 방법을 알 수 없습니다.

도와주세요, 제발.

왜 썼어?

 
Алексей Тарабанов :

왜 썼어?

패턴을 찾는 중...

지하로 옮기면 이런 모습


 
MakarFX :

안녕하세요!

안녕하세요 마카르님!

개봉 가격은 얼마입니까? 즉시 첫 번째 막대의 극한값을 취하십시오. 이와 같이:

 if (i==limit || TimeDay(time[i])!=TimeDay(time[i+ 1 ]))
   {
   Buffer1[i]= iHigh ( NULL ,period02,index1);
   Buffer2[i]= iLow ( NULL ,period02,index1);
   }
else
   {
   if ( iHigh ( NULL ,period02,index1)-Buffer1[i+ 1 ]> 0 )
      {
      Buffer1[i]= iHigh ( NULL ,period02,index1);
      }
   else
      {
      Buffer1[i]=Buffer1[i+ 1 ];
      }
   if (Buffer2[i+ 1 ]- iLow ( NULL ,period02,index1)> 0 )
      {
      Buffer2[i]= iLow ( NULL ,period02,index1);
      }
   else
      {
      Buffer2[i]=Buffer2[i+ 1 ]; 
      }
   }
아니면 내가 아이디어를 잘못 이해 했습니까?
 
Aleksei Stepanenko :

안녕하세요 마카르님!

개봉 가격은 얼마입니까? 즉시 첫 번째 막대의 극한값을 취하십시오. 이와 같이:

아니면 내가 아이디어를 잘못 이해 했습니까?

나는 썼다

1) 새 기간이 시작될 때 표시기가 "iOpen"으로 시작하도록 기준점 " period01 "을 설정하는 방법을 모르겠습니다.

첫 번째 마디의 극한값을 즉시 취하는 것이 옳으며, "else" 뒤에 오는 코드를 취하겠습니다. 고맙습니다.

그리고 여기

 if (i==limit || TimeDay(time[i])!=TimeDay(time[i+ 1 ]))

적합하지 않기 때문에 하루의 시작과 연결되어 있지만 "period01" - H1, H4를 선택해야 합니다. 등

 

또는 현재 날짜를 timeframe 의 초 수로 나눈 다음 결과 값을 이전 값과 비교할 수 있습니다.

 int part= 0 ;

int OnCalculate (......)
   {

   for (......)
      {
       if (time[i]/ PeriodSeconds (period01)>part)
         {      
         part=time[i]/ PeriodSeconds (period01);
      
         Buffer1[i]= iHigh ( NULL ,period02,index1);
         Buffer2[i]= iLow ( NULL ,period02,index1);
         }
       else
.......
      

아마도 시작은 일정과 동기화되지 않지만 시간 간격은 올바르게 계산됩니다. 첫 번째 참조를 동기화하는 방법을 생각할 수 있습니다.

유형:

 if (time[i]% PeriodSeconds (period01)== 0 )
 
Aleksei Stepanenko :

또는 현재 날짜를 기간의 초 수로 나눈 다음 결과 값을 이전 값과 비교할 수 있습니다.

아마도 시작은 일정과 동기화되지 않지만 시간 간격은 올바르게 계산됩니다. 첫 번째 참조를 동기화하는 방법을 생각할 수 있습니다.

유형:

정말 감사합니다. 노력하겠습니다.
 

별말씀을요. 더 짧은 항목:

Buffer1[i]= MathMax ( iHigh ( NULL ,period02,index1),Buffer1[i+ 1 ]);
Buffer2[i]= MathMin ( iLow ( NULL ,period02,index1),Buffer2[i+ 1 ]);
 
Aleksei Stepanenko :

별말씀을요. 더 짧은 항목:

대단해! 매우 감사합니다.

마침내 이것을 했다

   for (i=limit;i>= 0 ;i--)
   {
       if (TimeSeconds(time[i])== 0 )
      index1= iBarShift ( Symbol (), period01, time[i], false );
      index2= iBarShift ( Symbol (), period02, time[i], false );

      Buffer1[i]= iOpen ( NULL ,period01,index1);
      Buffer2[i]= MathMax ( iHigh ( NULL ,period02,index2),Buffer2[i+ 1 ]);
      Buffer3[i]= MathMin ( iLow ( NULL ,period02,index2),Buffer3[i+ 1 ]);

       if (Buffer1[i]!=Buffer1[i+ 1 ])
      {
      Buffer2[i]= iHigh ( NULL ,period02,index2);
      Buffer3[i]= iLow ( NULL ,period02,index2);
      }
   }