EA für jedes Währungspaar - welcher Code wird nur einmal pro Währungspaar geöffnet? - Seite 3

 

Ich habe den Schließmechanismus von:

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

zu

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

und jetzt funktioniert alles wie erwartet. Auch wenn ich nicht verstehe, warum das so ist. Weil ich die zusätzlichen Zeilen im zweiten Code wirklich nicht verstehe. Aber danke Leute!

 
grey.unit:

Ich ändere den Schließmechanismus von:

zu

und jetzt funktioniert alles wie erwartet. Vielen Dank, Leute!

Es wird wahrscheinlich nicht immer funktionieren ... beim Schließen von offenen Aufträgen oder Löschen von schwebenden Aufträgen innerhalb einer Schleife MUSS man abwärts zählen, nicht aufwärts ... Sie müssen Ihre Schleife ändern. Und Sie müssen den Chack für Symbol() wieder einfügen ... sonst wird der EA für EURUSD am Ende möglicherweise Aufträge für GBPUSD schließen ... was Sie tun mussten, war, das continue loszuwerden ... oder das == in !=
 
grey.unit:

Ich habe den Schließmechanismus von:

zu

und jetzt funktioniert alles wie erwartet. Auch wenn ich nicht verstehe, warum das so ist. Weil ich die zusätzlichen Zeilen im zweiten Code wirklich nicht verstehe. Aber danke, Leute!

Dein zweiter Code ist korrekt, aber ein bisschen komisch. Öffnen Sie MetaEditor, Navigatorfenster (Strg + D), Registerkarte Wörterbuch, und wählen Sie MQL4 Referenz > Standardkonstanten > Handelsoperationen.

 
RaptorUK:
Es wird wahrscheinlich nicht immer funktionieren ... wenn man offene Orders schließt oder schwebende Orders innerhalb einer Schleife löscht, MUSS man abwärts zählen, nicht aufwärts ... man muss seine Schleife ändern. Und Sie müssen den Haken bei Symbol() wieder einfügen . . . sonst wird der EA für EURUSD möglicherweise Aufträge für GBPUSD schließen . . . was Sie tun mussten, war, das continue loszuwerden . . . oder das == zu != zu machen

Nur um Sie richtig zu verstehen. Sie sagen, wenn ich den ersten Code in:

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

dann sollte es auch funktionieren? Denn ich habe das ausprobiert und es wird wieder nur eine Order pro Währungspaar eröffnet.

Oder wenn ich den zweiten Code ändere in (k++ zu k--), dann öffnet er auch nur einen Handel pro Währungspaar.

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

Nur um Sie richtig zu verstehen. Sie sagen, wenn ich den ersten Code in:

dann sollte es auch funktionieren? Denn ich habe das ausprobiert und es wird wieder nur eine Order pro Währungspaar eröffnet.

Oder wenn ich den zweiten Code ändere in (k++ zu k--), dann öffnet er auch nur einen Handel pro Währungspaar.

Ich spreche über den ersten Code, die Schleife, die Sie verwenden, wo Sie Aufträge schließen ... es muss dekrementieren . . sonst verpassen Sie Aufträge. Wie ich sehe, haben Sie das continue entfernt und { } Klammern hinzugefügt, sehr gut :-)

Eröffnen Sie eine Order pro Währungspaar oder eine Order insgesamt?

 
RaptorUK:

Eröffnen Sie eine Order pro Währungspaar oder eine Order insgesamt?

Ja, natürlich insgesamt. Okay, 2. Code:


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

Wenn wir über die Schleife sprechen, denke ich, dass Sie dies meinen:

for (int j = 0; j < OrdersTotal(); j ++)

Eigentlich würde ich es in etwas wie dieses ändern:

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Diese Zeile öffnet nur eine Order pro Währungspaar (wie gewünscht!)

Ist die Schleife nun korrekt in Bezug auf dieses Problem? :

RaptorUK:

Es wird wahrscheinlich nicht immer funktionieren ... wenn Sie offene Aufträge schließen oder ausstehende Aufträge innerhalb einer Schleife löschen, MÜSSENSie abwärts zählen, nicht aufwärts ... Sie müssen Ihre Schleife ändern. Und Sie müssen den Haken bei Symbol() wieder einfügen . . . sonst wird der EA für EURUSD möglicherweise Aufträge für GBPUSD schließen . . was Sie tun müssen, ist, dascontinue loszuwerden. . oder machen Sie aus dem == ein !=
 
grey.unit:

Ja, in Summe natürlich. Okay, 2. Code:


Wenn wir über die Schleife sprechen, denke ich, dass du dies meinst:

Eigentlich würde ich es in etwas wie dieses ändern:

Diese Zeile öffnet nur eine Order pro Währungspaar (wie gewünscht!)

Ist die Schleife in Bezug auf dieses Problem jetzt korrekt? :

Nein, machen Sie folgendes....

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

Die erste Order-Position ist 0, wenn Sie also 5 Orders haben, sind die Positionen 0, 1, 2, 3, 4 ... die letzte ist also OrdersTotal() - 1 ... um herunterzuzählen, beginnen Sie also bei OrdersTotal()-1 und enden bei 0

 
Okay, vielen Dank für Ihre Hilfe!
 
RaptorUK:

Nein, machen Sie Folgendes...

Die erste Auftragsposition ist 0. Wenn Sie also 5 Aufträge haben, sind die Positionen 0, 1, 2, 3, 4 ... die letzte Position ist also OrdersTotal() - 1 ... zum Herunterzählen beginnen Sie also bei OrdersTotal()-1 und enden bei 0

Es sollte also wie folgt aussehen:

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

weil Sie das geschrieben haben:

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

oder liege ich falsch?

 
grey.unit:

Es sollte also wie folgt aussehen:

weil Sie das geschrieben haben:

oder liege ich falsch?

Sie liegen völlig falsch. Ihr Code wird nie ausgeführt !!!. Verwenden Sie den von RaptorUK.