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

 
Roman Sharanov:

Ich habe auch einen schwerwiegenden Nachteil gefunden: zu viele Aufrufe von CopyClose()

Können Sie mir sagen, wie ich Kurse aus einem Array von Währungspaaren in eine Schleife kopieren kann?

Das scheint ein doppeltes Array zu sein, deshalb unterstützt MQL es nicht, wie %.

MQL4 scheint mit zweidimensionalen dynamischen Arrays zu arbeiten. Sie können die erste Dimension mit ArayResize() ändern und die zweite Dimension anCopyClose() übergeben

Oder eine universelle Lösung von den Entwicklern, da zweidimensionale dynamische Arrays nicht in MQL5 funktionieren, wickeln Sie ein eindimensionales Array in eine Struktur und erstellen Sie ein Array solcher Strukturen.... Wenn Sie den Dreh raus haben, denken Sie daran, dass Sie fast eine Klasse erstellt haben, und das ist optimal - eine Klasse mit Methoden, die die Daten laden und in den Klasseneigenschaften (Feldern) speichern
 
Igor Makanu:

MQL4 scheint mit zweidimensionalen dynamischen Arrays zu arbeiten, verwenden Sie ArayResize() um die erste Dimension zu ändern undCopyClose() um die zweite zu ändern.

oder eine universelle Lösung von den Entwicklern, da 2-dimensionale dynamische Arrays in MQL5 nicht funktionieren, wickeln Sie ein eindimensionales Array in eine Struktur ein und erstellen Sie ein Array aus solchen Strukturen.... Wenn Sie den Dreh raus haben, denken Sie daran, dass Sie fast eine Klasse erstellt haben, und das ist optimal - eine Klasse mit der Methode, die die Daten selbst lädt und sie in den Klasseneigenschaften (Feldern) speichert

Danke und ich werde es versuchen

 

Noch eine Frage zum Indikator, ich weiß nicht, was ich sonst tun soll

Ich muss die Differenz zwischen den Schlusskursen der eingegebenen Paare und dem gleitenden Durchschnitt dieser Paare drucken.

Ich weiß nicht, was ich sonst tun soll.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD";
input string active_2 = "USDJPY";
input ENUM_TIMEFRAMES timeframe = PERIOD_H1;
input int ma_period = 30;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, dataBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, maBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---

   CopyClose(active_1,timeframe,0,rates_total,firstBuffer);
   CopyClose(active_2,timeframe,0,rates_total,secondBuffer);

   int first, bar;
   if(prev_calculated == 0) first = begin; else first = prev_calculated - 1;

   for(bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Die Aufträge sollten in einer Schleife aufgezählt werden, nicht bei jedem Tick... Um genau zu sein, ist ein Tick gekommen und alle Ihre Aufträge wurden in der Schleife gezählt: for(j=0;j<OrderTotal;j++)

OrdersTotal() zeigt an, wie viele Orders offen sind (einschließlich schwebender Orders, einschließlich Orders für alle Symbole... insgesamt... Hier sehen Sie, wie viele Aufträge im Terminal geöffnet sind - hier sehen Sie, wie viele )))).

Die Auftragsnummerierung ist wie in den Arrays, von 0 bis OrdersTotal()-1 - dies ist der letzte Auftrag, und Sie haben wahrscheinlich eine nicht existierende Ticketnummer [OrdersTotal()] oder eine andere Information im Journal bei jedem Tick, die schwer zu erraten ist.

Ja - und ich möchte, dass sie alle Bestellungen durchläuft. Die Funktion war anfangs etwas anders, aber ich habe sie so weit wie möglich vereinfacht, in der Hoffnung, die Ursache zu finden und zu beheben. Ein vollständiges konsekutives Retracement findet nur statt, wenn die Ticks selten sind oder wenn ich den EA aus dem Chart entferne und keine neuen Ticks eintreffen.

Ich dachte immer, wenn der EA in den Körper einer Funktion eingetreten ist, sollte er nicht auf andere Ticks reagieren, bis er die Schleife verlässt, aber es scheint, dass dies nicht der Fall ist. Wie lässt sich diese Situation vermeiden?

int test()
{
int gesamt;
total = OrdersTotal();
log("Summe = " + Summe +"; ");

for (int j = 0; j < gesamt; j++)
{
log("j = " + j +"; ");
}
zurück(0);
}

 
Андрей:
Warum brauchen wir überhaupt Informationen zu allen Aufträgen und zu jedem Tick? Wäre es nicht besser, Einschränkungen für die Reihenfolge der Anzeige einzuführen, z. B. jede neue Minute, fünf Minuten, ..., Stunde?

Das Problem ist nicht einmal, dass ich Informationen für jeden Tick benötige, sondern dass, wenn ich es richtig verstehe, die Schleife keine Zeit hat, zu enden, bevor ein neuer Tick eintrifft und der neue Tick irgendwie das Konto unterbricht. Hier ist ein weiterer Screenshot, so dass Sie nicht nach dem vorherigen suchen müssen. Es zeigt, dass der EA bis 52 gezählt hat und dann auf 93 gesprungen ist. Ich hatte eine harte Zeit zu glauben, dass dies wegen der neuen Ticks, aber ich kann nicht finden, einen anderen Grund, denn wenn die Ticks sind selten, das Konto beendet gut, sowie den letzten Zyklus nach dem EA wurde aus dem Diagramm entfernt.

Ich habe den Code bereits so weit wie möglich vereinfacht:

int test()
{
int gesamt;
total = OrdersTotal();
log("Gesamt = " + Gesamt +"; ");

for (int j = 0; j < gesamt; j++)
{
log("j = " + j +"; ");
}
zurück(0);
}

Dateien:
test.jpg  82 kb
 
Artyom Trishkin:

Woher wissen Sie das? Das ist nicht der Fall.

Bis alle Berechnungen, die mit dem Eintreffen des Ticks begonnen haben, abgeschlossen sind, werden alle nachfolgenden Ticks übersprungen.

Wie ich gerade oben geschrieben habe, habe ich die gleiche Situation, nur habe ich sie schon etwas vereinfacht und bin zu dem Schluss gekommen, dass ich nicht nur normalerweise keine Berechnungen durchführen kann, sondern einfach die Aufträge einen nach dem anderen durchgehen und ihre Nummern im Protokoll ausdrucken kann.

Auch ich habe immer geglaubt, dass "bis alle Berechnungen, die mit dem Eintreffen eines Ticks begonnen haben, abgeschlossen sind, alle nachfolgenden Ticks übersprungen werden". Ich wünschte, es wäre so, aber ich kann bisher keinen anderen Grund finden, außer neuen Zecken.

 
Artyom Trishkin:

Ohne den Code kann niemand etwas sagen.

Hier ist ein extrem vereinfachter Code, der das gleiche Problem hat - neue Ticks werfen die aufeinanderfolgende Ausgabe von Ordnungszahlen um.

int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

 
Algotrader18:

Hier ist ein extrem vereinfachter Code, der das gleiche Problem hat - neue Ticks bringen die sequentielle Ausgabe von Ordnungszahlen durcheinander.

int test()
{
int gesamt;
total = OrdersTotal();
log("Summe = " + Summe +"; ");

for (int j = 0; j < gesamt; j++)
{
log("j = " + j +"; ");
}
zurück(0);
}

Lässt sich dieser Code wirklich ohne Fehler kompilieren? Ich kann es nicht glauben...
 
Roman Sharanov:

Noch eine Frage zum Indikator, ich weiß nicht, was ich sonst tun soll

Ich muss die Differenz zwischen den Schlusskursen der eingegebenen Paare und dem gleitenden Durchschnitt dieser Paare drucken.

Letztendlich zeigt es nur den Unterschied ohne MA an, wo liegt das Problem?

Das ist cool!

Roman!

Ich zum Beispiel bin ein erfolgreicher Händler mit 20 Jahren Erfahrung.

Ich verstehe nicht, warum Sie "die Differenz zwischen den Schlusskursen der eingegebenen Paare undeinem gleitenden Durchschnitt dieser Paare" benötigen.

Und wissen Sie, wie man einen gleitenden Durchschnitt aus diesen Differenzen bildet? - Fantastisch!

Können Sie einfach den gleitenden Durchschnitt der Notierungen zeichnen? - Auch nicht?

Wo liegt also das Problem?

 
Algotrader18:

Hier ist ein extrem vereinfachter Code, der das gleiche Problem hat - neue Ticks bringen die sequentielle Ausgabe von Ordnungszahlen durcheinander.

int test()
{
int gesamt;
total = OrdersTotal();
log("Summe = " + Summe +"; ");

for (int j = 0; j < gesamt; j++)
{
log("j = " + j +"; ");
}
zurück(0);
}

dieser Code funktioniert, machen Sie es analog:

int NumberOfOrders(int magic_)
  {
   int i,res=0,k=OrdersTotal(); string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++;
        }
     }
   return(res);
  }
Grund der Beschwerde: