MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 34

 
Artyom Trishkin :

Tüm göstergenizi gösterin - orada neyin yanlış olduğunu görelim.

Teşekkür ederim.

İşte burada


#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 :

Teşekkür ederim.

İşte burada

...

açıklığa kavuşturacağım.

M1 periyodunda gösterge çizgisi 20. seviyeyi geçtiyse ve M5 periyodunda gösterge çizgisi yukarı doğru, 50. seviyenin üzerindeyse yukarı ok koymak istiyorum.

Daha düşük olanda olmak üzere daha yüksek zaman diliminden değerleri nasıl alacağımızı görelim:

//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

Ardından istediğiniz mantığı oluşturmak için Comment() yerine deneyin.

Bakalım...

 
Artyom Trishkin :

Daha düşük olanda olmak üzere daha yüksek zaman diliminden değerleri nasıl alacağımızı görelim:

Ardından istediğiniz mantığı oluşturmak için Comment() yerine deneyin.

Bakalım...

Teşekkürler, hepsi iyi çalıştı)

Uzman Danışmanda, göstergeyi çağırırken, sadece istenen zaman diliminin sayısını belirtmek ve göstergede bir vardiya ile “dans etmek” yeterlidir. Bununla ilgili daha fazla bilgiyi nerede okuyabilirim?

 
mila.com :

Teşekkürler, hepsi iyi çalıştı)

Uzman Danışmanda, göstergeyi çağırırken, sadece istenen zaman diliminin sayısını belirtmek ve göstergede bir vardiya ile “dans etmek” yeterlidir. Bununla ilgili daha fazla bilgiyi nerede okuyabilirim?

Hiçbir yerde okumadım - size söylemeyeceğim bile.

Kendiniz için hayal edin: M1'deki çubuklar arasında bir döngüye giriyorsunuz. Döngü indeksi i tarafından referans verilen çubuk numarasından gösterge değerlerini alın.


ben+8 ben+7
ben+6
ben+5 ben+4 ben+3
ben+2 ben+1 ben
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
  ben+2
ben+2 ben+2 ben+1
ben+1 ben+1
ben+1
ben+1 ben

Üstteki başlıktaki tabloda M1 döngü indeksi, aşağıda M1 indeksi tarafından referans verilen çubuk zamanının değeri yer almaktadır.

En altta M5 döngü indeksi bulunur, yukarıda M5 indeksi tarafından referans verilen çubuk zamanının değeri bulunur.

İşte o zaman döngünün geçtiği mevcut TF'den indeks değerini iCustom() işlevine ilettiğinizde, ardından indekse göre en yüksek TF'den gösterge değerlerini alırsınız. Ve indeks, tablodan da görülebileceği gibi, ihtiyacınız olan çubuğa atıfta bulunmaz.

Ve Expert Advisors'da yapmanız gereken de bu, aksi halde değerleri beklenen çubuktan değil, doğru aldığınızı zannediyorsunuz. Doğru anladılar, ama yanlış bardan. Bunun bilinmesi ve dikkate alınması gerekir.

Yani, çok zamanlı veri alırken, zamana güvenmeniz ve istenen TF'deki çubuk numarasına yeniden hesaplamanız gerekir.

 

Artyom, lütfen bana da yardım et, göstergelerle ilgili sorunlarım var.

Bu tür yapıları bulmanız ve üzerlerine oklar koymanız gerekir, danışmandaki işlevler çalışır ve basitçe bağlanır, peki, bu anlaşılabilir - orada sadece mevcut değerlere ihtiyaç var, ancak bunları göstergeye nasıl aktaracağınızı tarihe maçlar çiziyor...?

Koşullar eşleştiğinde hemen mum üzerine oklar çizin: Yüksek[1] ve Düşük[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 );
}
//===============================================================================================

Ardından, benzetme yoluyla, danışmanları yönlendirmemek için diğer kalıpları girmeye çalışacağım.

Teşekkür ederim!

 
Vitaly Muzichenko :

Artyom, lütfen bana da yardım et, göstergelerle ilgili sorunlarım var.

Bu tür yapıları bulmanız ve üzerlerine oklar koymanız gerekir, danışmandaki işlevler çalışır ve basitçe bağlanır, peki, bu anlaşılabilir - orada sadece mevcut değerlere ihtiyaç var, ancak bunları göstergeye nasıl aktaracağınızı tarihe maçlar çiziyor...?

Koşullar eşleştiğinde hemen mum üzerine oklar çizin: Yüksek[1] ve Düşük[1]

...

Ardından, benzetme yoluyla, danışmanları yönlendirmemek için diğer kalıpları girmeye çalışacağım.

Teşekkür ederim!

Farklı desenler için - kendi mantıkları olmalıdır, çünkü hepsi aynı değildir. Ve aynı model için farklı programcılar farklı mantık yazacaktır.

Ve tam olarak ne, hangi kalıbı tanımlamak istiyorsunuz?

Bununla başlayalım.

 
Artyom Trishkin :

Farklı desenler için - kendi mantıkları olmalıdır, çünkü hepsi aynı değildir. Ve aynı model için farklı programcılar farklı mantık yazacaktır.

Ve tam olarak ne, hangi kalıbı tanımlamak istiyorsunuz?

Bununla başlayalım.

Resmi ekledim.

Koşul gereklidir: fraktal "3" fraktal "2" den daha yüksektir ve fraktal "1" "2" den yüksektir - FrDn 3 > Fr Dn 2 && Fr Dn 2 < Fr Dn 1 modelleri ,

ve arka arkaya büyüyen " 3 " varsa - satın al (ok) - GetBearBull(dSymbol,0, 3 )== 1 (1 - satın al)

Satışlarda ise tam tersi geçerlidir.

Bunu bir EA'ya koymak kolaydır, ancak bir göstergeye...

 
Vitaly Muzichenko :

Resmi ekledim.

Koşul gereklidir: fraktal "3" fraktal "2" den daha yüksektir ve fraktal "1" "2" den yüksektir - FrDn 3 > Fr Dn 2 && Fr Dn 2 < Fr Dn 1 modelleri,

ve arka arkaya büyüyen " 3 " varsa - satın al (ok) - GetBearBull(dSymbol,0, 3 )== 1 (1 - satın al)

Satışlarda ise tam tersi geçerlidir.

Bunu bir EA'ya koymak kolaydır, ancak bir göstergeye...

Göstergede, mantık tam tersidir - Uzman Danışmanda tarihin derinliklerini aramaya başlarsanız, ardından göstergede - başlangıcından. Önce sol fraktal, sonra orta, sonra sağ fraktal arayın.

Bayrakları yönetmek.

  1. İşaret = yanlış
  2. Sol fraktal bulundu - bayrağı true olarak ayarlayın
  3. Soldan daha yüksekse orta fraktal bulduk - bayrak yanlış, daha düşükse 4. adıma gidin
  4. Ortanın altındaysa doğru fraktal bulundu - bayrak yanlış, yukarıdaysa - 5. adıma gidin
  5. Tüm fraktallar bulunur ve bayrak ayarlanır - aynı bayraklarla arka arkaya üç çubuk arıyoruz.
 
Artyom Trishkin :

Göstergede, mantık tam tersidir - Uzman Danışmanda tarihin derinliklerini aramaya başlarsanız, ardından göstergede - başlangıcından. Önce sol fraktal, sonra orta, sonra sağ fraktal arayın.

Bayrakları yönetmek.

  1. İşaret = yanlış
  2. Sol fraktal bulundu - bayrağı true olarak ayarlayın
  3. Soldan daha yüksekse orta fraktal bulduk - bayrak yanlış, daha düşükse 4. adıma gidin
  4. Ortanın altındaysa doğru fraktal bulundu - bayrak yanlış, yukarıdaysa - 5. adıma gidin
  5. Tüm fraktallar bulunur ve bayrak ayarlanır - aynı bayraklarla arka arkaya üç çubuk arıyoruz.

Yapabilsem soru sorulmadı mantığı anladım ama kodda uygulayamıyorum o yüzden hazır hali ile göstermenizi rica ediyorum bir kere göreceğim sorular yok olacak gelecekte, ama şimdilik bin tane var ve bunu kendim çözemiyorum.

Göstergedeki tüm bunlarla ne yapacağım hakkında hiçbir fikrim yok (

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
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 :

Yapabilsem soru sorulmadı mantığı anladım ama kodda uygulayamıyorum o yüzden hazır hali ile göstermenizi rica ediyorum bir kere göreceğim sorular yok olacak gelecekte, ama şimdilik bin tane var ve bunu kendim çözemiyorum.

Göstergedeki tüm bunlarla ne yapacağım hakkında hiçbir fikrim yok (

//===============================================================================================
//---------------------- Возвращает номер бара фрактала по его номеру --------------------------+
//===============================================================================================
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 );
}
//===============================================================================================

Fraktal çubuk numarasını numarasına göre döndüren bir işleve gerçekten ihtiyacınız var mı?

İstediğiniz çubukta bir fraktalın varlığını döndüren bir işleve ihtiyacınız var (döngü indeksi+3)