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)
-   -   Code Korrekturlesen: EA + manuelles Trading (http://www.expert-advisor.com/forum/showthread.php?t=6041)

AVT 12.03.18 22:40

Code Korrekturlesen: EA + manuelles Trading
 
Wäre jemand bitte so nett, meinen Code Korrektur zu lesen.

Ich hatte meinen EA geladen, der war erst mal inaktiv, also eröffnete ich manuell eine Position. Die lief immer noch, als eigentlich der EA das Entry Signal erhielt (und da ich gut im Plus war, wollte ich die Position auch nicht schließen). Der EA reagierte aber nicht. Als ich meine Position schloß, machte der EA seine Positionen auf - dumm gelaufen, viiieel zu spät um den Profit zu erreichen, den ich haben wollte. Schuld daran war folgende Zeile (immer wieder bin ich dieser Zeile begegnet):
Code:

if( OrdersTotal()==0 ) // && Signal, dann eröffne Position
Logisch, OrdersTotal bezieht sich auf den gesamten Account, und da ich drin war, war die Anzahl ==1 und der Entry verboten. Ich habe das umgeschrieben und bitte Euch mal einen Blick auf die Struktur zu werfen, ob das jetzt mit manuellem Trading vereinbar ist - oder ich noch irgendwas übersehen habe.
Code:

//====================== TRADING ===========================================
// !!! if OrdersTotal()==0 interferes with manual trading at the same time
  for(n=0; n<OrdersTotal(); n++)
  {  if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES))
      { 
//====================== no open orders by this EA =========================
        if    (  OrderMagicNumber()==EANo  // this EAs number
                && OrderComment()==EAname    // this EAs comment
                && OrderSymbol()==Symbol()    // this market
                && OrderType()!=OP_BUY        // no buy order from EA
                && OrderType()!=OP_SELL      // no sell order from EA
                )
        {
            // wait for buy/sell signal, then action
        }  // == end no open positions by this EA
//====================== some kind of open order ===========================
        // ===== open L running
        else if(  OrderMagicNumber()==EANo  // this EAs number
                && OrderComment()==EAname    // this EAs comment
                && OrderSymbol()==Symbol()    // this market
                && OrderType()==OP_BUY        // long orders
                )
        {
            // manage open L running
        }  // == end open L running
        //===== open S running
        else if(  OrderMagicNumber()==EANo  // this EAs number
                && OrderComment()==EAname    // this EAs comment
                && OrderSymbol()==Symbol()    // this market
                && OrderType()==OP_SELL      // short orders
                )
        {
            // manage open S running
        }  // == end open S running
     
      }  // == end OrderSelect(n,SELECT_BY_POS,MODE_TRADES)
  }  // == end for(n=0; n<OrdersTotal(); n++)

Vielen Dank. AVT

next user 13.03.18 12:08

Zitat:

Zitat von AVT (Beitrag 40523)
... ob das jetzt mit manuellem Trading vereinbar ist ...

Naja, manuelles und automatisches Traden kann man ja ganz leicht durch MagicNumber, Kommentar oder sonstwas trennen.
Hast'e ja auch (jetzt) im Code.

Zum Code:
Gleiche Bedingungen sollten immer zusammengefasst und nur einmal abgefragt werden. Ich habe deinen Code etwas reduziert.
Ich persönlich setze mehrere gleiche Funktionsaufrufe in eine Variable, daher habe ich hier einfach mal den Typ gespeichert.
Code:

uchar orderType = 0;

for(n=0; n<OrdersTotal(); n++)
{
  if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES))
  {
      orderType = OrderType();
 
      if(OrderMagicNumber() == EANo && OrderComment() == EAname && OrderSymbol() == Symbol())
      {
        if(orderType != OP_BUY && orderType != OP_SELL)
        {
            //====================== no open orders by this EA =========================
            // wait for buy/sell signal, then action
        }
        else if(orderType == OP_BUY)
        {
            // long orders
            // manage open L running
        }
        else
        {
            // short orders
            // manage open S running
        }
      }
  }
}


AVT 13.03.18 13:09

Danke Dir vielmals.

Zitat:

Zitat von next user (Beitrag 40535)
Gleiche Bedingungen sollten immer zusammengefasst und nur einmal abgefragt werden.
Ich persönlich setze mehrere gleiche Funktionsaufrufe in eine Variable, daher habe ich hier einfach mal den Typ gespeichert.
Code:

uchar orderType = 0;

Die Wiederholungen sind nur für das Step-by-Step gedacht, um zu sehen, ob und welche Bedingungen erfüllt sein müssen, damit die Logik stimmt. Ich bevorzuge in der Endfassung alles in eine Funktion zu packen.

Eine zusätzliche Frage: geht es nicht schneller, wenn man die sowieso schon vorhandene OrderType() benutzt, anstatt daß jedesmal Deine orderType ersetzt werden muß?

next user 13.03.18 13:25

Zitat:

Zitat von AVT (Beitrag 40540)
Eine zusätzliche Frage: geht es nicht schneller, wenn man die sowieso schon vorhandene OrderType() benutzt

Nein. In deinem Code rufst du 4 mal die Funktion "OrderType()" auf. Bei mir mache ich das nur einmal und habe dann die konstante
Integer-Variable zum vergleiche ect.

Zitat:

Zitat von AVT (Beitrag 40540)
... anstatt daß jedesmal Deine orderType ersetzt werden muß?

Bei jedem neuen Schleifendurchlauf ist "OrderType()" wieder eine andere Sache. Ob meine Variable oder "OrderType()" spielt keine Rolle.
Was aber einen unterschied macht, ist, ob eine Funktion unnötig mehrmals aufgerufen wird und dabei immer den gleichen Wert
zurückgibt, oder ob man diesen nur einmal abfängt und dann mit der gespeicherten Variablen weiterarbeitet.

AVT 13.03.18 14:11

Zitat:

Zitat von next user (Beitrag 40543)
Was aber einen unterschied macht, ist, ob eine Funktion unnötig mehrmals aufgerufen wird und dabei immer den gleichen Wert
zurückgibt, oder ob man diesen nur einmal abfängt und dann mit der gespeicherten Variablen weiterarbeitet.

:)
Stimmt, Betonung auf unnötig weil immer derselbe Wert, werde meinen Code daraufhin durchsehen, was sich sonst noch so optimieren läßt (obwohl die Optimierung eigentlich zum Schluß kommen sollte, wenn alles andere stimmt).

Danke für den Hinweis. AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:25 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