Jump to content
Tom Next - Daytrading Community

Hilfe bei OrderCloseBy


Gunner_Duck

Recommended Posts

Hallo alle Zusammen,

 

ich bastle mir grade ein Unterprogramm für das sofortige Schließen einer Order bei Gegensignal.

Sprich, wenn ich grade Long im Markt bin und etwas später einen Sell-Stop setze, der auch geschortet wird - soll die Long-Position sofort gelöscht werden.

 

Aber mit Schleifen hab ich so meine Probleme, daher brauche ich bitte eure Hilfe, da ich hier etwas zusammen gebastelt hab, was so gar nicht funktioniert.

//+------------------------------------------------------------------+
//|========================OPPOSITE CLOSE============================|
//+------------------------------------------------------------------+
int OppositeClose() {
 int g,h;
 
 for (g=Total-1; g>=0; g--) {
  if (OrderSelect(g,SELECT_BY_POS,MODE_TRADES) == true)
   if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (h=Total-1; h>=0; h--) {
     if(OrderSelect(h,SELECT_BY_POS,MODE_TRADES) == true) 
      if(OrderType()==OP_SELL) {
       Oppoclose = OrderCloseBy(h+1,h,DarkOrange);
       Print("Close SELL by Opposite"," Ordertype:",OrderType());
       return(1);
      }
      if(OrderType()==OP_BUY) {
       Oppoclose = OrderCloseBy(h+1,h,DarkOrange);
       Print("Close BUY by Opposite"," Ordertype:",OrderType());
       return(1);
      }
     }
    }
   }
   return(0);
  }

 

Link to comment
Share on other sites

achso, ja hab ich vergessen anzugeben. Ja

Total = OrdersTotal();

Und hier rufe ich die Subroutine auf:

//+------------------------------------------------------------------+
 //|=======================Check position=============================|
 //+------------------------------------------------------------------+
 for (int i=0; i<Total; i++) {
  if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) {
   if((OrderType() <= OP_SELLSTOP) && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
    
    //+------------------------Exit Buy-----------------------------+       
    if(OrderType() == OP_BUY) {
     if(CloseOnOppositeSignal) OppositeClose();
    }
    //+------------------------Exit Sell----------------------------+
    if(OrderType() == OP_SELL) {
     if(CloseOnOppositeSignal)  OppositeClose ();
    }
   }
  }
}

Dieser Fehler wird ausgeben, sobald ich Long gehe und geht auch über die Short-Position hinaus.

Also sprich, gehe Long, kommt dieser Fehler, simuliere ich weiter und setzte einen Sell-Stop, woraus dann eine Short-Position wird, wird dieser Fehler weiterhin ausgelöst. Am Ende laufe ich mit beiden Positionen im Markt und im Looping wird andauernd dieser Fehler immer weiter ausgegeben.

und hier ist der fehler...

post-5230-0-23548300-1505852659_thumb.jpg

Edited by Gunner_Duck
Link to comment
Share on other sites

Hi

 

Dr.Google antwortet auf Eingabe "ERROR 4015" wie folgt :

 

Wenn Du da suchst, dann kommt häufig ein Problem mit der LOTgrösse an die Oberfläche .

 

https://www.google.de/search?source=hp&q=ERROR+4051&oq=ERROR+4051&gs_l=psy-ab.12...2145.10579.0.22571.0.0.0.0.0.0.0.0..0.0....0...1.1.64.psy-ab..0.0.0....0.WvOJRnkF8A0

 

 

Gucke doch mal, was da bei Dir drinnen steht ... welcher Wert wird übergeben, wenn zum Close durch Dein Prg aufgerufen wird ?

 

Hoffe hilft

Grüße & GN8

 

Wolfgang

 

PS.: anbei erster Schuss nur : https://www.forexfactory.com/showthread.php?t=557438

Link to comment
Share on other sites

Also ich hab die Ticketnummer jetzt in die Schleife integriert - hab da ja was falsches abgefragt :-/

int OppositeClose() {
 int g,h;
 
 for (g=Total-1; g>=0; g--) {
  if (OrderSelect(g,SELECT_BY_POS,MODE_TRADES) == true)
   if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
    for (h=Total-1; h>=0; h--) {
     if(OrderSelect(h,SELECT_BY_POS,MODE_TRADES) == true) 
      if(OrderType()==OP_SELL) {
       Oppoclose = OrderCloseBy(Ticket-1,Ticket,DarkOrange);
       Print("Close SELL by Opposite"," Ordertype:",OrderType());
       return(1);
      }
      if(OrderType()==OP_BUY) {
       Oppoclose = OrderCloseBy(Ticket-1,Ticket,DarkOrange);
       Print("Close BUY by Opposite"," Ordertype:",OrderType());
       return(1);
      }
     }
    }
   }
   return(0);
}

Nun funktioniert es so wie ich will.

 

EDIT: Ach ne, klappt doch nicht. Also beim Short-Eintritt werden nun beide Orders geschlossen :-/

 

Trotzdem frage ich mich grade, ob OrderCloseBy die richtige Funktion ist für mein Anliegen!?

 

Weil ich jetzt trotzdem, dass es funktioniert, lauter solcher Fehler hier...

post-5230-0-64794900-1505855880_thumb.jpg

Edited by Gunner_Duck
Link to comment
Share on other sites

ich bin noch nicht in Deinen Code eingestiegen aber Dr.Google führt mich u.a. hierher

 

https://book.mql4.com/appendix/errors

 

Und wenn ich da unter 4108 gucke, dann steht da Invalid Ticket ..... das interpretiere ich so, dass Du eine Ticketnummer schliessen möchtest , die der Terminal nicht kennt .

 

OrderCloseBy() kenne ich nicht, eine Order habe ich immer mit OrderDelete() geschlossen . Aber das findest Du im MQL4 Handbuch .....

 

GN8

Wolfgang

Link to comment
Share on other sites

hier suchen : https://docs.mql4.com/trading

 

da steht, dass OrderCloseBy() eine geöffnete Order schliesst und zwar durch eine entgegengesetzte Order : https://docs.mql4.com/trading/ordercloseby ; da wird auch die Ticketnummer benötigt !

 

OrderDelete() schliesst eine Pending Order ... braucht auch die richtige Ticketnummer

 

musst Dich was durchsuchen

 

Wenn es nichts hilft, dann kommentiere aus und lasse Dir die Variablen ausgeben, dann können wir daraus weitersuchen

 

nun wirklich gn8 :-)

Link to comment
Share on other sites

also, dass man mit orderdelete pendings löscht und mit orderclose positionen schließt, die aktuell im markt sind, weiß ich ja.

Deswegen hab ich ja die OrderCloseBy-Funktion gewählt.

 

 

Die Ticketnummer hab ich mir schon ausgeben lassen. Die Long-Position bekommt in dem Fall die #1 und der Sell-Stop bekommt die #2.

 

Was mich aber grade etwas stutzig macht ist die Fehlermeldung, dass "order 2 for OrderCloseBy function is not a market order".

 

Würde ja bedeuten, dass er die Order schon zu schließen versucht, wo sie noch nicht als Markt Order aktiviert ist.

Link to comment
Share on other sites

Wg orderdelete/orderclose wollte ich Dir nicht zu nahe treten . Versuche lediglich remote Tips zu geben, so gut wie es eben geht ( ohne Skype oder anderen Medien die direkte Kommunikation erlauben ) http://1.1.1.5/bmi/www.tom-next.com/community//public/style_emoticons/default/blush.gif Grüße Wolfgang

 

nein, nein, alles gut, so hab ich das auch gar nicht aufgenommen ;-)

Bin so oder so für jeden Tipp dankbar.

 

 

Ich würde da ganz anders ran gehen. Erst checken, ob ein Signal vorliegt und dann getrennt von der Richtung mich auch separat um die long und/oder short Orders kümmern.

 

Könntest du mir bitte ein Beispielcode geben.

Edited by Gunner_Duck
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...