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

 
Artyom Trishkin:
Wir müssen tiefer blicken...

Tiefer, wo ist das?

Alle Versuche, mit dem neuen Indikator, führen zu einer Aufhängung.

Und beim Indikator, der unverändert ist, gibt es einen kurzen Schluckauf.

Was könnte die Lösung sein?

 
mila.com:

Tiefer, wo ist das?

Alle Versuche mit dem neuen Indikator führen zu einem Auflegen.

Und mit dem Blinker, der unverändert bleibt, gibt es ein kurzzeitiges Abbremsen.

Was könnte die Lösung sein?

Suchen Sie in Ihrem Indikator - anstatt darin die Daten anderer benutzerdefinierter Indikatoren zu verwenden - nach Fraktalen beliebiger Dimension, erstellen Sie einfach eine Funktion zur Suche nach solchen Fraktalen und arbeiten Sie mit ihnen.
 
Artyom Trishkin:
Erstellen Sie einfach Funktionen, um solche Fraktale zu finden und mit ihnen zu arbeiten.

Für Sie ist das eine einfache Sache.)

aber für mich ist das eine unmögliche Aufgabe.

Eine Funktion wie diese?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Es ist ein unteres Fraktal.

Wie wird es verwendet?

 
mila.com:

Für Sie ist das einfacher.)

Aber für mich ist das eine unmögliche Aufgabe.

Wie kann ich die Funktion dieses Indikators in meinen einbauen?


bool isDnFractal(int bar,int max,const double &low[])
  {
//---
   for(int i=1; i<=max; i++) {
      if(i<=leftSide && low[bar]>low[bar-i])    return(false);
      if(i<=rightSide && low[bar]>=low[bar+i])  return(false);
      }
//---
   return(true);
  }

Nun, Sie brauchen es, um den Preis eines Fraktals auf dem gewünschten Balken zurückzugeben. Hier habe ich einen einfachen Indikator erstellt. Es hat zwei Funktionen, die Sie daraus entnehmen und in Ihren verwenden können - ich habe sie speziell als Funktionen organisiert - mit Prüfungen auf ungültige Werte.

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.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 UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,159);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(i,limit,high,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(i,limit,low ,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(int shift,const int limit,const double &low[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(low[i]>low[i-1]) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(low[i]>low[i+1]) return(-1);
   return(low[shift]);
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(int shift,const int limit,const double &high[],int left_dimension=2,int right_dimension=2) {
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>limit-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(high[i]<high[i-1]) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(high[i]<high[i+1]) return(-1);
   return(high[shift]);
}
//+----------------------------------------------------------------------------+
 

Um die Funktionen zur Ermittlung beliebiger Fraktale vollständig vom Indikator zu trennen, sollten wir die Arrays high[] und low[] und den Grenzwert nicht per Referenz übergeben.

Da unser Code sehr nah an MQL5 ist, müssen wir die Funktionen High[], Low[], iHigh() und iLow() ablehnen. So wird es in diesem Indikator aussehen:

//+------------------------------------------------------------------+
//|                                             iFreeNumFractals.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 UpperFractal
#property indicator_label1  "UpperFractal"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot LowerFractal
#property indicator_label2  "LowerFractal"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrSteelBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input          int      LeftNum=2;     // Количество баров слева
int leftNum;     // Количество баров слева
input          int      RightNum=2;    // Количество баров справа
int rightNum;    // Количество баров справа
//--- indicator buffers
double         BufferUpperFractal[];
double         BufferLowerFractal[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUpperFractal);
   SetIndexBuffer(1,BufferLowerFractal);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   // PlotIndexSetInteger(0,PLOT_ARROW,217);
   // PlotIndexSetInteger(1,PLOT_ARROW,218);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
//---
   leftNum=(LeftNum<1?1:LeftNum);
   rightNum=(RightNum<1?1:RightNum);
//---
   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<leftNum+rightNum) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>0) {
      ArrayInitialize(BufferUpperFractal,0.0);
      ArrayInitialize(BufferUpperFractal,0.0);
      limit=rates_total-leftNum-1;
      }
   //---
   for(int i=limit; i>rightNum; i--) {
      if(GetFreeUpperFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferUpperFractal[i]=high[i];
      if(GetFreeLowerFractal(Symbol(),PERIOD_CURRENT,i,leftNum,rightNum)>0) BufferLowerFractal[i]=low[i];
      }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
double GetFreeLowerFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>shift-right_dimension; i--) if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<shift+left_dimension; i++)  if(GetPriceLow(symbol_name,timeframe,i)>GetPriceLow(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceLow(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetFreeUpperFractal(const string symbol_name,ENUM_TIMEFRAMES timeframe,int shift,int left_dimension=2,int right_dimension=2) {
   int bars=Bars(symbol_name,timeframe);
   if(left_dimension<1)  left_dimension=1;
   if(right_dimension<1) right_dimension=1;
   if(shift-right_dimension<1 || shift+left_dimension>bars-1) return(-1);
   for(int i=shift; i>=shift-right_dimension; i--) if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i-1)) return(-1);
   for(int i=shift; i<=shift+left_dimension; i++)  if(GetPriceHigh(symbol_name,timeframe,i)<GetPriceHigh(symbol_name,timeframe,i+1)) return(-1);
   return(GetPriceHigh(symbol_name,timeframe,shift));
}
//+----------------------------------------------------------------------------+
double GetPriceHigh(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
double GetPriceLow(const string symbol_name, ENUM_TIMEFRAMES timeframe, int shift){
   double array[1];
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   return(-1);
}
//+----------------------------------------------------------------------------+
Wir sollten jedoch auch für -1 von den Funktionen GetPriceHigh() und GetPriceLow() prüfen
 
Hallo, beraten, wie ein EA mit 15 Minuten Zeitrahmen zu machen, um den Wert alle 20 Minuten zu überprüfen, sagen wir bei 9-20, 9-40 gefolgt von Crossover RSI und wenn das Niveau in zwanzig Minuten überschritten wird, überprüft die Preisänderung. Das ist es, was ich in Ordnung bringen muss:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Nehmen wir an, der RSI wurde bei 9-20 gekreuzt. Ich möchte, dass sich mein EA den Preis um 9-20 Uhr merkt und um 9-40 Uhr die letzten 20 Minuten im Verhältnis zum Preis um 9-20 Uhr überprüft. Wenn der Kurs sinkt, wird ein Short eröffnet. Ich danke Ihnen vielmals.
 
strongflex:
Hallo, beraten, wie man Expert Advisor mit 15-Minuten-Zeitrahmen zu machen, um den Wert alle 20 Minuten zu überprüfen, sagen wir bei 9-20, 9-40 gefolgt von Crossover RSI und wenn das Niveau in zwanzig Minuten überschritten wird, überprüft die Preisänderung. Das ist es, was ich in Ordnung bringen muss:
if (Hour()==9 && (Minute() == 20) && (RSI>70))
Price2==Bid;
     {
      if (Hour()==9 && (Minute() == 40) && (Bid<Price2))
  
         {
          ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, SP,0,0, NULL, Magic, 0, Blue);
          return(0);
         }
     }

Das heißt, der RSI wurde bei 9-20 gekreuzt. Ich möchte, dass sich mein EA den Preis um 9-20 Uhr merkt und um 9-40 Uhr die letzten 20 Minuten relativ zum Preis um 9-20 Uhr überprüft. Wenn der Kurs sinkt, wird ein Short eröffnet. Ich danke Ihnen vielmals.

:)

Was passiert, wenn Sie den Expert Advisor bei 9,22 laufen lassen?

Und wenn es einen System- oder Terminalausfall gibt? Der Preis wird verloren gehen.

D.h., Sie müssen nachsehen, was vor 20 Minuten war, wenn der Zeitpunkt dieser Überprüfung kommt. Der Zeitpunkt ist gekommen, an dem die Minuten größer oder gleich einem Vielfachen von zwanzig sind - prüfen Sie den Stand des RSI auf dem Balken, der vor 20 Minuten war. Wenn es die richtige Kreuzung hat, dann fahren Sie wie geplant fort...

Auf der M15 können Sie jedoch nicht den genauen Zeitpunkt der Überquerung und den genauen Preis ermitteln, aber Sie können den Preis auf der M1 betrachten - der mindestens 15 Mal genauer ist.

 
Artyom Trishkin:

:)

Was, wenn Sie den EA bei 9,22 laufen lassen?

Was ist, wenn ein System- oder Terminalfehler auftritt? Der Preis wird verloren gehen.

D.h., Sie müssen nachsehen, was vor 20 Minuten war, wenn der Zeitpunkt dieser Überprüfung kommt. Der Zeitpunkt ist gekommen, an dem die Minuten größer oder gleich einem Vielfachen von zwanzig sind - prüfen Sie den Stand des RSI auf dem Balken, der vor 20 Minuten war. Wenn er die gewünschte Kreuzung hat, dann machen wir weiter wie geplant...

Auf der M15 können Sie jedoch nicht den genauen Zeitpunkt der Überquerung und den genauen Preis ermitteln, aber Sie können den Preis auf der M1 betrachten - der mindestens 15 Mal genauer ist.

Okay, ich dachte, ich kann es nicht tun))) Leute, wer kann diesen Teil des Codes zu schreiben? Ich werde 1000 Rubel zahlen
 
strongflex:
Okay, ich verstehe, dass ich nicht mit ihm zu bewältigen)))) Jungs, die diesen Teil des Codes schreiben kann? Ich werde 1000 Rubel zahlen
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

Und wo ist der Tausender?

(nur ein Scherz)

 
Alekseu Fedotov:
double rci20 = iRSI(NULL,PERIOD_M1,14,PRICE_CLOSE,20);//RCI 20 минут назад.
   Comment("RSI = ",rci20);

Und wo ist der Tausender?

(scherzhaft)

Die RSI muss 15 Minuten lang sein. Wir brauchen die EA, um es zu überprüfen alle 20 Minuten von der Markteröffnung (9-00, 9-20, 9-40 usw.) Sagen wir, bei 10-20 gibt es eine Kreuzung von unten nach oben die 70-Ebene es merkt sich den Preis und bei 10-40 es prüft, ob der Preis niedriger ist als bei 10-20 es öffnet eine kurze.
Grund der Beschwerde: