Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 34

 
Artyom Trishkin:

Zeigen Sie mir Ihren gesamten Indikator, damit wir sehen, was falsch ist.

Ich danke Ihnen.

Hier ist sie.


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

Ich danke Ihnen.

Hier ist sie

...

Nur zur Klarstellung.

Ich möchte den Pfeil nach oben setzen, wenn die Indikatorlinie in der M1-Periode das Niveau 20 überschritten hat und die Indikatorlinie in der M5-Periode nach oben, über das Niveau 50, gerichtet ist.

Schauen wir uns an, wie man die Werte aus dem höheren Zeitrahmen erhält, wenn man sich auf dem niedrigeren befindet:

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

Versuchen Sie als nächstes, die gewünschte Logik anstelle von Comment() auszuführen.

Schauen wir mal...

 
Artyom Trishkin:

Schauen wir uns an, wie man Werte aus einem höheren Zeitrahmen erhält, während man sich in einem niedrigeren befindet:

Und dann versuchen Sie, die gewünschte Logik anstelle von Comment() auszuführen.

Wir werden sehen...

Danke, es hat funktioniert)

Im Expert Advisor muss ich beim Aufruf des Indikators nur die Nummer des gewünschten Zeitrahmens angeben, während der Indikator mit der Verschiebung "tanzt". Wo kann ich mehr darüber lesen?

 
mila.com:

Danke, es hat funktioniert)

Im EA, wenn ich den Indikator aufrufe, muss ich nur die Nummer des gewünschten Zeitrahmens angeben, und der Indikator "tanzt" mit der Verschiebung. Wo kann ich mehr darüber lesen?

Ich habe es nirgendwo gelesen - ich habe keine Ahnung.

Stellen Sie sich Folgendes vor: Sie fahren mit dem Fahrrad durch die Bars auf der M1. Die Indikatorwerte entnehmen Sie der Taktnummer, auf die sich der Zyklusindex i bezieht.


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

In der Tabelle steht in der Kopfzeile oben der Zyklusindex M1, darunter der Wert der Taktzeit, auf den sich der Index M1 bezieht

Ganz unten der Zyklusindex M5, darüber der Wert der Taktzeit, auf die sich der Index M5 bezieht

Wenn Sie den Indexwert des aktuellen Zeitrahmens, in dem der Zyklus beginnt, an die Funktion iCustom() übergeben, erhalten Sie die Werte des Indikators aus dem älteren Zeitrahmen entsprechend dem Index. Der Index bezieht sich jedoch nicht auf den erforderlichen Balken, wie aus der Tabelle ersichtlich ist.

Und das sollte auch in den Expertenberatern geschehen, sonst nimmt man nicht die Werte aus dem erwarteten Balken und denkt, dass man es richtig gemacht hat. Nun, Sie haben es richtig gemacht, aber nicht aus der falschen Bar. Dies muss bekannt sein und berücksichtigt werden.

D.h., beim Empfang von Multitime-Daten muss man sich auf die Zeit verlassen und sie zur Taktnummer im gewünschten Zeitrahmen neu berechnen.

 

Artyom, bitte helfen Sie mir auch, ich habe Probleme mit Indikatoren.

Die Funktionen im Expert Advisor funktionieren und sind einfach zu verbinden, nun, es ist verständlich - sie brauchen nur aktuelle Werte, aber wie überträgt man sie auf den Indikator, um die Koinzidenz auf der Historie zu zeichnen...?

Die Pfeile sollten auf eine Kerze gezeichnet werden, sobald das Hoch[1] und das Tief[1] zusammenfallen.

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

Dann werde ich versuchen, andere Muster einzugeben, die der Analogie folgen, um den Expert Advisor nicht zu stören.

Ich danke Ihnen!

 
Vitaly Muzichenko:

Artyom, bitte helfen Sie mir auch, ich habe Probleme mit Indikatoren.

Die Funktionen im Expert Advisor funktionieren und sind einfach zu verbinden, nun, es ist verständlich - sie benötigen nur aktuelle Werte, aber wie überträgt man sie auf den Indikator, um ein Zusammentreffen auf der Geschichte zu zeichnen...?

Die Pfeile werden auf einer Kerze gezeichnet, wenn das Zusammentreffen von High[1] und Low[1] eintritt.

...

Dann werde ich versuchen, andere Muster einzugeben, die der Analogie folgen, um den Expert Advisor nicht zu stören.

Ich danke Ihnen!

Es sollte eine unterschiedliche Logik für verschiedene Muster geben, da nicht alle gleich sind. Und für ein und dasselbe Muster sollte die Logik von verschiedenen Programmierern unterschiedlich geschrieben werden.

Und was genau, welches Muster wollen Sie bestimmen?

Beginnen wir mit dem hier.

 
Artyom Trishkin:

Es muss eine unterschiedliche Logik für verschiedene Muster geben, denn nicht alle Muster sind gleich. Und für dasselbe Muster werden verschiedene Programmierer unterschiedliche Logiken schreiben.

Und was genau, welches Muster wollen Sie definieren?

Fangen wir mit diesem an.

Ich habe ein Bild beigefügt.

Die Bedingung: Fraktal "3" ist höher als Fraktal "2" und Fraktal "1" ist höher als "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Wir schauen uns die Kerzen an, die Fraktale sind bereits gebildet und warten auf die Bestätigung des Candlestick-Musters,

und wenn es"3" steigende in einer Reihe gibt - kaufen (Pfeil) -GetBearBull(dSymbol,0,3)==1(1 - kaufen)

Beim Verkauf ist es genau umgekehrt.

Es ist einfach, sie in einen Expert Advisor einzubauen, aber in einen Indikator ...

 
Vitaly Muzichenko:

Ich habe das Bild beigefügt.

Erforderliche Bedingung: Fraktal "3" ist höher als Fraktal "2" und Fraktal "1" ist höher als "2" -FrDn3 > FrDn2&& FrDn2< FrDn1 Wir betrachten den Candlestick, die Fraktale haben sich bereits gebildet und warten auf die Bestätigung des Candlestick-Musters,

und wenn es"3" steigende in einer Reihe gibt - kaufen (Pfeil) -GetBearBull(dSymbol,0,3)==1(1 - kaufen)

Beim Verkauf ist es genau umgekehrt.

Es ist einfach, sie in einen Expert Advisor einzubauen, aber in einen Indikator...

Im Indikator ist es umgekehrt - wenn Sie die Suche in der Tiefe der Geschichte beginnen, im Indikator - von seinem Anfang an. Suchen Sie zuerst das linke Fraktal, dann das mittlere und dann das rechte.

Verwalten Sie die Flaggen.

  1. Flagge = false
  2. Linksfraktal gefunden - Flagge wahr
  3. Finde das mittlere Fraktal, wenn es höher ist als das linke, dann markiere false; wenn es darunter liegt, gehe zu Schritt 4
  4. Finde das richtige Fraktal, wenn es niedriger als der Durchschnitt ist - False markieren, wenn es höher ist - weiter mit Schritt 5
  5. Alle Fraktale sind gefunden und die Flagge ist gesetzt - suchen Sie nach drei Balken in einer Reihe mit denselben Flaggen.
 
Artyom Trishkin:

Im Indikator ist die Logik umgekehrt - wenn Sie im EA tief in der Historie suchen, dann beginnen Sie im Indikator am Anfang der Historie. Suchen Sie zuerst das linke Fraktal, dann das mittlere und dann das rechte.

Verwalten Sie die Flaggen.

  1. Flagge = false
  2. Wir haben das linke Fraktal gefunden - setzen wir die Flagge auf true
  3. Finde das mittlere Fraktal, wenn es höher ist als das linke, dann markiere false; wenn es darunter liegt, gehe zu Schritt 4
  4. Rechtes Fraktal gefunden, wenn es niedriger als der Durchschnitt ist - falsch markieren, wenn es höher ist - weiter mit Schritt 5.
  5. Alle Fraktale sind gefunden und die Flagge ist gesetzt - suchen Sie nach drei Balken in einer Reihe mit denselben Flaggen.

Ich bitte darum, die fertige Variante zu zeigen. Vielleicht sehe ich sie einmal und die Fragen fallen weg, aber jetzt habe ich tausend Fragen und kann mich nicht entscheiden.

Was man mit all dem in einem Indikator machen kann - ich habe keine Ahnung(

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

Wenn ich könnte, dann keine Fragen, ich verstehe die Logik, aber ich kann sie nicht in den Code implementieren, also bitte ich darum, mir eine fertige Variante zu zeigen, ich werde sie einmal sehen und die Fragen werden in Zukunft verschwinden, aber jetzt gibt es Tausende von ihnen und ich kann sie nicht selbst lösen.

Was man mit all dem in einem Indikator machen kann - keine Ahnung(

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

Benötigen Sie eine Funktion, die eine fraktale Balkennummer nach ihrer Anzahl zurückgibt?

Sie benötigen eine Funktion, die das Vorhandensein eines Fraktals auf dem gewünschten Balken (Zyklusindex+3) zurückgibt

Grund der Beschwerde: