Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4764
Beiträge: 42383
Benutzer: 7.132
Aktive Benutzer: 139
Links: 83
Wir begrüßen unseren neuesten Benutzer: ric78
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 21:38).
Neue Benutzer:
vor 5 Tagen
- ric78
vor einer Woche
- salvacasa
vor einer Woche
- scargraffi...
vor einer Woche
- candletige...
vor 2 Wochen
- casalpablo

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 36
Gesamt: 37
Team: 0
Team:  
Benutzer:  Indikator-Trading
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 08.06.21
Neues Mitglied
 
Registriert seit: Jun 2021
Beiträge: 10
droyo33 befindet sich auf einem aufstrebenden Ast
Unhappy 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!
  #2 (permalink)  
Alt 08.06.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.579
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
  #3 (permalink)  
Alt 09.06.21
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 280
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 10.06.21
Neues Mitglied
 
Registriert seit: Jun 2021
Beiträge: 10
droyo33 befindet sich auf einem aufstrebenden Ast
Standard

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!
  #5 (permalink)  
Alt 10.06.21
Neues Mitglied
 
Registriert seit: Jun 2021
Beiträge: 10
droyo33 befindet sich auf einem aufstrebenden Ast
Standard

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
Angehängte Grafiken
Dateityp: png LotSize.png (3,8 KB, 4x aufgerufen)
  #6 (permalink)  
Alt 10.06.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.579
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

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.
  #7 (permalink)  
Alt 10.06.21
Neues Mitglied
 
Registriert seit: Jun 2021
Beiträge: 10
droyo33 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
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
  #8 (permalink)  
Alt 10.06.21
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.579
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von droyo33 Beitrag anzeigen
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
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #9 (permalink)  
Alt 11.06.21
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 280
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
        }
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2021 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------