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

 
Vladimir Pastushak:

Wie erkenne ich den Typ des Eingabeparameters?

der Compiler selbst ersetzt die Typen im Moment des Aufrufs der Schablonenfunktion, wenn ein solcher Aufruf noch nicht im Code war, dann wird der Compiler eine weitere Funktionskopie erstellen und die Typen selbst setzen - nun, als ob logisch - eine Schablone


Wenn die Frage lautet, wie der Typ in einer solchen Funktion zu definieren ist, verwenden Sie

typename

UPD: dem obigen Beispiel wurde der Parametertyp Drucker hinzugefügt:

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typenname = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typenname = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typenname = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typenname = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD:__FUNCSIG__ zu diesem Beispiel hinzugefügt

 

Nachmittags.
Ich stehe vor einer seltsamen Sache , wenn ich einen Indikator in MQL5 schreibe (Indikator in einem separaten Unterfenster, 4 Zeilen).

Die anfänglichen Pufferbeschreibungen lauten wie folgt:

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

Weiter in OnInit:

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

Im Wesentlichen zeichnet der Indikator 4 Linien: die ersten beiden sind einfarbig, die nächsten beiden zweifarbig (sie wechseln die Farbe bei Knicken).

Die Zweifarbigkeit ist auf die Art des Zeichnens von DRAW_COLOR_LINE zurückzuführen.

Frage: die erste Zeile (Puffer 2 und 3 im obigen Code) ist perfekt gezeichnet und der gesamte Code, der für sie in OnInit geschrieben wurde, funktioniert;
zweite Zeile erscheint aus irgendeinem Grund, zum Beispiel funktioniert die Zeile nicht:

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
D.h. anstelle des Textes, den ich im Datenfenster eingestellt habe, wird nur der Name des Indikators anstelle des Puffers angezeigt. Die Linie selbst ist zwar gezogen, aber sie ist, wie es sich gehört, vielfarbig.
Ich glaube, der Trick liegt in der Verschiebung der Nummerierung? Ich bin mir zum Beispiel nicht sicher, warum im oberen Teil des Codes, wenn ich die letzte Zeile mit der #property-Direktive deklariere, der Index 4 und nicht 5 sein sollte, da 4 Puffer bereits vorher verwendet wurden. Gibt es überhaupt eine Beziehung zwischen Zeilennummerierung bei der Deklaration mit #property und Puffer Nummerierung bei der Verknüpfung mit Arrays in OnInit?

Bitte geben Sie an, was im obigen Code falsch ist. Vielleicht kann jemand ein Beispiel für einen Indikator finden, bei dem mindestens zwei Linien mit der Zeichenmethode DRAW_COLOR_LINE.... gezeichnet werden

Eine weitere Frage in diesem Zusammenhang: Wie werden die bunten Linienpuffer miteinander verbunden? Ich meine, woher weiß der kompilierte Code, dass, wenn ich einen Wert in einen Farbpuffer eintrage, diese Farbe zum Einfärben einer Linie aus einem anderen Puffer verwendet werden soll?

 
satorifx:

Nachmittags.
Ich stehe vor einer seltsamen Sache , wenn ich einen Indikator in MQL5 schreibe (Indikator in einem separaten Unterfenster, 4 Zeilen).

Die anfänglichen Pufferbeschreibungen lauten wie folgt:

Weiter in OnInit:

Im Wesentlichen zeichnet der Indikator 4 Linien: die ersten beiden sind einfarbig, die nächsten beiden zweifarbig (sie wechseln die Farbe bei Knicken).

Die Zweifarbigkeit ist auf die Art des Zeichnens von DRAW_COLOR_LINE zurückzuführen.

Frage: die erste Zeile (Puffer 2 und 3 im obigen Code) ist perfekt gezeichnet und der gesamte Code, der für sie in OnInit geschrieben wurde, funktioniert;
zweite Zeile erscheint aus irgendeinem Grund, zum Beispiel funktioniert die Zeile nicht:

D.h. anstelle des Textes, den ich im Datenfenster eingestellt habe, wird nur der Name des Indikators anstelle des Puffers angezeigt. Die Linie selbst ist zwar gezogen, aber sie ist, wie es sich gehört, vielfarbig.
Ich glaube, der Trick liegt in der Verschiebung der Nummerierung? Zum Beispiel bin ich mir nicht sicher, warum im oberen Teil des Codes, wenn ich die letzte Zeile mit der #property-Direktive deklariere, der Index 4 und nicht 5 sein sollte, da 4 Puffer bereits vorher verwendet wurden. Gibt es überhaupt eine Beziehung zwischen Zeilennummerierung bei der Deklaration mit #property und Puffer Nummerierung bei der Verknüpfung mit Arrays in OnInit?

Bitte teilen Sie mir mit, was an dem obigen Code falsch ist. Vielleicht kann jemand ein Beispiel für einen Indikator finden, bei dem mindestens zwei Linien mit der Zeichenmethode DRAW_COLOR_LINE.... gezeichnet werden

Eine weitere Frage in diesem Zusammenhang: Wie werden die bunten Linienpuffer miteinander verbunden? Ich meine, woher weiß der kompilierte Code, dass, wenn ich einen Wert in einen Farbpuffer eintrage, diese Farbe zum Einfärben einer Linie aus einem anderen Puffer verwendet werden soll?

Mappings werden anders nummeriert als Puffer.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

Das sollte funktionieren.

 

Guten Tag zusammen!

Ich habe eine Funktion zur Änderung des Stoploss erstellt. Aber wenn es funktioniert, gibt es EURUSD,H1: OrderModify Fehler 130.

Und der Preis ist weit von dem Ort entfernt, an dem der Stoploss gesetzt werden sollte.

Hier ist die Funktion:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Guten Tag. Ich möchte einen EA schreiben, der auf der Messung des Neigungswinkels eines gleitenden Durchschnitts (oder besser einer Reihe von ihnen, nämlich dem Alligator) basiert, so dass der EA bei einem starken Preisimpuls einen Alarm auslösen würde, vorzugsweise mit einer kleinen Verzögerung. Bitte geben Sie Hinweise, wie Sie den Winkel des MA messen oder dem EA mitteilen können, dass der Impuls aufgetreten ist. Vielleicht gibt es bereits bekannte Möglichkeiten, dies zu tun. Oder zum Beispiel ein freier Indikator, der auf der Berechnung von Impulsen basiert?
 

Ich habe eine Funktion geschrieben, um die Balkenanzahl eines Fraktals aus 3 Balken zu ermitteln. Auf der Online-Karte scheint es richtig zu sein. Aber bei der visuellen Prüfung im Prüfgerät liegt sie. Kann einer der Fachleute einen Blick auf den Code werfen und einige Fehler finden?

Ich wäre Ihnen sehr dankbar.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Guten Tag. WELCHEN CODE MUSS ICH HINZUFÜGEN, DAMIT DER INDIKATOR IM TESTER NACH EINEM MONAT NICHT MEHR FUNKTIONIERT? D.H. ICH HABE ALLES RICHTIG GESCHRIEBEN! ABER WENN ICH EINEN BACKTEST MACHE, FUNKTIONIERT ES WIEDER. (mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
Dateien:
 

Hallo!

Ich wollte eine Bedingung in den Auftragsschließungszyklus amTag der Auftragseröffnung einfügen, damitdie Aufträge, die am Freitag geöffnet wurden, nicht geschlossen werden.

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Guten Tag. WELCHEN CODE SOLLTE ICH HINZUFÜGEN, DAMIT DER INDIKATOR IM TESTER NACH EINEM MONAT NICHT MEHR FUNKTIONIERT? D.H. ICH HABE ALLES RICHTIG GESCHRIEBEN! ABER WENN ICH EINEN BACKTEST MACHE, FUNKTIONIERT ES WIEDER. (mgl4)

Sie müssen diesen Code nicht in OnInit, sondern in OnTick() schreiben.

 
Yerkin Sagandykov:

Hallo!

Ich wollte eine Bedingung in den Auftragsschließungszyklus am Tag derAuftragseröffnung aufnehmen, damit die am Freitag eröffneten Aufträge nicht geschlossen werden.

Versuchen Sie es auf diese Weise:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 

Grund der Beschwerde: