MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 34

 
Artyom Trishkin :

전체 지표를 표시하십시오. 무엇이 잘못되었는지 봅시다.

고맙습니다.

거기 그는


#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LawnGreen
#property indicator_color2 DeepPink
#property indicator_width1 1
#property indicator_width2 1
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
extern string Stochastic = "Configure Stochastic Settings" ;
extern int TimeFrame1= 1 ;
extern int KPeriod = 5 ;
extern int DPeriod = 3 ;
extern int Slowing = 3 ;
extern int OverBought = 80 ;
extern int OverSold = 20 ;


extern int TimeFrame2= 5 ;
extern int KPeriod1 = 5 ;
extern int DPeriod1 = 3 ;
extern int Slowing1 = 3 ;
extern int OverBought1 = 55 ;
extern int OverSold1 = 45 ;

extern string Alerts  = "Configure Alerts" ;
extern bool PopUpAlert = true ;     //Popup Alert
extern bool EmailAlert = true ;   //Email Alert
extern bool PushAlert  = true ;   //Push Notifications Alert
// UP and DOWN Buffers
double UP[];
double DOWN[];
// Distance of arrows from the high or low of a bar
int distance = 3 ;
double MyPoint;
datetime CTime;

int OnInit ()
  {
//--- indicator buffers mapping
   //UP Arrow Buffer
   SetIndexEmptyValue ( 0 , 0.0 );
   SetIndexStyle ( 0 , DRAW_ARROW , 0 , EMPTY );
   SetIndexArrow ( 0 , 233 );
   SetIndexBuffer ( 0 ,UP);
  
   //DOWN Arrow Buffer
   SetIndexEmptyValue ( 1 , 0.0 );
   SetIndexStyle ( 1 , DRAW_ARROW , 0 , EMPTY );
   SetIndexArrow ( 1 , 234 );
   SetIndexBuffer ( 1 ,DOWN);
  
   //Auto Adjustment for broker digits
   if ( Digits ()== 5 || Digits ()== 3 ){MyPoint= Point * 10 ;} else {MyPoint= Point ;}
  CTime= Time [ 0 ];
//---
   return ( INIT_SUCCEEDED );
  }
  
   void OnDeinit ( const int reason)
  {
//--- delete an object from a chart
   Comment ( "" );
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
//---
Comment ( "" );
int limit = rates_total;
int count=prev_calculated;



for ( int i=limit-count; i>= 1 ;i--)
{
    
//Getting Stochastic buffer values using the iCustom function
   double Stoch1 = iStochastic ( NULL ,TimeFrame1,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch2 = iStochastic ( NULL ,TimeFrame1,KPeriod,DPeriod,Slowing, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   double Stoch50_1 = iStochastic ( NULL ,TimeFrame2,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i);
   double Stoch50_2 = iStochastic ( NULL ,TimeFrame2,KPeriod1,DPeriod1,Slowing1, MODE_SMA , 0 , MODE_MAIN ,i+ 1 );
  
   if (Stoch1> 20 && Stoch2< 20 &&Stoch50_1> 50 &&Stoch50_1>Stoch50_2)
  {
   UP[i]= Low [i]-distance*MyPoint;
  }
   if (Stoch1< 80 && Stoch2> 80 &&Stoch50_1< 50 &&Stoch50_1<Stoch50_2)
  {
   DOWN[i]= High [i]+distance*MyPoint;
  }
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
mila.com :

고맙습니다.

거기 그는

...

해명하겠습니다.

M1 기간에 지표선이 레벨 20을 넘고 지표선이 위쪽을 향하고 있으면 M5 기간에 레벨 50 위에 있는 경우 위쪽 화살표를 표시 하고 싶습니다.

더 낮은 기간에 있는 더 높은 기간에서 값을 가져오는 방법을 살펴보겠습니다.

//+------------------------------------------------------------------+
//|                                                    iTwoStoch.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot UP
#property indicator_label1   "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1   clrLawnGreen
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1
//--- plot DN
#property indicator_label2   "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2   clrDeepPink
#property indicator_style2   STYLE_SOLID
#property indicator_width2   1

//--- enums
enum enumYN
  {
   enYes= 1 , // Да
   enNo= 0 ,   // Нет
  };

//--- input parameters
extern string Stochastic1 = "Параметры стохастика 1" ;
input ENUM_TIMEFRAMES    TimeFrame1  =   PERIOD_M1 ;   // Таймфрейм
input int                KPeriod1    =   5 ;           // Период %K
input int                DPeriod1    =   3 ;           // Период %D
input int                Slowing1    =   3 ;           // Замедление
input double             OverBought1 =   80 ;         // Уровень перекупленности
input double             OverSold1   =   20 ;         // Уровень перепроданности

extern string Stochastic2 = "Параметры стохастика 2" ;
input ENUM_TIMEFRAMES    TimeFrame2  =   PERIOD_M5 ;   // Таймфрейм
input int                KPeriod2    =   5 ;           // Период %K
input int                DPeriod2    =   3 ;           // Период %D
input int                Slowing2    =   3 ;           // Замедление
input double             OverBought2 =   55 ;         // Уровень перекупленности
input double             OverSold2   =   45 ;         // Уровень перепроданности

extern string Alerts  = "Configure Alerts" ;
input enumYN            UsePopUpAlert  = enYes;     // Popup Alert
input enumYN            UseEmailAlert  = enYes;     // Email Alert
input enumYN            UsePushAlert   = enYes;     // Push Notifications Alert
//--- indicator buffers
double          BufferUP[];
double          BufferDN[];
//--- global variables
int kperiod1;         // Период %K стох.1
int dperiod1;         // Период %D стох.1
int slowing1;         // Замедление стох.1
double overBought1;   // Уровень перекупленности стох.1
double overSold1;     // Уровень перепроданности стох.1
//---
int kperiod2;         // Период %K стох.2
int dperiod2;         // Период %D стох.2
int slowing2;         // Замедление стох.2
double overBought2;   // Уровень перекупленности стох.2
double overSold2;     // Уровень перепроданности стох.2
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferUP);
   SetIndexBuffer ( 1 ,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow ( 0 , 233 );
   SetIndexArrow ( 1 , 234 );
//---
   kperiod1=(KPeriod1< 1 ? 1 :KPeriod1);
   kperiod2=(KPeriod2< 1 ? 1 :KPeriod2);
   dperiod1=(DPeriod1< 1 ? 1 :DPeriod1);
   dperiod2=(DPeriod2< 1 ? 1 :DPeriod2);
   slowing1=(Slowing1< 1 ? 1 :Slowing1);
   slowing2=(Slowing2< 1 ? 1 :Slowing2);
   //---
   overBought1=(OverBought1> 100.0 ? 100.0 :OverBought1< 0.1 ? 0.1 :OverBought1);
   overSold1=(OverSold1< 0 ? 0 :OverSold1> 99.9 ? 99.9 :OverSold1);
   if (overBought1<=overSold1) overBought1=overSold1+ 0.1 ;
   if (overSold1>=overBought1) overSold1=overBought1- 0.1 ;
   //---
   overBought2=(OverBought2> 100.0 ? 100.0 :OverBought2< 0.1 ? 0.1 :OverBought2);
   overSold2=(OverSold2< 0 ? 0 :OverSold2> 99.9 ? 99.9 :OverSold2);
   if (overBought2<=overSold2) overBought2=overSold2+ 0.1 ;
   if (overSold2>=overBought2) overSold2=overBought2- 0.1 ;
//---
   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[])
  {
//---
   if (rates_total< 2 ) return ( 0 );
   int limit=rates_total-prev_calculated;
   if (limit> 1 ) {
      limit=rates_total- 2 ;
       ArrayInitialize (BufferUP, EMPTY_VALUE );
       ArrayInitialize (BufferDN, EMPTY_VALUE );
      }
   for ( int i=limit; i>= 0 ; i--) {
       int bar_sto2_0= iBarShift ( Symbol (),TimeFrame2, iTime ( Symbol (),TimeFrame2,i));
       int bar_sto2_1= iBarShift ( Symbol (),TimeFrame2, iTime ( Symbol (),TimeFrame2,i+ 1 ));
       double sto1_0= iStochastic ( Symbol (),TimeFrame1,kperiod1,dperiod1,slowing1, MODE_SMA , STO_LOWHIGH , MODE_MAIN ,i);
       double sto1_1= iStochastic ( Symbol (),TimeFrame1,kperiod1,dperiod1,slowing1, MODE_SMA , STO_LOWHIGH , MODE_MAIN ,i+ 1 );
       double sto2_0= iStochastic ( Symbol (),TimeFrame2,kperiod2,dperiod2,slowing2, MODE_SMA , STO_LOWHIGH , MODE_MAIN ,bar_sto2_0);
       double sto2_1= iStochastic ( Symbol (),TimeFrame2,kperiod2,dperiod2,slowing2, MODE_SMA , STO_LOWHIGH , MODE_MAIN ,bar_sto2_1);
       Comment (
               "\n" ,
               "Stoch " , EnumToString (TimeFrame1),
               ", бар " ,(i+ 1 ), " > время: " , TimeToString (time[i+ 1 ], TIME_MINUTES ), ", значение: " , DoubleToString (sto1_1, Digits ()),
               "; бар " ,i, " > время: " , TimeToString (time[i], TIME_MINUTES ), ", значение: " , DoubleToString (sto1_0, Digits ()), "\n" ,
               //---
               "Stoch " , EnumToString (TimeFrame2),
               ", бар " ,bar_sto2_1, " > время: " , TimeToString ( iTime ( Symbol (),TimeFrame2,bar_sto2_1), TIME_MINUTES ), ", значение: " , DoubleToString (sto2_1, Digits ()),
               "; бар " ,bar_sto2_0, " > время: " , TimeToString ( iTime ( Symbol (),TimeFrame2,bar_sto2_0), TIME_MINUTES ), ", значение: " , DoubleToString (sto2_0, Digits ())
             );
      }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

그런 다음 Comment() 대신 원하는 논리를 만들어 보십시오.

보자...

 
Artyom Trishkin :

더 낮은 기간에 있는 더 높은 기간에서 값을 가져오는 방법을 살펴보겠습니다.

그런 다음 Comment() 대신 원하는 논리를 만들어 보십시오.

보자...

감사합니다, 모두 잘 작동했습니다)

Expert Advisor에서 표시기를 호출 할 때 원하는 시간 프레임의 수를 지정하고 표시기에서 교대로 "춤"을 지정하는 것으로 충분합니다. 이에 대한 자세한 내용은 어디에서 읽을 수 있습니까?

 
mila.com :

감사합니다, 모두 잘 작동했습니다)

Expert Advisor에서 표시기를 호출 할 때 원하는 시간 프레임의 수를 지정하고 표시기에서 교대로 "춤"을 지정하는 것으로 충분합니다. 이에 대한 자세한 내용은 어디에서 읽을 수 있습니까?

나는 어디에서도 그것에 대해 읽은 적이 없습니다. 나는 당신에게 말하지도 않을 것입니다.

음, 스스로 상상해보십시오. M1의 막대를 순환합니다. 주기 지수 i가 참조하는 막대 번호에서 지표 값을 가져옵니다.


i+8 i+7
i+6
i+5 i+4 i+3
i+2 나+1
M1
09:52
09:53
09:54
09:55
09:56
09:57
09:58
09:59
10:00
M5
09:50
09:50
09:50
09:55
09:55
09:55
09:55
09:55
10:00
  i+2
i+2 i+2 나+1
나+1 나+1
나+1
나+1

상단 헤더의 표는 M1 주기 지수이고, 아래는 M1 지수가 참조하는 막대 시간 값입니다.

맨 아래는 M5 주기 지수이고 위는 M5 지수가 참조하는 막대 시간 값입니다.

그 때 루프가 전달된 현재 TF의 인덱스 값을 iCustom() 함수에 전달하면 인덱스별로 가장 높은 TF에서 지표 값을 얻습니다. 그리고 인덱스는 표에서 볼 수 있듯이 필요한 막대를 참조하지 않습니다.

그리고 이것이 Expert Advisors에서 수행해야 하는 작업입니다. 그렇지 않으면 예상 막대에서 값을 가져오지 않고 올바르게 얻었다고 생각합니다. 그들은 그것을 옳았지만 잘못된 바에서 얻었습니다. 이것을 알고 고려해야 합니다.

즉, 데이터를 여러 번 수신할 때 시간에 의존하여 원하는 TF의 막대 번호로 다시 계산해야 합니다.

 

Artyom도 도와주세요. 지표에 문제가 있습니다.

그러한 구조를 찾아 화살표를 표시해야하며 고문의 기능이 작동하고 간단하게 연결되어 있습니다. 이것은 이해할 수 있습니다. 현재 값만 필요하지만 표시기로 전송하는 방법 그것이 역사에 성냥을 그립니다 ...?

조건이 일치하는 즉시 양초에 화살표를 그립니다: 높음[1] 및 낮음[1]

//+------------------------------------------------------------------+
//|                                                         iTwo.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link        "https://login.mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot UP
#property indicator_label1   "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1   clrLawnGreen
#property indicator_style1   STYLE_SOLID
#property indicator_width1   1
//--- plot DN
#property indicator_label2   "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2   clrDeepPink
#property indicator_style2   STYLE_SOLID
#property indicator_width2   1

//--- input parameters
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1 ;
input string           dSymbol   = "AUDUSD" ;
//--- indicator buffers
double BufferUP[];
double BufferDN[];
//--- global variables

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,BufferUP);
   SetIndexBuffer ( 1 ,BufferDN);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   SetIndexArrow ( 0 , 233 );
   SetIndexArrow ( 1 , 234 );
  
//---
   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[])
{
//---
if (rates_total< 2 ) return ( 0 );
int limit=rates_total-prev_calculated;
   if (limit> 1 ) {
   limit=rates_total- 2 ;
     ArrayInitialize (BufferUP, EMPTY_VALUE );
     ArrayInitialize (BufferDN, EMPTY_VALUE );
  }
  
   int NumFrUp = GetFractalBar(dSymbol, PERIOD_CURRENT , 0 , MODE_UPPER ); // номер бара Up
   int NumFrDn = GetFractalBar(dSymbol, PERIOD_CURRENT , 0 , MODE_LOWER ); // номер бара Dn

   Comment ( "Bear: "   ,     GetBearBull(dSymbol, TimeFrame, 3 ) == 1 , // Подряд 3 бара вверх
           "\nBull:  " ,     GetBearBull(dSymbol, TimeFrame, 3 ) == 2 , // Подряд 3 бара вниз
           "\nNumFrUp: " ,  NumFrUp, // номер бара Up
           "\nNumFrDn:  " ,  NumFrDn, // номер бара Dn
           "\nPriceFrUp: " , iHigh (dSymbol, PERIOD_CURRENT ,NumFrUp), // Цена верхнего фрактала
           "\nPriceDn:  " ,   iLow (dSymbol, PERIOD_CURRENT ,NumFrDn)   // Цена нижнего  фрактала
         );
  
   for ( int i=limit; i>= 0 ; i--) {
   //--
   if ( /* что сюда */ 0 )
    {
     BufferUP[i]= Low [i]- 50 * _Point ;
    }
  
   //--
   if ( /* что сюда */ 0 )
    {
     BufferDN[i]= High [i]+ 50 * _Point ;
    }

  } // end for
//--- return value of prev_calculated for next call
   return (rates_total);
}

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar( string symb= "0" , int tf= 0 , int nf= 0 , int mode= MODE_UPPER ) {
if (symb== "0" ) { symb= Symbol ();}
double f= 0 ;
int kf= 0 ;
   for ( int i= 3 ; i< iBars (symb, tf)- 1 ; i++) {
   if (mode== MODE_LOWER ){
   f= iFractals (symb, tf, MODE_LOWER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}
   if (mode== MODE_UPPER ){
   f= iFractals (symb, tf, MODE_UPPER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}}
   return (- 1 );
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull( string symb= "0" , int tf= 0 , int ne= 5 ) {
if (symb== "0" ) { symb= Symbol ();}
   double open1= 0 ,close1= 0 ,open2= 0 ,close2= 0 ;
   int b= 1 ,s= 1 ;
   for ( int i= 1 ; i<ne; i++) {
    open1= iOpen (symb,tf,i);
    close1= iClose (symb,tf,i);
    open2= iOpen (symb,tf,i+ 1 );
    close2= iClose (symb,tf,i+ 1 );
     if (open2<close2 && open1<close1 && open2<open1) {   // бычьи
      b++;
       if (b==ne) { return ( 1 );}
     }
     if (open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
       if (s==ne) { return ( 2 );}
     }
  }
   return ( 0 );
}
//===============================================================================================

그런 다음 유추하여 고문을 운전하지 않도록 다른 패턴을 입력하려고합니다.

고맙습니다!

 
Vitaly Muzichenko :

Artyom도 도와주세요. 지표에 문제가 있습니다.

그러한 구조를 찾아 화살표를 표시해야하며 고문의 기능이 작동하고 간단하게 연결되어 있습니다. 이것은 이해할 수 있습니다. 현재 값만 필요하지만 표시기로 전송하는 방법 그것이 역사에 성냥을 그립니다 ...?

조건이 일치하는 즉시 양초에 화살표를 그립니다: 높음[1] 및 낮음[1]

...

그런 다음 유추하여 고문을 운전하지 않도록 다른 패턴을 입력하려고합니다.

고맙습니다!

다른 패턴의 경우 모두 동일하지 않기 때문에 고유한 논리가 있어야 합니다. 그리고 동일한 패턴에 대해 다른 프로그래머는 다른 논리를 작성합니다.

그리고 정확히 어떤 패턴을 정의하고 싶습니까?

이것부터 시작하겠습니다.

 
Artyom Trishkin :

다른 패턴의 경우 모두 동일하지 않기 때문에 고유한 논리가 있어야 합니다. 그리고 동일한 패턴에 대해 다른 프로그래머는 다른 논리를 작성합니다.

그리고 정확히 어떤 패턴을 정의하고 싶습니까?

이것부터 시작하겠습니다.

사진을 첨부했습니다.

조건이 필요합니다. 프랙탈 "3"은 프랙탈 "2"보다 높고 프랙탈 "1"은 "2"보다 높습니다 - FrDn 3 > Fr Dn 2 && Fr Dn 2 < Fr Dn 1 모델 ,

그리고 성장하는 행에 " 3 "이 있는 경우 - 구매(화살표) - GetBearBull(dSymbol,0, 3 )== 1 (1 - 구매)

판매의 경우 그 반대입니다.

이것을 EA에 넣는 것은 쉽지만 지표에...

 
Vitaly Muzichenko :

사진을 첨부했습니다.

조건이 필요합니다. 프랙탈 "3"은 프랙탈 "2"보다 높고 프랙탈 "1"은 "2"보다 높습니다 - FrDn 3 > Fr Dn 2 && Fr Dn 2 < Fr Dn 1 모델,

그리고 성장하는 행에 " 3 "이 있는 경우 - 구매(화살표) - GetBearBull(dSymbol,0, 3 )== 1 (1 - 구매)

판매의 경우 그 반대입니다.

이것을 EA에 넣는 것은 쉽지만 지표에...

표시기에서 논리는 반대입니다. Expert Advisor에서 기록에 대해 깊숙이 검색을 시작한 다음 표시기에서 처음부터 검색을 시작하는 경우입니다. 왼쪽 프랙탈을 먼저 찾은 다음 가운데 프랙탈을 찾은 다음 오른쪽 프랙탈을 찾습니다.

플래그 관리.

  1. 플래그 = 거짓
  2. 왼쪽 프랙탈을 찾았습니다 - 플래그를 true로 설정
  3. 중간 프랙탈을 찾았습니다. 왼쪽보다 높으면 플래그가 false이고 더 낮으면 4단계로 이동합니다.
  4. 올바른 프랙탈을 찾았습니다. 중간 아래에 있으면 플래그가 false이고 위에 있으면 5단계로 이동합니다.
  5. 모든 프랙탈이 발견되고 플래그가 설정되었습니다. 동일한 플래그가 있는 연속으로 세 개의 막대를 찾고 있습니다.
 
Artyom Trishkin :

표시기에서 논리는 반대입니다. Expert Advisor에서 기록에 대해 깊숙이 검색을 시작한 다음 표시기에서 처음부터 검색을 시작하는 경우입니다. 왼쪽 프랙탈을 먼저 찾은 다음 가운데 프랙탈을 찾은 다음 오른쪽 프랙탈을 찾습니다.

플래그 관리.

  1. 플래그 = 거짓
  2. 왼쪽 프랙탈을 찾았습니다 - 플래그를 true로 설정
  3. 중간 프랙탈을 찾았습니다. 왼쪽보다 높으면 플래그가 false이고 더 낮으면 4단계로 이동합니다.
  4. 올바른 프랙탈을 찾았습니다. 중간 아래에 있으면 플래그가 false이고 위에 있으면 5단계로 이동합니다.
  5. 모든 프랙탈이 발견되고 플래그가 설정되었습니다. 동일한 플래그가 있는 연속으로 세 개의 막대를 찾고 있습니다.

할 수만 있다면 질문도 안 하고 논리는 이해하지만 코드로 구현하지 못해서 기성품 버전으로 보여달라고 하고 한 번 보고 질문이 사라집니다 미래에, 하지만 지금은 수천 개의 문제가 있고 나 스스로 해결할 수 없습니다.

표시기(

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar( string symb= "0" , int tf= 0 , int nf= 0 , int mode= MODE_UPPER ) {
if (symb== "0" ) { symb= Symbol ();}
double f= 0 ;
int kf= 0 ;
   for ( int i= 3 ; i< iBars (symb, tf)- 1 ; i++) {
   if (mode== MODE_LOWER ){
   f= iFractals (symb, tf, MODE_LOWER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}
   if (mode== MODE_UPPER ){
   f= iFractals (symb, tf, MODE_UPPER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}}
   return (- 1 );
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull( string symb= "0" , int tf= 0 , int ne= 5 ) {
if (symb== "0" ) { symb= Symbol ();}
   double open1= 0 ,close1= 0 ,open2= 0 ,close2= 0 ;
   int b= 1 ,s= 1 ;
   for ( int i= 1 ; i<ne; i++) {
    open1= iOpen (symb,tf,i);
    close1= iClose (symb,tf,i);
    open2= iOpen (symb,tf,i+ 1 );
    close2= iClose (symb,tf,i+ 1 );
     if (open2<close2 && open1<close1 && open2<open1) {   // бычьи
      b++;
       if (b==ne) { return ( 1 );}
     }
     if (open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
       if (s==ne) { return ( 2 );}
     }
  }
   return ( 0 );
}
//===============================================================================================
 
Vitaly Muzichenko :

할 수만 있다면 질문도 안 하고 논리는 이해하지만 코드로 구현하지 못해서 기성품 버전으로 보여달라고 하고 한 번 보고 질문이 사라집니다 미래에, 하지만 지금은 수천 개의 문제가 있고 나 스스로 해결할 수 없습니다.

표시기(

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
int GetFractalBar( string symb= "0" , int tf= 0 , int nf= 0 , int mode= MODE_UPPER ) {
if (symb== "0" ) { symb= Symbol ();}
double f= 0 ;
int kf= 0 ;
   for ( int i= 3 ; i< iBars (symb, tf)- 1 ; i++) {
   if (mode== MODE_LOWER ){
   f= iFractals (symb, tf, MODE_LOWER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}
   if (mode== MODE_UPPER ){
   f= iFractals (symb, tf, MODE_UPPER , i);
   if (f!= 0 ) {
    kf++;
     if (kf>nf) { return (i);}
   }}}
   return (- 1 );
}
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull( string symb= "0" , int tf= 0 , int ne= 5 ) {
if (symb== "0" ) { symb= Symbol ();}
   double open1= 0 ,close1= 0 ,open2= 0 ,close2= 0 ;
   int b= 1 ,s= 1 ;
   for ( int i= 1 ; i<ne; i++) {
    open1= iOpen (symb,tf,i);
    close1= iClose (symb,tf,i);
    open2= iOpen (symb,tf,i+ 1 );
    close2= iClose (symb,tf,i+ 1 );
     if (open2<close2 && open1<close1 && open2<open1) {   // бычьи
      b++;
       if (b==ne) { return ( 1 );}
     }
     if (open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
       if (s==ne) { return ( 2 );}
     }
  }
   return ( 0 );
}
//===============================================================================================

숫자로 프랙탈 막대 숫자를 반환하는 함수가 정말로 필요합니까?

원하는 막대에 프랙탈이 있는지 반환하는 함수가 필요합니다(주기 인덱스+3).