Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Hedge EA (http://www.expert-advisor.com/forum/showthread.php?t=6634)

TogoTiger 23.06.20 21:09

Zitat:

Zitat von MA-EA (Beitrag 43945)
Anscheinend gibts keinen einzigen Forex Broker, bei dem man ohne größere Unterbrechungen gleichzeitig Long und Short im selben Symbol sein kann. Vielleicht liegts auch am MT4.

Blödsinn, natürlich geht das. Und nochmals Blödsinn, es liegt nicht am MT4.
Such den Fehler in deinem EA. Ende April habe ich dir den ganzen EA so geschickt, dass er funktioniert. Schau doch das mal an.

MA-EA 25.06.20 02:03

Hat der in nem Demo-Konto pausenlos Orders offen gehabt oder nur im Strategietester/Backtest?

TogoTiger 25.06.20 08:18

ja, hat er, in einem Demokonto bei JFD.

MA-EA 25.06.20 20:38

Liste der Anhänge anzeigen (Anzahl: 1)
Ganz sicher? Hin und wieder hat er auch bei meinen Demo-Tests nach einer Gewinn-Order sofort wieder die Nächste in die selbe Richtung geöffnet, so wie er es eigentlich immer tun soll. :rolleyes: Dann wieder dauerts oft 10-20 Min, manchmal über ne halbe Stunde. Mir fiel auf, dass er dann meistens erst zur vollen Stunde die nächste Order öffnet.

Zu diesen Fehler-Codes:
Der EA selbst kann doch bei den Meisten sowieso nix selber machen. Ausser bei IsTradeAllowed() und IsTradeContextBusy(), wo man ihn dann halt kurz mit Sleep() warten lassen kann, gibts doch für die ganzen anderen Fehler keinen Weg, das jeweilige Problem vom EA alleine lösen zu lassen oder doch?

TogoTiger 26.06.20 15:05

Wenn du sauber programmieren willst, solltest auf jeden Fall Fehler abfangen und deinen EA entsprechend reagieren lassen. Es gibt jede Menge mögliche Fehler.

Das sind nur die Fehler, die der Trade Server zurückgeben kann (aus stderror.mqh):
Code:

//--- errors returned from trade server
#define ERR_NO_ERROR                                  0
#define ERR_NO_RESULT                                1
#define ERR_COMMON_ERROR                              2
#define ERR_INVALID_TRADE_PARAMETERS                  3
#define ERR_SERVER_BUSY                              4
#define ERR_OLD_VERSION                              5
#define ERR_NO_CONNECTION                            6
#define ERR_NOT_ENOUGH_RIGHTS                        7
#define ERR_TOO_FREQUENT_REQUESTS                    8
#define ERR_MALFUNCTIONAL_TRADE                      9
#define ERR_ACCOUNT_DISABLED                        64
#define ERR_INVALID_ACCOUNT                          65
#define ERR_TRADE_TIMEOUT                          128
#define ERR_INVALID_PRICE                          129
#define ERR_INVALID_STOPS                          130
#define ERR_INVALID_TRADE_VOLUME                    131
#define ERR_MARKET_CLOSED                          132
#define ERR_TRADE_DISABLED                          133
#define ERR_NOT_ENOUGH_MONEY                        134
#define ERR_PRICE_CHANGED                          135
#define ERR_OFF_QUOTES                              136
#define ERR_BROKER_BUSY                            137
#define ERR_REQUOTE                                138
#define ERR_ORDER_LOCKED                            139
#define ERR_LONG_POSITIONS_ONLY_ALLOWED            140
#define ERR_TOO_MANY_REQUESTS                      141
#define ERR_TRADE_MODIFY_DENIED                    145
#define ERR_TRADE_CONTEXT_BUSY                      146
#define ERR_TRADE_EXPIRATION_DENIED                147
#define ERR_TRADE_TOO_MANY_ORDERS                  148
#define ERR_TRADE_HEDGE_PROHIBITED                  149
#define ERR_TRADE_PROHIBITED_BY_FIFO                150

Such dir raus, auf welche du reagieren willst. Auf die Konsole ausgeben solltest die immer. Dann siehst nämlich, was falsch läuft.
Nach Order-Eröffnung z.B. so:

Code:

      if(Ticketnummer == -1)
        {
        FehlerCode = GetLastError();
        string FehlerBeschreibung = ErrorDescription(FehlerCode);
        string FehlerAusgabe = StringConcatenate(FehlerCode,"  ",FehlerBeschreibung);
        Print(FehlerAusgabe);
        }


MA-EA 09.07.20 08:34

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Kann man den EA rausfinden lassen, ob der Server momentan überhaupt Orders an nimmt? Ich meine nicht IsTradeContextBusy() oder IsTradeAllowed(). Der EA soll prüfen, ob der Broker gerade generell Orders ausführt und wenn nicht, es von Zeit zu Zeit wieder prüfen. Wenn ja, soll der EA seine Orders senden wie sonst auch.

Anja 12.07.20 01:02

Warum verwendest du so oft Sleep? Und warum so eine hohe Preisabweichung? Slippage=99999999;

Empfohlen wird hier meist 3 für Slippage:
https://docs.mql4.com/trading/ordersend

MA-EA 12.07.20 03:36

Liste der Anhänge anzeigen (Anzahl: 1)
Moin.

Gibt wohl keine Möglichkeit, rauszufinden, ob der Broker gerade überhaupt Orders an nimmt oder nicht. :rolleyes: Oder geht das vielleicht über Pending-Orders? Wenn er die annimmt, kann man sie ja gleich wieder löschen und dann die eigentlichen Markt-Orders raus schicken.

Anfängerfrage:Kann man eigentlich mehrere Orders auf einmal auswählen und vergleichen? Oder geht es nur mit mehreren Schleifen?
Code:

extern string esMOBSC1="Max Orders";
extern string esMOBSC2="Sell / Buy";
extern string esMOBSC3="concurrently";

extern int MOBSC_Def=0; // Default Wert

extern int MOBSC_Sel=0; // Start-Werte.
extern int MOBSC_Buy=0; // Werden gleich nach OrderSend mit "++" erhöht.

extern int MOBSC_Max_Sel=2;
extern int MOBSC_Max_Buy=2;

Code:

extern double Def_Lots=0.01;

extern double LotsSel=0.01;
extern double LotsBuy=0.01;

extern string esLPOCP1="Lots Buy / Lots Sell";
extern string esLPOCP2="+ LotsPlus";
extern string esLPOCP3="if Order close";
extern string esLPOCP4="with Profit";

extern double LotsPlus=0.01;

Code:

for(int j=OrdersTotal()-1;j>=0;j--){
  if(OrderSelect(j,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_Sel){
        if( CLsel_D < OrderOpenPrice() ){
          if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
          if(IsTradeContextBusy()==true)Sleep(Sl_MS);
          LotsSel = OrderLots() + LotsPlus;


          if(MOBSC_Sel>=MOBSC_Max_Sel){
            for(int k=OrdersTotal()-1;k>=0;k--){
              if(OrderSelect(k,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){
                  if(OrderMagicNumber()==MN_Buy){
                    if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);
                    if(IsTradeContextBusy()==true)Sleep(Sl_MS);
                    MOBSC_Sel=MOBSC_Def;
                    MOBSC_Buy=MOBSC_Def;
                    LotsSel=Def_Lots;
                    LotsBuy=Def_Lots;

} } } } } } } } } }


//////////////////////////////////////////////////////////////////////////////////////////////////////////////


//Die eigentliche Buy-Order auswählen:
for(int l=OrdersTotal()-1;l>=0;l--){
  if(OrderSelect(l,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_Buy){
        if( CLbuy_D > OrderOpenPrice() ){
          if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Red);
          if(IsTradeContextBusy()==true)Sleep(Sl_MS);
          LotsBuy = OrderLots() + LotsPlus;


          if(MOBSC_Buy>=MOBSC_Max_Buy){
            for(int m=OrdersTotal()-1;m>=0;m--){
              if(OrderSelect(m,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){
                  if(OrderMagicNumber()==MN_Sel){
                    if(IsTradeAllowed()==true)OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
                    if(IsTradeContextBusy()==true)Sleep(Sl_MS);
                    MOBSC_Sel=MOBSC_Def;
                    MOBSC_Buy=MOBSC_Def;
                    LotsSel=Def_Lots;
                    LotsBuy=Def_Lots;

 } } } } } } } } } }


Indikator-Trading 12.07.20 08:09

Wenn du den EA so nutzt, wie du ihn hier geteilt hast, dann musst du unbedingt die Einstellung zur Slippage anpassen. Der Wert steht auf 99999999 und dann werden die Orders nicht gelöscht, da das kein Wert ist, der irgend einen Sinn ergibt, zumindest für meinen Broker.

Zitat:

Gibt wohl keine Möglichkeit, rauszufinden, ob der Broker gerade überhaupt Orders an nimmt oder nicht.
Wieso gehst du überhaupt davon aus das dein Broker keine Orders annehmen wird?

Zitat:

Anfängerfrage:Kann man eigentlich mehrere Orders auf einmal auswählen und vergleichen? Oder geht es nur mit mehreren Schleifen?
Ich wüsste keine andere Möglichkeit als das mit einer Schleife zu lösen.

Generell:
Der Hedging EA zeigt bei mir nicht gerade großartige Performance. Hast du einen Markt + Settings die du nutzt?
Ich halte von Hedging in ein und dem selben Markt allerdings nichts. Der einzige der sich da freuen kann ist der Broker, da du ja gleich min. zweimal im Markt bist und auch doppelt Spread+Kommission bezahlen darfst.

MA-EA 12.07.20 21:39

Liste der Anhänge anzeigen (Anzahl: 1)
Zum Prinzip noch mal kurz:

Es sollen im selben Symbol eine Sell und auch eine Buy-Order geöffnet werden. Wenn Eine davon einen bestimmten Gewinn erreicht, wird sie geschlossen. Die Order der anderen Richtung bleibt offen. Gleich nach dem Schließen der Gewinn-Order soll eine Weitere mit dem selben Gewinn-Ziel, aber mehr Lot raus geschickt werden. Erreicht diese auch wieder ihr Gewinn-Ziel, soll sie und auch die Verlust-Order geschlossen werden. Wenns gut läuft, holen die beiden Gewinn-Orders die Spreads, Verlust der Verlust-Order und ein paar Pipen Gewinn. Nicht viel, es geht aber auch nicht darum, dick abzustauben. Sondern mit kleinem Risiko immer wieder ein paar Pipen Gewinn zu machen. Das Gute ist eben, dass es egal ist, in welche Richtung das Symbol() geht. Hauptsache es ist genug Bewegung drin, um immer wieder, wenn auch kleine, Gewinne bei möglichst kleinem Risko zu machen.

Ich probiere im Demo-Konto schon seit weiß ich wie lange rum. Wäre der EA ständig mit Sells und Buys investiert, wie er soll, würde es gut laufen. Aber er braucht immer wieder lange, um die nächste Order zu öffnen. Also hab ich die Version 4 gemacht, die derzeit höchstens 2 Orders nacheinander in die selbe Richtung schickt, nach der 1. Gewinn-Order die Lots erhöht, nach der 2. Gewinn-Order Alles schließt und auf Anfangswerte zurück setzt. Aber auch da gibts immer wieder lange "Pausen". Bei AdmiralMarkets, JFD und ActivTrades.

Backtests sind nur gut, um zu prüfen, ob das Ding überhaupt macht, was es soll. Apropo, die Version im Anhang hab ich noch gar nicht getestet. :rolleyes:


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:55 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum