|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Problem mit EA Verständnis (OrdersTotal())
Guten Tag Zusammen,
ich programmiere seit längeren an meinem EA. Habe bis dato alle Probleme selber lösen können aber nun stehe ich vor einem wobei ich eure Hilfe benötige! Und zwar möchte ich ein und den selben EA auf meheren Paaren laufen lassen (z.B.: EUR/USD, GBP/USD & GBP/CAD). Das klappt auch wunderbar er öffnet die Positionen wenn der das go bekommt. 1.Fall: if (OrdersTotal() == 1){ profitFac = 0.0003; }else if( OrdersTotal() > 1){ profitFac = 0.0003; total = OrdersTotal(); total = total / 10000; total = NormalizeDouble(total,Digits); profitFac = 0.0003 + total; Print("Profitfaktor betägt : ", profitFac); } Das ist die die erste Abfrage wo der EA rum spinnt und zwar möchte ich je mehr Orders ich offen habe (alle Währungspaare eingeschlossen) auch meinen Profit erhlöhen bevor der EA alle Positionen schließt. Das komische in diesem Fall, wählt er sich ein willkürliches Währungspaar aus (obwohl ich OrdersTotal abfrage ), schaut wie viele Orders von dem Paar offen sind (z.B. 5x EUR/USD)und zählt nur das Paar auf den Profit zusammen (obwohl 10 Orders offen sind 5x EUR/USD und 5x GBP/USD). Ich hoffe man kann verstehen was ich meine... Zweitens, im selben EA: if(AccBal < 4000){ if(OrdersTotal() >= 9){ lotSize = 0.02; }else if(OrdersTotal() <= 9){ lotSize = 0.01; } ich möchte die LotSzize erhöhen und zwar wenn ich 10 Orders (für nur jeweils ein Paar!!) offen habe. Hier wiederum zählt er alle geöffneten Orders zusammen und erhöht nach der 10 Order die Lotsize. Bsp: Er soll 9x EUR/USD zu 0.01 öffnen bevor er beim 10. EUR/USD auf 0.02 erhöht. Der EA macht aber: 5x EUR/USD 0.01 Lot 5x GBP/USD --> 4x 0.01 Lot und bei der 10. Order 0.02 GBP/USD er soll aber erstmal 10 Orders einer einizgen Wähung aufhaben, bevor er die LotSize erhöht.... Ich verstehe nicht warum er im 1.Fall, jedes Währungspaar einzelt anschaut und im 2. Fall unten alle Paare obwohl ich OrdersToTal() benutze. Mit Ordersymbol() == Symbol() habe ich rum probiert klappt aber tzd nicht... Weiß jemand woran es liegen kann? Mit freundlichen Grüßen Dennis! |
|
|||
Den zweiten Teil erledigt der EA deshalb nicht richtig, weil er halt alle Orders berücksichtigt. Da muss mit OrderSymbol() == Symbol() selektiert werden.
(OrderSymbol() und nicht Ordersymbol()) Den ersten Teil erledigt er nicht richtig, weil uns irgendetwas fehlt. Denn würde der Code nur so sein wie er da steht, dann würden auch alle Orders berücksichtigt werden. Also, was verschweigst Du uns im 1. Fall? traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Zunächst einmal danke für die raschen Antworten!
Zum ersten Fall: profitFac & profit sind jeweils double Variablen, die vor der OnTick Funktion deklariert sind. Ich muss gestehen im zweiten Fall habe ich den Code hier etwas abgeändert weil ich dachte der gesamte Code wäre irrelevant, vllt liegt es an der zusätlichen Abfrage die ebenfalls erfüllt sein muss: if (OrdersTotal() == 1){ profitFac = 0.0003; }else if(profitC == 1 && OrdersTotal() > 1){ profitFac = 0.0003; total = OrdersTotal(); total = total / 10000; total = NormalizeDouble(total,Digits); profitFac = 0.0003 + total; profitC = 0; } und zwar ist in der if else (profitC == 1); diese Variable bewirkt, dass der Compiler nicht nach jedem Tick in die Funktion geht, sondern erst wenn eine neue Order gesendet wurde, siehe folgenden Codeabschnitt: int executeShort(){ entry = Bid; NormalizeDouble(entry,Digits); ticket = OrderSend(Symbol(),OP_SELL,lotSize,Bid,1000,0,0,Co mmentary,Magic); comC = 1; profitC = 1; return ticket; } gilt analog für Long Orders! Hier wird profitC auf 1 gesetzt, da eine neue Order gesendet wurde. Anschließend kann der Compiler oben in die Abfrage und den ProfitFaktor berechenen. Liegt das nun daran, dass ich den EA ja auf 4 verschiedenen Währungen laufen lasse und wenn eine Order für bpsw. EUR/USD gesendet wurde profitC auf 1 gsetzt wird, er dann deshalb für den EUR/USD EA in die Fu nktion geht und den Profit nur für EUR/USD errechnet? Aber OrdersTotal() ist doch wie Timo erwähnt hat eine "globale Abferage und gilt immer für alle ORders...", deshalb wäre müsste es doch deshalb trotzdem funktionieren... Ohne die zusätzliche Abfrage würde sich profitFac ins unermessliche steigern, deshalb die Abffrage! Zum zweiten Fall, da probiere ich nochmal OrderSymbol() == Symbol() aus und melde mich! Vielen lieben Dank! Nettes Forum und schnelle Hilfe, SUPER! |
|
|||
Zum zweiten Fall, habe gerade nochmal die Abfrage OrderSymbol() == Symbol () vor geschaltet
if(OrderSymbol() == Symbol()){ if(AccBal < 4000){ if(OrdersTotal() >= 9){ lotSize = 0.02; }else if(OrdersTotal() <= 9){ lotSize = 0.01; } funktioniert für das erste Paar wo in den EA aufspiele, beim 2 Paar fängt er an zu meckern und es kommt folgender Error (siehe Bild) Warum ist hier die Abfrage nicht korrekt? Spiele ich den EA bswp. als erstes auf EUR/USD auf funkitoniert OrderSymbol == Symbol. Beim 2. Paar z.B. GBP/USD ist OrderSymbol() immer noch EUR/USD und somit ist die Abfrage OrderSymbol() == Symbol () für GBP/USD false! Warum er bei 2,. Paar spinnt weiß ich leider nicht... MFG Dennis |
|
|||
Das ist ein OrderSend-Fehler. Der kann gar nichts mit dem Code zu tun haben.
Zum ersten Fall: Es bleibt dabei, dass mittels OrdersTotal() alle Orders abgefragt werden. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Zitat:
Den ersten Fall, check ich nochmal! Bei zweiten Fall ist es so, dass er die LotSize ausrechnet, die er anschließend für die OrderSend Funktion benötigt. ticket = OrderSend(Symbol(),OP_BUY,lotSize,Ask,1000,0,0,Commentary,Magic); und ohne LotSize keine Tradeeröffnung möglich. MFG Dennis |
|
|||
Zitat:
Aus dem Code sind zwei Definitionen zu erlesen: lotSize = 0.01 lotSize = 0.02 Das sind Lotgrößen bei Währungspaaren, mit denen in der Regel kein Fehler ausgegeben werden würde. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
||||
Das Problem könnte daran liegen, dass du nicht in jedem Fall die Lotsize setzt.
Hier wird es auf jeden Fall gesetzt: Code:
if(OrderSymbol() == Symbol()) { if(AccBal < 4000) { if(OrdersTotal() >= 9) lotSize = 0.02; else lotSize = 0.01; } else lotSize = 0.01; // dieser Wert ist hier nur eine Annahme } |
Lesezeichen |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|