Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Order öffnen und etwas mehr...

Geschrieben

Hallo,

 

ich bin wieder am Punkt wo ich einsehen muss, dass Programmierung autodidaktisch zu lernen nicht wirklich leicht ist wenn man vorher damit noch nie was zu tun hatte. Programmierung ist wohl momentan beim Trading meine größte Herausforderung aber Aufgeben ist keine Option :)

 

Folgendes versuche ich momentan umsetzen:

 

1. Es soll eine Order geöffnet werden und SL und TP soll direkt mitgesendet werden.

 

2. Requotes sollen mit der Nutzung von RefreshRates versucht werden besser in Griff zu bekommen. Mythos hat dazu freundlicherweise im "RefreshRates-Thread" (http://www.tom-next....0-refreshrates/) ein Orderhandling zur Verfügung gestellt good2.gif

 

3. Wenn die Order bestätigt geöffnet wurde soll einmal eine Bool-Variable aktiviert werden zB (Einstieg_Stattgefunden = true;)

 

4. Sollte die Order trotz dem Orderhandling bestätigt nicht geöffnet werden können soll einmal eine Bool-Variable aktiviert werden zB (Einstieg_gescheitert = true;)

 

 

Punkt 1 existiert und habe ich verstanden. So sieht es aus:

 

void Order_veranlassen()
{
double dBuyStopLoss=Ask-(BuyOrder_SL*Point);
double dBuyTakeProfit=Ask+(BuyOrder_TP*Point);
iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,Order1_Lot, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "Forex1+
kauft",MagicNumber,0,Green);
  if (iOrderOpenStatus<0)
  {
  iErrorNumber=GetLastError();
  Print ("Order fehlgeschlagen!: ", iErrorNumber);
  return;
  }
}

 

Ab Punkt 2 habe ich dann wegen fehlender Kenntnisse nicht mehr weiter gewusst. Das Orderhandling im Code von Mythos war autodidaktisch für mich zu anspruchsvoll daraus das Gewünschte rauszuziehen sowie Punkt 3 und 4 dann noch hinzuzufügen.

 

Hat vielleicht jemand eine Umsetzungsidee dafür ? Das wäre wirklich mehr als fantastisch würde mich riesig freuen !

 

Lieben Gruß

Featured Replies

Geschrieben

2. Requotes sollen mit der Nutzung von RefreshRates versucht werden besser in Griff zu bekommen. Mythos hat dazu freundlicherweise im "RefreshRates-Thread" (http://www.tom-next....0-refreshrates/) ein Orderhandling zur Verfügung gestellt good2.gif

 

3. Wenn die Order bestätigt geöffnet wurde soll einmal eine Bool-Variable aktiviert werden zB (Einstieg_Stattgefunden = true;)

 

4. Sollte die Order trotz dem Orderhandling bestätigt nicht geöffnet werden können soll einmal eine Bool-Variable aktiviert werden zB (Einstieg_gescheitert = true;)

 

Hat vielleicht jemand eine Umsetzungsidee dafür ?

 

Ich suche es später nochmal aus meinen Bibliotheken, hier vorab aber mal die Vorgehensweise:

 

zu 2.: Man bastelt sich einfach eine while-Schleife, die so lange durchlaufen wird, so lange Dein "iOrderOpenStatus"

 

zu 3./4.: Die Variable wird dann auch dementsprechend gesetzt, je nachdem welchen Wert "iOrderOpenStatus" hat.

Geschrieben

Hi Forex1+,

 

zugegeben der Code dort ist schon sehr ausgefeilt und stammt aus meiner TradeBox. Für Anfänger ist es sicher ein bissl heftig.

 

Ich versuch ihn mal runterzubrechen auf das was du brauchst:

 


void Order_veranlassen()
{
double dBuyStopLoss=Ask-(BuyOrder_SL*Point);
double dBuyTakeProfit=Ask+(BuyOrder_TP*Point);
int iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,Order1_Lot, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "Forex1+
kauft",MagicNumber,0,Green);
//soweit dein Code. jetzt musst du nur anstatt nur abzufragen ob die Order erfolgreich ist, sag "solange die Order nicht erfolgreich war: versuchs nochmal.
//vorher noch die Definition deiner bools:
boolean einstieg_stattgefunden= false;
boolean einstieg_gescheitert= false; //derweil is noch weder noch.
int anzahl_versuche= 0; //wir wollens ja nit ewig probieren, also zählen wir mit
while(result == -1) // -1 bedeutet ja "nicht erfolgreich"
{
//dieser Block ist reines Errorhandling, je nachdem welcher Error passiert ist wird entsprechend agiert
error=GetLastError();
switch(error)
{
 case ERR_SERVER_BUSY:
 case ERR_BROKER_BUSY:
 case ERR_TRADE_CONTEXT_BUSY:
Sleep(PAUSE_ON_BUSY);
break;  
 case ERR_TOO_FREQUENT_REQUESTS:
Sleep(PAUSE_ON_TOO_FREQUENT);
break;
 case ERR_NOT_ENOUGH_MONEY:
Alert(" We are broke!");
einstieg_gescheitert= true; //ohne geld kein weiterer versuch
break;
 case ERR_TRADE_TOO_MANY_ORDERS:
Alert("Too many open trades!");
einstieg_gescheitert= true; //bei zuvielen offenen orders macht weiter probieren auch keinen sinn
break;
}
//errorhandling ende

//mitzählen
anzahl_versuche++;
if(anzahl_versuche > 10) {
 einstieg_gescheitert= true;
} 
//wenn zuviel oder zu blöder Error: raus aus der schleife:
if(einstieg_gescheitert)
 break; 

//Vorbereitung für neuen Versuch:
RefreshRates(); //aktualisiere die Marktdaten;

//hier ggf. price, stoploss und takeprofit anpssen, ich lass es derweil weg

//nächster Versuch:
iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,Order1_Lot, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "Forex1+
kauft",MagicNumber,0,Green);
}
einstieg_stattgefunden= !einstieg_gescheitert;
}

 

so, da ich heut schon ein bissl müde bin bezeichne ich die möglichen Syntaxfehler und schlechte Einrückung einfach mal frech als ansporn zum autoditakten ;)

Bei Fragen einfach melden (so sachen wie switch etc. sind für neulinge sicher nit das einfachste). sobalds soweit verständlich ist können wir dann ja die price sl und tp anpassung dazubauen ;)

Geschrieben
  • Autor

Wow vielen Dank !

 

// die Zeilenkommentare helfen gewaltig den Code besser zu verstehen good2.gif

 

Über das rein und raus in die Schleife (völlig neu für mich) bzw den Chronologischen Ablauf muss ich jetzt erstmal grübeln :)

Befindet sich jetzt nur das Errorhandling in der Schleife die 10x wiederholt wird? also zwischen while(result == -1) und dem if(einstieg_gescheitert) break; ? wieso ist RefreshRates und der nächste Versuch hinter dem Brake? welcher Versuch wird wiederholt der oben oder der unten ? sorry für die blöden Fragen aber so ist das autoditakten eben ;)

Würde gerne die beiden Bools denn als globale Variablen definieren aber habe das Gefühl das diese Bools jetzt intern eine wichtige Rolle spielen...

Und was bedeutet das? "einstieg_stattgefunden= !einstieg_gescheitert; "

 

So das wär erstmal das was mir im Kopf rumgeht... morgen wenn ich wacher bin werd ich mich mal versuchen zu belesen was schleifen angeht hab mir schon ein c-lern-buch bestellt vielleicht lösen sich dann noch ein paar mehr Knoten im Gehirn ;)

 

Danke und Gruß

Bearbeitet von Forex1+

Geschrieben

Befindet sich jetzt nur das Errorhandling in der Schleife die 10x wiederholt wird? also zwischen while(result == -1) und dem if(einstieg_gescheitert) break; ? [...]

Und was bedeutet das? "einstieg_stattgefunden= !einstieg_gescheitert; "

Nein, es ist alles drin ab dem while bis zum Ende des Quelltextes (zu erkennen an den geschweiften Klammern - es gilt, dass immer die letzte geöffnete zuerst geschlossen wird). Das != bedeutet "ungleich". Mythos überprüft ja nur, ob der Einstieg erfolglos war. Am Ende ist es so, dass dann die Variante für den erfolgreichen Einstieg abhängig von dem erfolglosen gesetzt wird. Und da sie immer das Gegenteil ist, nimmt er das !=. Dies kann man auch anders (und auch mit globalen Variablen) lösen. Dazu müsste man aber wissen, wozu Du diese Variablen haben wolltest. Letztendlich kann man das ja auch mit nur einer Variable umsetzen.

Geschrieben
  • Autor
Die 2 globalen Variablen will ich nutzen, um je nach dem ob die Order geöffnet wurde oder noch nicht geöffnet wurde, verschiedene Funktionen anzusprechen. Wenn sicher bestätigt die Order geöffnet wurde soll eine Globale Variable Einstieg_Stattgefunden = true; gesetzt werden. (was dann bedingt, dass andere Funktionen angeprochen werden). Und wenn die Order trotz dem Orderhandling nicht geöffnet wurde dann soll eine Globale Variable Einstieg_gescheitert = true; gesetzt werden (was dann bedingt, dass zB der EA deaktiviert wird und mir eine Mail geschickt wird...)
Geschrieben

conglom-o hat das Meiste eh schon beantwortet.

 

Wenn du einen Editor hast der dir die Klammerpaare hervorhebt ist es etwas leichter ersichtlich was in welchem block ist. Aber hier hilft es sicher sehr wenn du dir erstmal grundlegend das Thema schleifen durchliest. zB im MQL Book.

Zum Break: break springt direkt aus dem aktuellen schleifenkörper (oder switch). Im aktuellen Code gibts ein Switch im schleifenkörper wodurch man aufpassen muss von welchem break man spricht. Hier is auch besser du liest dir erstmal die entsprechenden Teile im MQL Book durch.

 

Warum nach dem Break: das break beendet die schleife wenn zuoft probiert wurde oder ein massiver fehler aufgetreten ist. Falls dem nicht so ist (kein Grund die schleife zu beenden) gehts weiter und ich starte den nächsten Versuch. "Der nächste Versuch" ist in dem Fall der erneute Aufruf von OrderSend.

 

zum "= !": Typischer Stolperstein für Anfänger ist die exakte Syntax. Es spielt eine große Rolle ob ein Leerzeichen gesetzt ist oder nicht etc.

"!=" ist ein Operator der zwei Werte miteinander vergleicht und bei Gleichheit false ergibt, bei ungleichheit true.

"!" (also nur das Ausrufezeichen vor einem Wert) negiert diesen Wert (nur sinnvoll bei boolschen Werten).

"= !" ist kein operator sondern das sind 2 operatoren, die zuweisung "=" und die Negation "!"

a = !b wird jetzt schritt für schritt abgearbeitet:

1. b wird negiert (Negationsoperator)

2. der darausresultierende Wert wird a zugewiesen (Zuweisung)

In Summe: a hat danach im genau den gegenteiligen Wert von b (alles in boolscher Logik).

 

zu deinen globalen Boolschen: Wozu 2? Du kannst mit einer boolschen Variable ja 2 Werte ausdrücken.

Und da deine Werte ja immer gegengleich sind (Die Order ist immer "nicht ausgeführt" oder "ausgeführt".. tertium non datur) reicht es wenn du eine Variable "bOrderSent" nimmst und ggf. abfragst ob bOrderSent true (erfolgreich gesendet) oder false (nicht gesendet) ist.

  • 10 Monate später...
Geschrieben
  • Autor

Hallo

 

noch eine Frage dazu denn beim Kompilieren gibts noch 11 Fehler durch nicht definierte Variablen:

zB. diese: result, error, ERR_SERVER_BUSY, ERR_BROKER_BUSY, usw

Muss ich die Variablen einfach global definieren oder wie ist das?

 

Lieben Gruß

Geschrieben
  • Autor

Danke das hat schonmal die Hälfte ausgemacht es bleiben aber weiterhin diese:

 

result

error

error

PAUSE_ON_BUSY

PAUSE_ON_TOO_FREQUENT

 

Gruß

Geschrieben

@Forex1+ : kannst Du mal bitte die komplette Fehlermeldung zitieren oder einen Screenshot posten ? Ich habe nun sogar Google genutzt und finde die beiden letzten Begriffe (Pause_ON_...) nur hier bei TN . Noch nie erlebt . Aber vielleicht verstehe ich auch nur falsch . Daher .....

Gruß

KB

Geschrieben
  • Autor

Hi die vorige Auflistung entspricht genau den Fehlermeldungen nur das noch jeweils dahinter steht: variable not defined

Die Begriffe kommen auch nicht in der stderror.mqh vor das muss noch was anderes sein...?

Gruß

Geschrieben

Na ja, dann sollte es theoritsch einfach sein :

 

Irgendwo im Code benutzt Du diese Begriffe und wendest die Syntax dabei so an, dass der Compiler diese Kombination von Buchstaben als eine Variable erwartet .

Und keiner der Begriffe oben ist ein(e) vordefinierter Befehl oder MQL4-Variable .

 

Also mußt Du dies Variablen mit den Namen "result" , "error" etc etc definieren .

 

1.Tip : Klicke mal auf die Zeile in der der Compiler den Fehler ausgibt (unten im Bildschirm) . Dann öffnet sich (meistens !) automtisch die Codestelle, wo der Fehler gefunden wurde .

2.Tip : Poste hier die Befehlszeilen, wo Du diese Variablen benutzt . Dann kann ich Dir sagen, ob meine Vermutung zutrifft .

 

VG´s

KB

Geschrieben
  • Autor

Diese variablen die die fehler ausgeben finden sich ja alle im code von Mythos oben im Beitrag 3 schnell zu finden. Also die Frage ist muss ich die undefinierten Variablen einfach als globale Variable definieren ohne dabei die funktion zu zweckentfremden? Ich blick bei dem result und danach dem errorhandling nicht durch leider.

Lg

Geschrieben

sorry, bin erst in die aktuellen Post eingestiegen und habe die Vorgeschichte links liegen liegen und somit #3 überhaupt nicht wahrgenommen .

 

error=GetLastError();

GetLastError() ist ein Befehl, besser eine Funktion des MQL4 , welche eine ganzzahlige Variable als Ergebnis zurückgibt . Das hat Metatrader so definiert . Jede Zahl ist einem bestimmten Fehler zugeordnet , dass hast Du in dem Link erkannt .

 

Wenn Du das Ergebniss dieser Funktion nun einer anderen Variablen "error" zuordnen (die Zeile " error=GetLastError(); " ) willst, dann mußt diese andere Variable vorher definieren :

 

INT error ;

 

Nun hat Dir Mythos oben einen Code geschickt, der ebenfalls eine Funktion ist . Diese heißt "Order_veranlassen()" . Damit diese ausgeführt wird , muss man sie aufrufen , oft geschieht das durch das Hauptprogram , welches vielleicht vorher ein Handelssignal erkannt haben könnte und nun einen Trade beginnen möchte . So auch hier . Schon in der 4.Zeile kommt der Befehl "OrderSend()" . Nachdem dieser durchgeführt wurde guckt der Code ob alles fein ist . Wenn nicht, dann kommt die "-1" ,und das erkennt.der Code => etwas stimmt nicht !

Was nicht OK ist , dass weiß der Code jetzt noch nicht, dass muss er erst noch abfragen => "GetLastError()" klärt das Rätsel . Aber wieder nur eine Zahl, siehe oben .

Nun muß der Code noch wissen, welcher Fehler zu welchem Code gehört . Und, richtig von Dir vermutet, dass ist hier in dieser Funktion "Order_veranlassen()" nicht definiert und genauso wenig in der #include stderror.mqh , also mußt Du es an anderer Stelle selber machen .

 

Mythos hat das in seiner ITradeBox.mq4 , die Du Dir ggfs von TN downloaden und in Deinem Editor im Ordner LIB hinterlegen könntest, so gelöst :


#define MAX_TRIALS 10 // 50 ?
#define PAUSE_ON_BUSY 3000
#define PAUSE_ON_TOO_FREQUENT 10000

Wenn Du aber auf diese SUPERTOLLE Lösung von unserem Mythos verzichten willst, dann mußt Du genau diese Zeilen ganz an den Anfang Deines Code noch vor

INIT() , DINIT() und STart() stellen . Achtung !!! => Dadurch, durch diese Platzierung , sind diese Namen an allen Stellen Deines Code, in jeder Funktion , bekannt .

Wenn Du dort, am Anfang Deines Code auch noch den "INT error ;" und den "INT result ;" stellst , dann kommst Du weiter .

 

Aber halt ! result sollte Dir doch in dieser Funktion alleine ausreichen ? Oder mußt Du result überall in Deinem Code kennen ? Wenn nicht, dann prüfe mal die folgende Lösung und nutze result nur innerhalb dieser speziellen Funktion

 

void Order_veranlassen()
{
double dBuyStopLoss=Ask-(BuyOrder_SL*Point);
double dBuyTakeProfit=Ask+(BuyOrder_TP*Point);

int result ; // für Forex1+ die lokale Definition der Variablen result mit dem Format INTEGER == ganzzahlig

int iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,Order1_Lot, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "Forex1+
kauft",MagicNumber,0,Green);
//soweit dein Code. jetzt musst du nur anstatt nur abzufragen ob die Order erfolgreich ist, sag "solange die Order nicht erfolgreich war: versuchs nochmal.
//vorher noch die Definition deiner bools:

 

Also mal zusammenfassen :

1.) Der Code den Dir Mythos gepostet hat, #3 , ist alleine so nicht lauffähig (wie Du ja bemerkt hast) , sondern ist ein Ausschnitt aus seiner TradeBox die er uns allen geschenkt hat

2.) Sein Beispiel ist eine Funktion : Funktionen sind in sich geschlossen , sie verstehen sich als Anhängsel an andere Programme und sind alleine nicht lauffähig .

3.) a.) Variable können lokal definiert sein , dann muss man sie zu Beginn der Funktion definieren . b.) Sie können im ganzen Program bekannt sein , dann werden sie am Anfang des Programmes definiert sein und sind dann in allen Bereichen des Programmes inklusive aller Funktionen bekannt . c.) ACHTUNG : Dann gibt es noch globale Variablen die überall in Deinem Metatrader bekannt sind und die von mehreren EA aufgerufen,abgefragt und beschrieben werden können . Die braucht man dann, wenn sich unterschiedliche EA miteinander unterhalten oder sich nicht gegenseitig in das Gehege kommen sollen .

 

Nun wünsche ich Dir viel Erfolg und freue mich wenn es klappt und wenn nicht, dann frage bitte gerne weiter . Genauso habe auch ich gelernt .

 

KB

Geschrieben
  • Autor

Hey vielen Dank! Hat nun alles auf anhieb geklappt und gelernt hab ich auch wieder einiges :)

 

Lieben Gruß

Geschrieben

Sorry die späte Antwort: ja der Code ist ein Ausschnitt der TradeBox und das sind einfach von mir definierte Konstanten.

 

Das result ist eigentlich ein Fehler durch Copy&Paste. statt result sollte natürlich iOrderOpenStatus stehen.

  • 1 Monat später...
Geschrieben
  • Autor

Pardon hab noch eine Unklarheit gefunden zum result das ist der einzige Punkt wo ich noch nicht ganz durchsteige trotz der guten Hilfe. Welches "result" (kommt im Code 2 mal vor) muss ich denn durch iOrderOpenStatus ersetzen?

 

Gruß

 

PS: Entschuldigt mir die stark zeitverzögerten Fragen ich kann durch mein unregelmäßiges Leben nur schubweise am Trading arbeiten ;-)

Geschrieben
  • Autor

@Mythos

 

Perfekt. Stimmt die zweite war noch die Variable von der Erläuterung vom KB die kommt raus und das Ursprüngliche wird ersetzt

while (iOrderOpenStatus == -1)

Jetzt ist alles plausibel und danke nochmal für dein Code !

 

LG

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.