Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 763

 
Vitaly Muzichenko:

Es scheint so in Zyklen, und Sie können auf die Funktion verzichten

Ich danke Ihnen.

Allerdings entfernt die Funktion - die Bremsen bleiben.... verdammt.

 
Aleksey Vyazmikin:

Danke.

Allerdings entfernt die Funktion - die Bremsen bleiben.... Verdammt!

Ich habe einmal angefangen, das Programm von 4=>5 umzuschreiben, dann habe ich in 4 alle Konstruktionen wie Low[1], Time[0] und andere durch moderne ersetzt, d.h.CopyLow,CopyTime, das Programm wurde sogar in 4 schneller. Ich verwende keine alten Konstrukte mehr, sondern nur noch neue. Der Code ist also leicht auf die 5. Plattform übertragbar, Sie müssen nur die Handelsfunktionen ändern

 
Vitaly Muzichenko:

Als ich anfing, das Programm von 4=>5 umzuschreiben und dann alle Konstruktionen wie Low[1], Time[0] und andere durch moderne ersetzte, d.h.CopyLow,CopyTime, wurde das Programm sogar in 4 schneller. Ich verwende keine alten Konstrukte mehr, sondern nur noch neue. Der Code ist also leicht auf die 5. Plattform übertragbar, Sie müssen nur die Handelsfunktionen ändern

Ist dasFüllen des Feldes bei jedem Niesen nicht ein Ressourcenverbrauch?

Vielleicht ist es sinnvoll, die Informationen beim Öffnen des Balkens in das Array zu kopieren und sie dann von dort zu übernehmen, während sich der Code entfaltet? Ich handele bei der Bareröffnung.


 
Aleksey Vyazmikin:

Verbraucht dasFüllen eines Arrays bei jedem Niesen nicht Ressourcen?

Vielleicht ist es sinnvoll, die Informationen in ein Array zu kopieren, wenn sich ein Balken öffnet, und sie dann von dort zu übernehmen, wenn der Code fortschreitet? Ich handele bei der Bareröffnung.

Das Array kann mit einem neuen Balken gefüllt werden, was weniger Ressourcen verbraucht. Wenn Sie an mehreren Stellen mit iLow[1] arbeiten, sollten Sie es einmal in einer Variablen speichern und diese anstelle des Arrays lesen.

Angenommen, dies

// Инициализация TIME[0] TIME[1]
  ArraySetAsSeries(TM,true);
  if(CopyTime(dSymbol,Period(),0,2,TM)<0) return;
  TIME_0=TM[0];
  TIME_1=TM[1];
Dann arbeiten wir mit den VariablenTIME_0 undTIME_1 anstelle vonTM[0] undTM[1].
 
Vitaly Muzichenko:

Array kann auf einer neuen Leiste gefüllt werden, es wird weniger Ressourcen benötigen. Wenn Sie z. B. an mehreren Stellen mit iLow[1] arbeiten, ist es wünschenswert, es einmal in eine Variable zu schreiben und die Variable statt des Arrays zu lesen.

Angenommen so

Aber trotzdem ist MT4 viel schneller - ich bin enttäuscht.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Aleksey Vyazmikin, 2017.07.21 15:07

Warum phantasieren Sie? Ich habe Ihre Idee verstanden und bestätigt, dass sie funktioniert und Wirkung zeigt, wenn die Anfrage einmal gestellt wird und bekannt ist, wie viele Balken für den EA benötigt werden, um zu funktionieren.

Oder haben Sie vielleicht vorgeschlagen, die Struktur anders zu verwenden? Dann erklären Sie es bitte, aber seien Sie nicht beleidigt!


Keine Hirngespinste. Wenn Sie 2 oder mehr Parameter eines Candlesticks benötigen, müssen wir die Funktionen aus Ihren Nachrichten/Fragen für jeden Parameter des Candlesticks einzeln aufrufen. Das sind 2 oder mehr Aufrufe von Copy***(), aber mit CopyRates() brauchen Sie nur einen Aufruf von Copy.

Die Frage nach der zu kopierenden Anzahl ist eine andere. Vielleicht sollten wir zuerst den Balken berechnen, der den gewünschten Indikatorwert enthält, und ihn dann kopieren. Wenn ich mich richtig erinnere, sprachen wir von einer unbekannten Größe, die es zu kopieren galt. Von welcher Art von Fantasie reden wir?

Im Extremfall können wir z. B. 10 Takte kopieren und unter ihnen suchen. Wenn wir sie nicht finden, kopieren wir weitere 10 Takte. Kopieren ist ein zeitaufwändiger Vorgang, es ist billiger, ein Array zu kopieren.

Im Allgemeinen gibt es eine Vielzahl von Varianten. Das kann man nicht alles in die Dokumentation schreiben, dann wäre es gar keine Dokumentation mehr. Das wird im Programmierunterricht gelehrt. Aber leider sind nicht alle Lehrer dazu in der Lage, und nicht alle Schüler wollen es im Unterricht verstehen. Und ganz am Anfang steht der Rechenunterricht in den Klassen 2-5, wenn der Lehrer eine ausführliche Erklärung der Aufgabe verlangt. Aber hier sind die Probleme die gleichen.

 
Alexey Viktorov:

Keine ausgefallenen Sachen. Wenn Sie 2 oder mehr Parameter eines Candlesticks benötigen, sollten Sie diese Funktionen mit Hilfe von Funktionen aus Ihren Nachrichten/Fragen für jeden Candlestick-Parameter separat aufrufen. Das bedeutet, dass Copy***() 2 oder mehr Mal ausgeführt werden muss, während bei Verwendung von CopyRates() nur ein Aufruf von Copy erforderlich ist.

Die Frage nach der zu kopierenden Anzahl ist eine andere. Vielleicht sollten wir zuerst berechnen, auf welchem Balken der gewünschte Wert des Indikators vorhanden ist, und ihn dann kopieren. Wenn ich mich richtig erinnere, war die Rede von einer unbekannten Größe, die es zu kopieren galt. Von welcher Art von Fantasie reden wir?

Und als letzten Ausweg können wir z. B. 10 Takte kopieren und sie durchsuchen, und wenn wir sie nicht finden, kopieren wir weitere 10 Takte. Das Kopieren ist ein ziemlich teurer Vorgang; es wäre billiger, das Array zu durchsuchen.

In diesem Fall gibt es eine Vielzahl von Varianten. All dies kann nicht in die Dokumentation aufgenommen werden; eigentlich wird es keine Dokumentation mehr sein. Das wird im Programmierunterricht gelehrt. Aber leider wissen nicht alle Lehrer, wie man es macht, und nicht alle Schüler wollen es im Unterricht verstehen. Und ganz am Anfang steht der Rechenunterricht in den Klassen 2-5, wenn der Lehrer eine ausführliche Erklärung der Aufgabe verlangt. Aber hier sind die Probleme die gleichen.

Über Fantasie - war eine Antwort auf Ihre Aussage "Anstatt zu versuchen zu verstehen, was gesagt wurde, um herauszufinden, was Sie bekommen, machen Sie einige unglaubliche Einwände", und nicht auf die Tatsache, dass die von Ihnen angebotene Version aus dem Bereich der Fantasie ist.

Ich verstehe Ihr Konzept sehr gut, und es war in der Antwort an Sie enthalten.

Allerdings verstehe ich nicht ganz, wie Sie vorschlagen, mit unbekannten Datenmengen zu arbeiten - können Sie mir ein Beispiel in Form von Code geben?


 

Bitte helfen Sie bei der Überprüfung und Optimierung des Indikators mit diesem Link https://www.mql5.com/ru/code/16805 - das Problem ist, dass der Indikator beginnt zu verlangsamen eine Menge, wenn eine große Anzahl von Bars erscheinen - es zeigt sich beim Testen.

Ich möchte wissen, wie es funktioniert, so dass es nicht bei jedem Tick berechnet wird, sondern nur beim Öffnen des Balkens? Die Methode aus dem Expert Advisor ist nicht geeignet - nach dem ersten Tick verschwinden alle Werte und erscheinen erst im nächsten Takt...

Donchian Channel MTF
Donchian Channel MTF
  • Stimmen: 13
  • 2016.12.13
  • Mladen Rakic
  • www.mql5.com
Мультитаймфреймовая версия канала Дончиана.
 
Aleksey Vyazmikin:

Was die Fantasie betrifft, so war dies eine Antwort auf Ihre Aussage "Anstatt zu versuchen, zu verstehen, was gesagt wird, um zu verstehen, was funktionieren wird, werden unglaubliche Einwände vorgebracht", und nicht, dass die von Ihnen vorgeschlagene Option aus dem Reich der Fantasie stammt.

Ich verstehe Ihr Konzept sehr gut, und es war in der Antwort an Sie enthalten.

Ich verstehe jedoch nicht ganz, wie Sie mit einer unbekannten Datenmenge umgehen wollen - können Sie mir ein Beispiel in Form von Code geben?


Die Antwort wurde vorher gegeben...

Alexey Viktorov:

Als letzten Ausweg können Sie z. B. 10 Takte auf einmal kopieren und unter ihnen suchen; wenn Sie sie nicht finden, kopieren Sie 10 weitere. Das Kopieren ist ein kostspieliger Vorgang, es ist billiger, das Feld zu durchsuchen.

Aber wir sollten nicht versuchen, die maximale Anzahl von Balken aus dem Array zu holen, sondern versuchen, mit einer Kopie auszukommen.

Ich werde kein Codebeispiel schreiben. Ein normaler Programmierer braucht nur einen Hinweis. Hier ist ein Beispielalgorithmus:

  1. Bestimmen Sie die ungefähre Anzahl der Balken, an denen der Kanal gekreuzt wird. Es sollen 15 sein.
  2. Kopieren Sie beide Puffer des Indikators.
  3. Kopieren der Werte von Balken mit CopyRates()
  4. In der Schleife beginnen wir mit dem Vergleich der Werte der oberen Grenze des Kanals und der hohen Balken, während wir gleichzeitig die niedrigen Balken mit der unteren Grenze des Kanals vergleichen. Wird eine dieser Überschneidungen gefunden, wird der Balkenindex in einer Variablen gespeichert, und es wird weiter nach der zweiten Überschneidung gesucht. Wir verlassen die Schleife, wenn beide Variablen der Kreuzungsbalken Werte haben.

Auf diese Weise ist es möglich, zwei Schnittpunkte in einer Kopie und einem Zyklus zu finden, falls erforderlich. Es gibt sogar keine Notwendigkeit in ArraySetAsSeries(), weil bei der Suche nach der Kreuzung ist es möglich und meiner Meinung nach besser, die Zeit der Bar, nicht seine Nummer zu erinnern. Wenn man die Zeit der Bar kennt, ist es nicht schwer, ihre Anzahl zu bestimmen.

Frage: Was ist schneller, ein Zyklus mit Kopieren des Indikatorpuffers um 1 Wert und Kopieren des oberen Balkens um 1 und Vergleichen dieser Werte oder ein einzelnes Kopieren eines bestimmten Betrags und Vergleichen der Werte der beiden Arrays miteinander?

 

Ich habe das erst gestern geschrieben:

Aufgabe:

bei jedem Tick die "InpCountCopy"-Elemente open, high, low, close und time.

Umsetzung:

  1. Schleife von "0" bis "InpCountCopy-1" - die Schleife erfasst jeweils ein Open, High, Low, Close und eine Zeit.
  2. Zu einem Zeitpunkt erhalten wir "InpCountCopy"-Elemente in die MqlRates-Struktur und durchlaufen dann eine Schleife durch die Struktur.

Merkmale:

Sie können wählen, wie die Prüfung erfolgen soll: in OnTick oder in OnTimer (1 Sekunde).

//+------------------------------------------------------------------+
//|                                      Copy OHLC vc Copy Rates.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.001"
//--- input parameter
input int InpCountCopy=1000;
input bool OnTickOnTimer=false; // OnTickOnTimer: false -> OnTick, true -> OnTimer 1 second
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(OnTickOnTimer)
      EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(!OnTickOnTimer)
      return;
   Testing();
  }
//+------------------------------------------------------------------+
//| Main function                                                    |
//+------------------------------------------------------------------+
void Testing()
  {
//--- for once one element
   ulong start=GetMicrosecondCount();
   for(int i=0;i<InpCountCopy;i++) // in one operation we get one element.
     {
      double open=iOpen(i);
      double high=iHigh(i);
      double low=iLow(i);
      double close=iClose(i);
      datetime time=iTime(i);
     }
   ulong end=GetMicrosecondCount()-start;
   string text=(OnTickOnTimer)?"OnTimer":"OnTick";
   text=text+"\n"+"OHLC: "+IntegerToString(end);

//--- for one operation we get "InpCountCopy" elements.
   start=GetMicrosecondCount();
   MqlRates Rates[];
   if(!iRates(Rates,0,InpCountCopy))
      return;
   for(int i=0;i<InpCountCopy;i++)
     {
      double open=Rates[i].open;
      double high=Rates[i].high;
      double low=Rates[i].low;
      double close=Rates[i].close;
      datetime time=Rates[i].time;
     }
   end=GetMicrosecondCount()-start;
   text=text+"\n"+"Rates: "+IntegerToString(end);

   Comment(text);
  }
//+------------------------------------------------------------------+ 
//| Get Open for specified bar index                                 | 
//+------------------------------------------------------------------+ 
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[1];
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied==1)
      open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Get the High for specified bar index                             | 
//+------------------------------------------------------------------+ 
double iHigh(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double High[1];
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,High);
   if(copied==1)
      high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Get Low for specified bar index                                  | 
//+------------------------------------------------------------------+ 
double iLow(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Low[1];
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,Low);
   if(copied==1)
      low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Get Close for specified bar index                                | 
//+------------------------------------------------------------------+ 
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied==1)
      close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0;
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied==1)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+ 
//| Get Rates for specified bar index                                | 
//+------------------------------------------------------------------+ 
bool iRates(MqlRates  &Rates[],const int index,int count,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   int copied=CopyRates(symbol,timeframe,index,count,Rates);
   if(copied!=count)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+


Dateien:
Grund der Beschwerde: