Problem der Mehrfachbestellung

 

Hallo zusammen,

Ich habe ein Problem mit meinem Code. Wenn eine Bestellung (kaufen oder verkaufen) offen andere kommen in einer Reihe.

Was ich versuche zu tun ist;

wenn der letzte Auftrag ein Verkauf ist, dann öffne einen Kaufauftrag, wenn der Preis über den Auftrag Openprice plus einige Pips (ReturnDist) kommt.

wenn der letzte Auftrag ein Kaufauftrag ist, dann eröffne ich einen Verkaufsauftrag, wenn der Preis unter den Openprice minus einige Pips fällt.

Kann mir hier jemand helfen?

Vielen Dank im Voraus

Luis

Dateien:
 
luisneves:

Hallo zusammen,

Ich habe ein Problem mit meinem Code. Wenn eine Bestellung (kaufen oder verkaufen) offen andere kommen in einer Reihe.

Was ich versuche zu tun ist;

wenn der letzte Auftrag ein Verkauf ist, dann öffne einen Kaufauftrag, wenn der Preis über den Eröffnungspreis plus einige Pips (ReturnDist) kommt.

wenn der letzte Auftrag ein Kaufauftrag ist, dann eröffne ich einen Verkaufsauftrag, wenn der Preis unter den Openprice minus einige Pips fällt.

Kann mir hier jemand helfen?

Vielen Dank im Voraus

Luis

Was ist Ihr Plan, um es zu beschränken?

Sie initialisieren OpenOpposite mit 1.

int    Ticket,total,OpenOpposite=1,UseSlippage,i;

Bei jedem Tick rufen Sie OpenOppositeOrder() auf.

   int start()
     {
      if (OrdersTotal()==0)GoToOpen();
       else GoToClose();      
      if(OpenOpposite>0)OpenOppositeOrder(); //<-- here 
      if(OrdersTotal()>0)OpPendingDel();
      
     }

Ich kann keinen anderen Verweis auf OpenOpposite sehen.

Die for-Schleife in OpenOppositeOrder unterliegt nach dem, was ich bisher gesehen habe, keinerlei Beschränkungen... sollte sie das?

Wo in Ihrem Code liegt Ihrer Meinung nach der Fehler?

 

Hallo Kronin,

zunächst einmal vielen Dank für deine schnelle Antwort.

Sorry für das Durcheinander, aber was ich versucht habe zu tun war, um unabhängige Arbeitsblöcke von Code haben.

Also, ich habe die von dir markierte Zeile und den oberen Teil, der void OpenOpposite () sagt, bereinigt und jetzt kommen einige Fehler wie;

expression on global scope not allowed,etc.

Wenn ich nicht viel von Ihrer Zeit in Anspruch nehme, könnten Sie mir hier helfen?

Danke

Luis



 
luisneves:

Hallo Kronin,

zunächst einmal vielen Dank für deine schnelle Antwort.

Sorry für das Durcheinander, aber was ich versucht habe zu tun war, um unabhängige Arbeitsblöcke von Code haben.

Also, ich habe die von dir markierte Zeile und den oberen Teil, der void OpenOpposite () sagt,bereinigt und jetzt kommen einige Fehler wie;

expression on global scope not allowed,etc.

Wenn ich nicht viel von Ihrer Zeit in Anspruch nehme, könnten Sie mir hier helfen?

Danke

Luis

Ich habe nicht gesagt, dass Sie etwas bereinigen müssen. Ich wollte nur wissen, wo Sie versuchen, den EA daran zu hindern, mehr als einen Auftrag zu öffnen.

Versuchen Sie dies (ich habe es nicht getestet):

Ändern Sie die Startfunktion in (Vielleicht müssen Sie nur nach offenen Marktaufträgen filtern -> abhängig von Ihrer Strategie):

   int start()
     {
      if(OrdersTotal()==0){GoToOpen();OpenOpposite=0;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
      else GoToClose();      
      if(OpenOpposite==0)OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
      if(OrdersTotal()>0)OpPendingDel();      
     }

Fügen Sie einen OpenOpposite-Zähler zur Funktion OpenOppositeOrder() hinzu:

         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend(Symbol(), OP_SELL, mlots, SellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", Ticket);
                  AddLimitsSell();
                  OpenOpposite++;
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError());
                  }
               }
               
            if(Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend(Symbol(), OP_BUY, mlots, BuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", Ticket);
                  AddLimitsBuy();
                  OpenOpposite++;
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }

Dies sollte das Problem mit mehreren offenen Aufträgen in einer Reihe lösen. Es schränkt den EA ein, mehr als eine (entgegengesetzte) Order zu öffnen.

 
luisneves:

Hallo zusammen,

Ich habe ein Problem mit meinem Code. Wenn ein Auftrag (Kauf oder Verkauf) geöffnet wird, kommen andere in einer Reihe.

Warum brauchen Sie einen zweiten Thread über das gleiche Stück von Code?

RaptorUK:

Wenn ich mir Ihren Code ansehe, finde ich es sehr schwer zu verstehen, was Sie zu tun versuchen, ich sehe nur sehr wenige Kommentare, die mir helfen, Ihre start()-Funktion zeigt mir nicht, was Sie bei jedem Tick zu tun versuchen, Sie haben kein konsistentes Layout der Einrückung.


Aus diesem Thema:https: //www.mql5.com/en/forum/142629 Seite 3

 
RaptorUK:

Wenn ich mir Ihren Code ansehe, finde ich es sehr schwer zu verstehen, was Sie zu tun versuchen, ich sehe nur sehr wenige Kommentare, die mir helfen, Ihre start()-Funktion zeigt mir nicht, was Sie bei jedem Tick zu tun versuchen, Sie haben kein einheitliches Layout der Einrückung.

Damit bin ich einverstanden. Ich habe nichts anderes geprüft als das Problem der Mehrfachaufträge, weil der Code nicht leicht zu lesen ist. Es sieht so aus, als ob Teile des Codes von einem anderen Code kopiert und eingefügt wurden, der von jemand anderem geschrieben wurde. Schreiben Sie besser Ihre eigenen Funktionen mit Ihrem eigenen (konsistenten) Stil.

 
kronin:

Ich habe nicht gesagt, dass Sie etwas bereinigen müssen. Ich wollte nur wissen, wo Sie versuchen, den EA daran zu hindern, mehr als einen Auftrag zu öffnen.

Versuchen Sie dies (ich habe es nicht getestet):

Ändern Sie die Startfunktion in (Vielleicht müssen Sie nur nach offenen Marktaufträgen filtern -> abhängig von Ihrer Strategie):

Fügen Sie einen OpenOpposite-Zähler zur Funktion OpenOppositeOrder() hinzu:

Dies sollte das Problem mit mehreren offenen Aufträgen in einer Reihe lösen. Es schränkt den EA ein, mehr als eine (entgegengesetzte) Order zu öffnen.


Hallo kronin,

Vielen Dank für Ihre prompte Antwort auf mein Problem. Was ich versuche zu bekommen, ist eine Bedingung, um Aufträge wie diese zu öffnen;

Die erste Eröffnung mittels eines Indikators ist ein Kauf (kann natürlich auch ein Verkauf sein) und dann wird eine Kauforder eröffnet, wenn der Preis auf ein Niveau unter dem offenen Preis der Kauforder abprallt, wird eine Verkaufsorder eröffnet, aber wenn der Preis wieder steigt, sollte kein neuer offener Kauf erfolgen. Hier sollte ein neuer Kaufauftrag nur dann erfolgen, wenn der Preis nach dem Verkaufsauftrag wieder steigt. Das Gleiche gilt, wenn ein Verkaufsauftrag der erste ist, der ausgeführt wird.
Ich habe versucht, dies mit dem folgenden Code zu erreichen, aber es funktioniert nicht. Hier ist, was funktioniert, istdie erste Bestellung zu öffnen ist ein Kauf, dann und wie erwartet eine Verkaufsorder öffnen, aber von hier aus keine anderen Aufträge öffnen...

Ich habe diese beiden Codeblöcke und scheint, dass der erste tut, was erwartet wird, zu tun; Öffnen Sie eine Kauf-oder Verkaufsauftrag, wenn die Bedingungen durch Indikator definiert sind da. Sobald ein Auftragsticket
empfangen wird, wird eine Auftragsänderung vorgenommen, um Auftragslimits zu senden.

Ich verwende BuyTicket und SellTicket im Code, um das Öffnen von mehreren Aufträgen zu vermeiden, aber das scheint nicht die richtige Methode zu sein...

// Buy Order Condition to Open

  if(Volume[0] > volume_previous + OpenDistance*pt && BuyTicket == 0)                       
          {//5  
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)
        {//6
         Print("Opposite Buy order placed # ",BuyTicket);
         AddLimitsBuy();        
         }//6
      else
         {//7 
         Print("Order Send failed, error # ", GetLastError());
         }//7 
         
      return(0);
      }//5
  //-----------------------------------------------------------------------------+      
  
  // Sell Order Condition to Open

  if(Volume[0] < volume_previous - OpenDistance*pt && SellTicket == 0)                   
     {//8                                 
          while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                                                
          SellTicket=OrderSend(Symbol(),OP_SELL,LotSize,Bid,RealSlippage,0,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket > -1)
                  {//9
        Print("Opposite Sell order placed # ", SellTicket);
        AddLimitsSell();       
        }//9
     else
        {//10
        Print("Order Send failed, error # ", GetLastError());
        }//10      
     return(0);
     }//8                       


Der folgende Code identifiziert offene Orders und filtert sie nach Kaufsymbol, magischer Nummer und Ordertyp. Sobald er die letzte offene Order im Pool erkennt und die Bedingung zum Öffnen erfüllt (wenn die letzte Order ein Kauf ist) und bestätigt, dass kein Verkaufsticket vorhanden ist, wird eine Verkaufsorder geöffnet. Dasselbe gilt, wenn der letzte Auftrag ein Verkauf ist. Und hier funktioniert der Code.

Ein Problem entsteht, wenn eine Bedingung zum Öffnen einer dritten Order kommt und so weiter. Hier sind die Eröffnungsbedingungen jedoch vorhanden und der Code hat die zweite Eröffnung gut gemeistert, warum funktioniert der Code hier nicht?

int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {//14
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {//15
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//16
            Op = OrderType();

            if(Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0)
               {//17               
               SellTicket = OrderSend(Symbol(), OP_SELL, MLots, Bid, RealSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(SellTicket > -1) 
                  {//18
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }//18
               else
                  {//19
                  Print("Order Send failed, error # ", GetLastError() );
                  }//19
                }//17
                           
            if(Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0)
               {//20             
               BuyTicket = OrderSend(Symbol(), OP_BUY, MLots, Ask, RealSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(BuyTicket > -1)
                  {//21
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }//21
               else
                  {//22  
                  Print("Order Send failed, error # ", GetLastError());
                  }//22   
               }//20
            }//16
         }//15    
      }//14

Der komplette Code ist angehängt, falls Sie sehen wollen, was ich zu erklären versuche.

Bitte beachten Sie, dass noch einige andere Probleme zu lösen und einige Code könnte seltsam erscheinen, ist dies der Fall für die Art und Weise, die ich verwenden, um Aufträge zu öffnen, weil bin immer noch zu lernen, wie man Aufträge basierend auf Bid plus und minus Abstand zu öffnen.

Ich wäre Ihnen sehr dankbar, wenn Sie mir hier helfen könnten.


Mit freundlichen Grüßen
Luis

Dateien:
 
Wissen Sie, was Volume[0] Ihnen gibt? Wie macht das Hinzufügen eines Punktwerts zu diesem Wert einen Sinn?
 

Hallo Raptor,

Du hast recht!

Ich bin immer noch lernen und versuchen mehrere Möglichkeiten, um zu bekommen, was ich brauche und einige Male dumme Dinge kommt auf.

Ich habe versucht, die Verwendung eines Objekts zu machen, um es auf Bid-Ebene zu setzen und dann bekommen, dass die Position zu öffnen, um Aufträge, scheint besser als diese. Eines der Hauptprobleme ist die Art und Weise, neue Eröffnungen zu begrenzen, während der offene Auftrag nicht geschlossen ist.

Ich weiß, dass ich noch viel lernen muss, und das Ausprobieren von Fehlern ist ein Weg, den ich gefunden habe, um besser zu verstehen, wie das in der Praxis funktioniert. Während ich mein Bestes gebe, um die Informationen aus dem Buch und der Dokumentation zu verstehen, fühle ich mich manchmal verloren und versuche, Hilfe von anderen zu bekommen. Hier in Portugal ist es sehr schwer, Unterricht zu diesem Thema zu bekommen, und so bin ich auf den guten Willen, die Geduld und das Durchsetzungsvermögen anderer angewiesen, um Hilfe und Rat zu bekommen. Wenn diese Hilfe eintrifft, tue ich mein Bestes, um zu verstehen, aber manchmal komme ich damit nicht zurecht.

Jedenfalls danke ich Ihnen, dass Sie mir gezeigt haben, dass Lautstärke nicht der richtige Weg ist, um diese Art von Indikator zu erhalten.

Mit freundlichen Grüßen

Luis

 
luisneves:

Hallo Raptor,

Du hast recht!

Ich bin immer noch lernen und versuchen mehrere Möglichkeiten, um zu bekommen, was ich brauche und einige Male dumme Dinge kommt.

Ich schätze es, dass Sie versuchen und versuchen, auch zu lernen, vielleicht sollten Sie zunächst versuchen, eine einfachere EA zu erstellen und arbeiten mit, dass, bis Sie verstehen, wie man es zu tun, was Sie es brauchen, versuchen Sie ein paar Dinge, fügen Sie einige Print-Anweisungen, sehen, was passiert, auf diese Weise werden Sie lernen und zu verstehen, dann, wenn Sie mehr lernen, können Sie mehr zu Ihrem EA hinzufügen. Sie müssen eine klare Vorstellung davon haben, was Ihr EA tun soll, bevor Sie ihn programmieren können. Zu viele Funktionen auf einmal machen diesen klaren Denkprozess nicht einfacher.

Eine andere Sache, die Ihnen helfen wird, ist, Aufgaben in Module aufzuteilen, die Sie in anderen EAs wiederverwenden können. Dann können Sie dieses Modul als benutzerdefinierte Funktion selbst als Teil eines Skripts oder einfachen EAs kodieren, um es zu testen und sicherzustellen, dass es funktioniert und robust ist ... dann können Sie diese Funktion mit dem Wissen, dass sie funktioniert, in einem EA verwenden.
 

Hallo RaptorUK,

danke für deine ehrliche Antwort. Ich versuche bereits, Aufgaben zu brechen und andere Art von Problemen beginnen zu zeigen, das ist, warum beginnen, alle zusammen (und andere Probleme beginnt....)

Ich habe bereits versuchen, eine andere EAs zu tun und funktionierte gut, aber jetzt mit diesem Ansatz ohne die Verwendung von Indikatoren (standard diejenigen) die Dinge kompliziert werden.

Die Sache ist gerade jetzt bin völlig verloren. Ich dachte, dass die Art und Weise sehe ich den Code arbeiten Tick von Tick in der Theorie, die funktionieren sollte und dann versuchen, Grenzen zu erhalten, um mehrere Öffnungen zu vermeiden bringt die Dinge schlechter.

So haben jetzt einige Blöcke des Codes, die gut funktionieren andere, die einige Aufmerksamkeit benötigen, um die Leistung zu verfeinern und andere (zwei), die nicht funktionieren, und hier weiß ich nicht, wie man von hier aus zu bekommen ... einfach so, und ich bin völlig Beklagte von Hilfe, die Menschen, die weiß, wie man damit umgehen. Sie sind eine der Personen, die sich mehr Zeit für meine Probleme genommen haben, aber trotzdem komme ich mit einigen Problemen nicht zurecht. Wenn ich die Zeit hatte, um alle mql-Code zu lernen und dann beginnen zu schreiben, basierend auf eine Menge Theorie und Erfahrung in der Vergangenheit erworben vielleicht war ich nicht hier.

Ich sah ein EA (Anhang) dann versuchen, zu verstehen, wie es funktioniert, in Teile des Codes, die mich bringen sollte, was ich suche, aber war nicht erfolgreich, dass. was ich sah, war, dass es einen Code verwenden, um Eröffnungen basierend auf Preis plus und minus einige Entfernung zu erhalten. Hier, wenn ich versuche, diese ein Problem mit Grenzen kommt und dann nichts ... kann nicht rein zu setzen, dass die Arbeit ... und dann cant't zu sehen, warum die alternativen Aufträge nicht funktionieren, wie in der Theorie (zumindest die Art, wie ich es gesehen habe). Pure Schande.......

Wie auch immer, das sind nur ein paar Worte von einem begrenzten Kerl...

Mit besten Grüßen

Luis

Dateien:
Grund der Beschwerde: