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

 
Alexey Viktorov:
Setzen Sie die Anzeigefarbe auf clrNONE.

Sie können also nur den Puffer ausgeben, aber nicht die Variable selbst?

 
psyman:

Sie können also nur den Puffer ausgeben, aber nicht die Variable selbst?

Ja, das ist der einzige Weg. Und noch ein Trick, der sich als nützlich erweisen kann: Wenn Sie SetIndexLabel(0, ""); einstellen, werden diese Werte nicht im Datenfenster angezeigt. Auch die Funktion iCustom() wird nicht verfügbar sein.
 
Igor Makanu:

Ich danke Ihnen für Ihre Antwort.

Was ich also verstehe, ist, einen Puffer zu erstellen und diesen dann mit

mit RSI-Werten und füttern diesen Puffer dann mitiMAOnArray().

Hat jemand dies für EA getan und es wird angezeigt, wenn EA im Unterfenster getestet wird?

Normalerweise sind EA-Tests über iCustom träge.

 

Ich habe den Code aus dem Beispiel in https://www.mql5.com/ru/docs/strings/stringadd übernommen und in das Skript eingefügt. Das Ergebnis ist in MQL4 und MQL5 das gleiche:


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


Ich dachte, StringAdd() und StringConcatenate() sollten schneller laufen als "+". Warum ist das nicht so?

 
Northwest:

iCustom verlangsamt normalerweise die Tests des Expert Advisors.

es ist nicht wahr, in der Regel ist es umgekehrt, weil die Zuweisung von Speicher für den Indikator Puffer durch das Terminal, nicht durch die MQL-Skript getan wird, in der Regel sind diese Probleme das Problem der nicht-optimale Berechnung in den Indikator, viele Neulinge auf einen Indikator aufrufen - tick, berechnen die gesamte Länge der historischen Daten

Wenn Sie die Grundlagen von MQL verstanden haben, lesen Sie die Artikel, es ist alles geschrieben.

https://www.mql5.com/ru/articles/4602


Nordwesten:

Wer hat dies für einen EA getan und es wird beim Testen des EA in einem Unterfenster angezeigt?

niemand hat, lesen Sie, was ist der Unterschied zwischen einem EA und ein Indikator, der Indikator Puffer hat und wer nicht, wer hat Handelsfunktionen und wer nicht....

ZZY: Ein Unterfenster kann nur einen Indikator erstellen. Wenn Sie ein Unterfenster erstellen, dann können Sie diesem Unterfenster grafische Objekte hinzufügen, indem Sie den Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object verwenden.

ZSYZZ: subwindow kann durch Anwendung einer Vorlage erhalten werden, gab es ein Thema vor ein paar Monaten, aber ich denke, Sie haben ein Problem mit anderen Dingen so weit

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

es ist nicht wahr, in der Regel ist es umgekehrt, weil die Zuteilung von Speicher für Indikator-Puffer wird durch das Terminal, nicht durch die MQL-Skript, in der Regel diese Probleme sind das Problem der nicht-optimale Berechnung in den Indikator, viele Neulinge auf einen Indikator aufrufen - tick, berechnen sie die gesamte Länge der historischen Daten

Wenn Sie die Grundlagen von MQL verstanden haben, lesen Sie die Artikel, die schon seit langem geschrieben wurden.

https://www.mql5.com/ru/articles/4602


niemand hat gelesen, was der Unterschied zwischen einem Expert Advisor und einem Indikator ist, wer Indikatorpuffer hat und wer nicht, wer Handelsfunktionen hat und wer nicht ....

ZZY: ein Unterfenster kann nur einen Indikator erstellen, wenn Sie ein Unterfenster erstellen, dann können Sie diesem Unterfenster grafische Objekte hinzufügen, indem Sie den Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object verwenden.

ZSYZZ: subwindow kann durch die Anwendung einer Vorlage erhalten werden, war ein Thema vor ein paar Monaten, aber ich denke, Sie haben ein Problem mit etwas anderes so weit

Entschuldigung. Vielleicht habe ich es nicht richtig ausgedrückt, aber

Ich möchte es nicht zu Testzwecken verwenden, aber ich möchte es auch nicht ausführen.

Was die Visualisierung auf dem Indikatordiagramm während des Testens betrifft, so können Sie mit

Wenn Sie Inline-Indikatorfunktionen verwenden, werden diese während des Testprozesses auf dem Diagramm gezeichnet

Das ist genau das, was ich meine.

Aber wenn Sie eine Art benutzerdefinierten Code der Indikatorberechnung verwenden, der in den Code des EA integriert ist, dann wird dieser Indikator

wird während der Prüfung des EA nicht angezeigt.

Wie für iCustom, wenn Sie es in den Prozess der Prüfung der EA wird auf dem Chart angezeigt werden

jeder Indikator und der Code des Indikators kann mit dem EA in eine ex4 kompiliert werden, aber ich brauche es nicht.

Ich wollte nur wissen, ob es eine Möglichkeit gibt, iCustom in dieser Angelegenheit zu umgehen, aber wenn nicht, ist es auch kein Problem.

Vielen Dank für die ausführliche Antwort.

 

Artem hat hier eine Indikatorvorlage gepostet, hier ist der Teil vonOnCalculate

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

Ich benutze es, aber ich habe eine Frage)

Warum verwende ichlimit=rates_total-1 für die Berechnung des gesamten Verlaufs undnichtlimit=rates_total?

 
psyman:

Warum wirdlimit=rates_total-1 für die Berechnung des gesamten Verlaufs verwendet undnichtlimit=rates_total?

Versuchen Sie es zu überprüfen, werden Sie sofort "out of range " - Nummerierung der Balken von Null bis ... Total -1 , eine häufige Situation in der Programmierung - die Nummerierung beginnt mit 0. Als offensichtliches Beispiel deklarieren Sie array double x[5] und versuchen, etwas in das letzte Element x[5] = 100 zu schreiben;

ZS: Antwort auf die Frage, die Sie noch nicht gestellt haben.... OrderTotal() zählt auch Zahlen von Null bis OrderTotal()-1 ;)

 
Igor Makanu:

ZS: Beantwortung einer Frage, die noch nicht gestellt wurde.... OrderTotal() zu Nummerierung von Null bis OrderTotal()-1 ;)

Die Frage stellte sich übrigens, jetzt kann ich keine Mittelwertbildung auf dem Feld gewinnen, obwohl ich in fünf, aber in welchem Thema zu schreiben, weiß ich nicht, lassen Sie es hier sein.

Der Indikator berechnet die Offen-Schließ-Differenz und baut МА darauf auf. Ich habe MA=2 für die Fehlersuche gewählt, aber bei der Verwendung von SimpleMAOnBuffer und iMAOnArray erhalte ich unerklärliche Zeilenverschiebungen und iMAOnArray zeigt einen Nullwert für den letzten Balken.


//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   IndicatorSetString(INDICATOR_SHORTNAME,"t1");
   
   SetIndexBuffer(0,OC,INDICATOR_DATA);
   SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(2, MA1_buf,INDICATOR_DATA); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total-1;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     
     OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
     if(OC[i]>0.001)
      {   OC_color[i]=1;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);

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




double iMAOnArray(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift)
  {
   double buf[],arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=array[pos+1];
            buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
 
psyman:

Ich habe eine verwandte Frage, ich kämpfe immer noch mit der Array-Mittelwertbildung, obwohl ich es in 5 mache, aber ich weiß nicht, in welchem Fach ich es schreiben soll, sei es hier.

Ich habe das Gefühl, dass in MQL5 die Indikatorpuffer und Zeitreihen auf entgegengesetzte Weise "aufgefaltet" werden. Standardmäßig ist der äußerste linke Balken in MT5 der Balken 0 und in MT4 ist der äußerste rechte Balken der Balken 0 und die Indikatorpuffer haben die gleiche Nummerierung.

ZS: ich will mich leider nicht mit MT5 beschäftigen, MT4 reicht mir, um meine Ideen zu überprüfen, ich schaue mir nur die Vorbereitungen in MT5 an, wenn ich etwas mit MT5 schreibe, zeige ich es nie jemandem )))