|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Hallo Top-SecreT,
habe nun gelesen und verglichen, verglichen und gelesen und an dem kleinen code "geschraubt" und "geschraubt". Nun sollte das Teil auch Dir besser gefallen: if(OrderSelect(MAGICMA, SELECT_BY_POS)==true) { switch(OrderType()) { case OP_BUY: if (Bid >= OrderOpenPrice() + 70* Point) if (!OrderModify(OrderTicket(),OrderOpenPrice(),Order OpenPrice() + 40 * Point, 120 * Point, 0, Blue)) Print("Fehler beim Ändern der Position: ",GetLastError()); break; case OP_SELL: if (Ask <= OrderOpenPrice() - 70* Point) if (!OrderModify(OrderTicket(),OrderOpenPrice(),Order OpenPrice() - 40 * Point, 120 * Point, 0, Red)) Print("Fehler beim Ändern der Position: ",GetLastError()); break; } } Im MetaEditor werden weder Fehler noch Warnungen angezeigt und der EA, in welchem das Teil integriert ist, läßt sich auch öffnen. Dennnoch werden weder SL noch TP wunschgemäß (code-gemäß) verschoben. Gib mir wenigstens einen kleinen Tipp, was falsch sein könnte, oder was ggf. noch fehlt. LG. piptrade |
|
|||
Die Parameter von OrderSelect stimmen nicht.
|
|
|||
Bin nochmals tief in mich gegangen und habe versucht jeglichen Hinweis dieses Beitrages nachzuvollziehen. Im Nachhinein sind die ursprünglichen Fehler natürlich offensichtlich und für Materiekenner wahrscheinlich sogar albern!
Mit der Zuversicht, nunmehr die gravierenden "Schwachstellen" beseitigt zu haben, hoffe ich auf Eure Antwort. Hier der nachgebesserte code: input int TakeProfit = 100; input int StopLoss = 250; //+-----------------------+ int start() { if(OrderSelect(TicketNumber,SELECT_BY_TICKET)==tru e) { switch(OrderType()) { case OP_BUY: if (Bid >= OrderOpenPrice() + 70* Point){ if (!OrderModify(OrderTicket(),OrderOpenPrice(),Order OpenPrice()+40*Point,OrderOpenPrice()+130*Point,0, Blue)){ Print("Fehler beim Ändern der Position: "+GetLastError()); } } case OP_SELL: if (Ask <= OrderOpenPrice() - 70* Point){ if (!OrderModify(OrderTicket(),OrderOpenPrice(),Order OpenPrice()-40*Point,OrderOpenPrice()-130*Point,0,Red)){ Print("Fehler beim Ändern der Position: "+GetLastError()); } } } } else Print("OrderSelect has not been able to find the order ", GetLastError()); return(0); } Würde mich riesig über Eure Antwort freuen. LG. piptrade |
|
|||
Aus dem Code ist nicht ersichtlich wie deine Variable TicketNumber gefüllt ist
tru e wird zusammen geschrieben (true) OrderOpenPrice wird auch zusammen geschrieben (hast du jeweils nicht in den OrderModify Anweisungen) Beim switch fehlt wieder das break. LG |
|
|||
Herzlichen Dank für schnelle und kompetente Antwort. Schreibfehler müssen beim Kopieren/Formatieren des Textes entstanden sein, "break" habe ich eingefügt und die Füllung der TicketNumber erfolgt über "#define TicketNumber 12345". Dementsprechend sieht der code jetzt SO aus:
#define TicketNumber 12345 //--- Inputs input int TakeProfit = 100; input int StopLoss = 250; //+-----------------------+ int start() { if(OrderSelect(TicketNumber,SELECT_BY_TICKET)==tru e) { switch(OrderType()) { case OP_BUY: if (Bid >= OrderOpenPrice() + 70* Point){ if (!OrderModify(OrderTicket(),OrderOpenPrice(),Order OpenPrice()+40*Point,OrderOpenPrice()+130*Point,0, Blue)){ Print("Fehler beim Ändern der Position: "+GetLastError()); } break; } case OP_SELL: ..... and so on ...... Sollte der code jetzt tatsächlich 100pro richtig sein ? Nach dem vielen "Hin und Her", wäre das kaum glauben. LG PS.: Die "Tippfehler" entstehen auch jetzt wieder !!!??? |
|
|||
"Sollte der code jetzt tatsächlich 100pro richtig sein ?"
Ich denke, dass er es immer noch noch nicht ist. U.a. die 70, die zum OrderOpenPrice addiert (subtrahiert) werden, sollen doch sicherlich Pips darstellen. Solltest Du einen 5-DigitBroker benutzen, dann entsprächen die 70 Pips nur noch 7 Pips, denn Point wäre dann 0.00001 oder 0.0001 (z.B. bei JPY-Pärchen). Und 7 Pip sind dann knapp! D.h. beim 5-DigitBroker muß der EA das erkennen und mit 10 multiplizieren. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo traderdoc,
Du bist wirklich ein treuer Helfer in der Not. Danke für Deine Hinweise zur "70". Diese Anmerkungen zu 4- bzw. 5-DigitBrokern sind schon die heutige Antwort darauf, was ich sicher spätestens morgen gefragt hätte. Vorläufig will ich den code aber für den DAX verwenden, so dass ich glaube, dass die 70 (für 7 pip) richtig sein könnte. - Oder? Was die sonstige code-Erstellung angeht, - gibt es da noch etwas zu bemängeln oder zu verbessern? Übrigens ein dickes Lob dafür, dass Du den Hilfesuchenden Stück für Stück durch seinen code begleitest und nicht nur eine fertige Lösung präsentierst. Nur so ist man dazu gezwungen, sich selbst zu befleißigen und so auch wieder etwas dazuzulernen - und das sollte ja Sinn und Zweck der Sache sein ! Also, nochmals ein herzliches Dankeschön und liebe Grüße piptrade PS.: Im selben Forum habe ich ein zweites Thema erstellt, mit der Frage zur Arbeit mit Hour und Minutes. Mit dem "get" und der Deklaration habe ich habe ich hier weniger Probleme - jedoch mit der Initialisierung (z.B. "08:30" als input string, der dann mittels double in eine Ziffer gewandelt wird ?) - und mit der Übergabe an das PRG (als zwei getrennte Variablen: 1. Hour, 2. Minute ?) Vielleicht kannst Du mich auch hier ein Stück begleiten? |
|
|||
Ich habe immernoch ein Problem mit deiner OrderSelect Funktion
du willst damit eine Position auswählen die laut deinem define eine Ticketnummer von 12345 hat. Gibt es so eine Position? Wenn nicht wird da auch keine ausgewählt und angepasst. |
|
|||
Bei Indices spricht man nicht von Pips, sondern von Punkten. Das wäre die erste Stelle links vom Komma. Keine Ahnung, welchen Wert Point beim DAX hat. Sollten es dann 70 Punkte beim DAX sein, dann müßte ja Point = 1 betragen.
Mittels MarketInfo(Symbol(),MODE_POINT)); bekommst Du das heraus. traderdoc PS. Wie @TopSecreT schon schrieb, wird es keine TickerNumber mit dem Wert der MagicNumber geben, also auch keine erfolgreiche Orderselektion.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Beim Ordnen des code ist mir gerade das Gleiche aufgefallen - super !!!, dass Ihr das bestätigt.
Im EA wird global "extern int MagicNumber = 12345;" vergeben. Später wird dann diese "MagicNumber" einmal für die "LongOrder", gleichzeitig aber auch für die "ShortOrder" übernommen. z.B: "if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true )" Wenn ich also deklariere "extern int MagicNumber = 12345;" und dann "int LongOrder, ShortOrder;" initiiere, (ich versuche hier erstmals die richtigen Fachbegriffe zu verwenden), müßte der code wahrscheinlich nochmals -SO- verändert werden: ... if(OrderSelect(LongOrder,SELECT_BY_TICKET)==true) { switch(OrderType()) { ... bzw.: ... if(OrderSelect(ShortOrder,SELECT_BY_TICKET)==true) { switch(OrderType()) { ... Sind diese Aussagen annähernd richtig und der code damit funktionsfähig? Und zu den pips, Punkten und Points: 1. DAX = natürlich Punkte ! / 2. Angaben dann aber mit 1 Kommastelle. Wäre dann nicht Point = 10 korrekt? Durch Eure Hinweise und Anregungen scheint sich "der Nebel so langsam zu lichten". Zumindest hab ich das Gefühl voranzukommen; - Danke, Danke, Danke und LG piptrade |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, scalper sl, sl, stoploss, stoploss ea, stoploss nachziehen |
|
|