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)
-   -   Problem mit EA Verständnis (OrdersTotal()) (http://www.expert-advisor.com/forum/showthread.php?t=7018)

droyo33 08.06.21 22:30

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!

traderdoc 08.06.21 23:12

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

Indikator-Trading 09.06.21 11:58

Zu deinem ersten Fall:
OrdersTotal() wird dir immer alle Positionen zurückgeben. Dass das in deinem Fall nicht klappt, wird hier an einen anderen Codeabschnitt liegen.
Dafür kann es verschiedene Gründe geben.

Sind profitFac und total eine double Variablen? Wann werden Sie gesetzt? Was passiert mit profitFac wenn OrdersTotal() == 0 ist?

Dein zweites Problem hat traderdoc ja schon beantwortet.

Gruß Timo

droyo33 10.06.21 21:51

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!

droyo33 10.06.21 22:38

Liste der Anhänge anzeigen (Anzahl: 1)
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

traderdoc 10.06.21 22:56

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

droyo33 10.06.21 23:00

Zitat:

Zitat von traderdoc (Beitrag 45481)
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

Danke für die Antwort!

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

traderdoc 10.06.21 23:50

Zitat:

Zitat von droyo33 (Beitrag 45482)
Danke für die Antwort!

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

Wo rechnet der EA die lotSize aus?
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

Indikator-Trading 11.06.21 08:55

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
        }



Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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