Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 115

 

Leute, ich habe eine Frage - wie kann ich Variablenwerte in ein eindimensionales Array einfügen?

Schicken Sie es nicht zur Hilfe - es gibt KEIN Beispiel für ein solches Problem.


Angenommen, es gibt eine Variable a, die sich unter bestimmten Bedingungen ändert.

Ich möchte ein Array zum Speichern der letzten 3 Werte dieser Variablen. Wie wird dies in mql4 umgesetzt?


Ich schreibe int mas[3];

mas[]=a; innerhalb der Schleife, nach einer Bedingung, die a ändert,

Der Compiler gibt ']' aus, aber nichts funktioniert, obwohl es logischerweise sollte. - Ausdruck erwartet, will er, dass ich einen unbekannten Ausdruck innerhalb von Klammern in mas[]=a einfüge.

Hat MQL4 jede Funktion, die das Array mit einem variablen Wert bei jeder Schleifeniteration füllt?


 
Igor Makanu:

Ich entschuldige mich dafür, dass ich den Anfang der Korrespondenz nicht gefunden habe, aber ich möchte sofort raten, komplexe Bedingungen und Berechnungen darin zu vermeiden - das macht den Code unleserlich und erschwert folglich die Suche nach logischen Fehlern, ich würde Ihren Code so schreiben:

Wenn Sie verstehen, was ich meine, können Sie den Code, den ich Ihnen gegeben habe, noch ein wenig abändern, d. h. in eine separate Bedingung einfügenif(OrderType()==OP_BUY....

Dann wird es viel einfacher sein, logische Fehler zu finden, imho

Nach jedem OrderSend einfügen => return

oder eine Auswahl über den Schalter treffen:

switch ( OrderType() )
{ OP_BUY : { if (1) { .... break; }
             if (2) { .... break; }
           }
  OP_SELL : { if (3) { .... break; }
              if (4) { .... break; }
            }
}
 
Vladimir Tkach:

Ich habe es versucht, aber es funktioniert nicht.

Sie haben nur wenige Eingabeparameter in Ihrem benutzerdefinierten Indikatoraufruf - wie vieleexterne Variablen enthält der Morning Flat Indikator? (extern) - so viele Parameter sollten Sie bei der Verwendung von iCustom übergeben

 
John Smith:
.....

Ich schreibe int mas[3]=a; innerhalb der Schleife nach der Bedingung, wenn sich a ändert,

aber nichts funktioniert, obwohl es logischerweise sollte.

Lernen Sie, alle Aktionen Schritt für Schritt und nicht alle auf einmal durchzuführen.

Beispiel:

int mas[3]={0}; // инициализация масива 

.....           // основной код
if ( найдена новая величина а )
{ mas[2]=mas[1];  // самая старая величина а
  mas[1]=mas[0];
  mas[0]=a;       // новая величина а
}
.....           // основной код
 
Igor Makanu:

Sie haben nur wenige Eingabeparameter in Ihrem benutzerdefinierten Indikatoraufruf - wie vieleexterne Variablen enthält der Morning Flat Indikator? (extern) - so viele Parameter sollten Sie bei der Verwendung von iCustom übergeben

Ich habe sie bereits alle ausprobiert.

Ich habe das Problem auf andere Weise gelöst. Ich habe den Preisberechnungscode des Indikators in meinen Expert Advisor eingefügt.

 
Igor Makanu:

Die Logik des Codes ist die gleiche, aber wenn Sie die Bedingungen aufteilen, ist es schneller zu finden, wo der logische Fehler ist, und in Ihrem Fall, wenn Sie es in einer separaten Bedingung setzen, erhalten Sie eine Optimierung - die Bedingung wird einmal und nicht viermal überprüft werden:

in eine separate Bedingung umwandeln, wird der Code optimiert - die Bedingung wird nur einmal geprüft und nicht viermal wie in Ihrem Beispiel.

Überprüfen Sie die Ausgabe im Journal des Expert Advisors mit Hilfe der Funktion

für die Protokollierung, so dass Sie sehen können, welches Codefragment mit welchen Parametern ausgeführt wurde

Ich danke Ihnen für Ihre Antwort. Teilen Sie die Bedingungen bis zum Äußersten auf. Die Logik wurde mit Kommentaren überprüft. Es stellte sich heraus, dass die Positionsschließung auf den Bedingungen der ersten offenen Position basiert. Das bedeutet, dass, wenn wir zuerst eine Kauf- oder Verkaufsposition mit Bedingung 1 eröffnet haben und dann eine zweite Position mit der gleichen Bedingung, aber mit Bedingung 2 eröffnet haben, diese Schließungsbedingung ignoriert wird und die zweite Position ebenfalls mit Bedingung 1 geschlossen wird, unabhängig von der anderen magischen Zahl. Was sollte ich tun?

 
Vladimir Tkach:

Ich bin sie bereits alle durchgegangen.

Ich habe das Problem auf eine andere Weise gelöst. Ich habe den Code der Preisberechnung vom Indikator in den Expert Advisor eingefügt.

Mir ist aufgefallen, dass iCustom() nicht korrekt aufgerufen wurde, so sollte es sein:

min=iCustom(Symbol(),0,"Morning Flat",StartHour,EndHour,TargetLevel,UpColor,DnColor,TargetUpColor,TargetDnColor,1,0);

Ich übergebe beim Aufruf des Indikators 7 Parameter, Sie haben ihn mit 3 Parametern aufgerufen

Ich würde den Aufruf des Indikators beibehalten, aber den Indikator selbst ändern - externe Variablen und grafische Objekte aus dem Indikatorcode entfernen


novichok2018:

Ich habe die Logik mit Kommentaren überprüft. Es hat sich herausgestellt, dass die Positionen entsprechend den Bedingungen der ersten offenen Position geschlossen werden.

Herzlichen Glückwunsch! Sie sind auf dem richtigen Weg, aber in der Debugging-Phase ist es besser, es im Journal (Print()) statt im Kommentar (Commetn()) auszugeben.

Zeigen Sie mir den Code.

 
Igor Makanu:

Mir ist aufgefallen, dass Sie iCustom() nicht richtig aufgerufen haben, es sollte so sein:

Ich übergebe 7 Parameter beim Aufruf des Indikators, und Sie haben ihn mit 3 Parametern aufgerufen

Ich würde den Aufruf des Indikators beibehalten, aber den Indikator selbst ändern - externe Variablen und grafische Objekte aus dem Indikatorcode entfernen


Herzlichen Glückwunsch! Sie sind auf dem richtigen Weg, aber in der Debugging-Phase ist es besser, im Journal (Print()) auszugeben als im Kommentar (Commetn())

den Code anzeigen.

 int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(TimeCurrent()>OrderOpenTime()+100)
           { 
            if(OrderType()==OP_BUY)
              {
               if(OrderMagicNumber==101)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<20) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 }
              }
                 
            if(OrderType()==OP_SELL)
              {
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>97.55)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow); 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 } 
              }
            }               
         }
       continue;  
      }   

Ich habe die Abdrücke entfernt.

 
novichok2018:

Ich habe die Abdrücke entfernt.

Ich kenne nicht die gesamte Logik Ihres Codes, aber nach jeder Orderschließung müssen Sie die Schleife auf jeden Fall über break verlassen; und beim nächsten Tick müssen Sie die Orders erneut auf Ihre Bedingungen prüfen - ich weiß nicht, wie sichOrderSelect() verhält, nachdem die Order geschlossen wurde - wenn die Order geschlossen ist, was wird dann ausgewählt, oder wird es einen Fehler geben?

Im Grunde genommen besteht Ihr Problem darin, dass Sie in einer Schleife alles auf einmal prüfen und schließen wollen.

switch()

oder erstellen Sie eine Funktion zum Schließen des Auftrags (es gibt fertige Funktionen für Aufträge https://www.mql5.com/ru/forum/131859/page2#434206 )

oder verwenden Sie "break", nachdem der Auftrag in Ihrem Code geschlossen wurde

Полезные функции от KimIV
Полезные функции от KimIV
  • 2008.03.11
  • www.mql5.com
В этой теме я буду выкладывать коды своих функций на языке программирования MQL4, приводить примеры их использования и отвечать на вопросы, связанн...
 
Igor Makanu:

Ich kenne nicht die gesamte Logik Ihres Codes, aber nach jedem Schließen einer Order müssen Sie die Schleife definitiv per Break verlassen; und beim nächsten Tick müssen Sie Ihre Bedingungen erneut überprüfen - ich weiß nicht, wie sichOrderSelect() verhält, nachdem eine Order geschlossen wurde - wenn die Order geschlossen ist, was wird dann ausgewählt, oder tritt ein Fehler auf?

Im Grunde genommen besteht Ihr Problem darin, dass Sie in einer Schleife alles auf einmal prüfen und schließen wollen.

switch()

oder erstellen Sie eine Funktion zum Schließen des Auftrags (es gibt fertige Funktionen für Aufträge https://www.mql5.com/ru/forum/107476 )

oder verwenden Sie "break", nachdem der Auftrag in Ihrem Code geschlossen wurde

Ich danke Ihnen. Das Brechen scheint geholfen zu haben. Wir werden sehen, wie es weitergeht.