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)
-   -   MQL4 Starthilfe (http://www.expert-advisor.com/forum/showthread.php?t=5964)

Lampe 17.01.18 19:56

Vielen Dank für deine Antwort und den Link Adlerauge. Zur gegebener Zeit werde ich die Stunden mal investieren.

Einen groben Überblick zu C und entsprechende Tutorials habe ich bereits gesehn, jedoch kenn ich dadurch natürlich nicht alle Möglichkeiten.

Und eines sei klar gesagt, so geht es mir jedenfalls, theoretisch angeeignetes Wissen zu C ist eine Sache, die praktische Umsetzung in MQL4 ist nochmal eine andere.

Ich suche daher weiterhin nach einer Lösung für mein obiges Problem.

Wenn ich mit AccountBalance den Kontostand auslese, kann ich dadurch meine Lotsize berechnen.

Ich suche aber einen Weg den jeweiligen Kontohöchststand zur Berechnung zu nutzen und somit nutzt mir AccountBalance alleine nichts. Ich müsste die dort ausgelesenen Werte irgendwie Speichern um dann den Höchstwert rauszufinden.

Ich könnte die Werte eventuell in einem Array speichern?

Wenn ja, kann mir dann bitte irgendwer mal kurz sagen wie eine entsprechende Codezeile auszusehen hat?

Trader6666 17.01.18 22:28

arrays benötigst du nur, wenn du mehrere Werte abspeichern und aufrufen möchtest, ansonsten ist das eher unnötig, hängt natürlich auch davon ab was du machen möchtest, deswegen kann man das nicht pauschalisieren.

von der Logik her ganz einfach:
Code:

double Kontostand  = AccountBalance();
double Höchststand = 0.0;

if(Kontostand > Höchststand)
{
  Höchststand = Kontostand;
}
else
{
  Höchststand = Höchststand ;
}

sollte so klappen, musst natürlich schauen dass du das vernünftig in deinem Code platzierst.

Lampe 17.01.18 22:39

Hallo Trader6666, freut mich das du wieder vorbei schaust! :)

Ich habe es mittlerweile ganz genau so gelöst, es funktioniert auch soweit ganz gut.

Für meine Zwecke reicht die Variante aber auf lange Sicht sehe ich da zwei Probleme.

1. laufen mehrere EAs auf einem Konto kann man nicht mehr so einfach den Kontostand verwenden sondern müsste irgendwie schaun das man jedem EA einen eigenen Kontostand zuweißt.

2. und das ist eigentlich der derzeit relevanterer Punkt für mich. Da der Kontohöhststand nicht gespeichert wird, wären die Daten weg wenn der EA mal abstürzt und nicht mehr läuft oder?

Als Beispiel Kontohöhstand steht bei 1000 Euro, dann macht man 100 Verlust und der EA stürzt ab. Wenn man ihn dann wieder auf den Chart zieht wären diese 900 Euro der Höhststand.

Oder täusche ich mich da?

Lampe 18.01.18 21:49

So jetzt muss ich auch nochmal eine dumme Frage stellen.

Ich habe in der OnTick Funktion die OrderSend Funktion und möchte die LotSize Berechnung ausserhalb der OnTick Funktion berechnen lassen.

Code:

OnTick
{
ShortOrder1=OrderSend(NULL,OP_SELLSTOP,LotSize,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
}

double LotSize
      {
      (10);
      }

Die 10 ist natürlich nur ein Platzhalter, dort folgt später eine größere Berechnung.
Allerdings klappt das so nicht, kann mir jemand sagen was ich anders machen muss damit ich Berechnungen aus der OnTick Funktion auslagern kann?

Trader6666 19.01.18 10:54

das ist der Moment wo du dich einlesen solltest in das Thema Funktionen.


OnTick Funktion bedeutet, dass der Code der in der OnTick enthalten ist, bei jedem Tick ausgeführt wird. Deshalb sollte jede Aktion, die nicht mit jedem Tick gemessen/gebraucht wird, auch dort verschwinden. So läuft das ganze auch reibungsloser.


Code:


bool Funktion()
{

return();
}

double Funktion()
{

return();
}

int Funktion()
{

return();
}

Jeder dieser Funktionen gibt dir einen Rückgabewert zurück, sprich eine Information die du benötigst. Du musst halt wissen was du benötigst.
In der OnTick, werden idR. die Signale ermittelt, wenn sich eines ergibt, dann rufe eben eine Funktion auf, die einen Trade setzt, denn dann brauchst du Sie ja auch nur.

Code:


OnTick()
{

    if(Signal == true)
      {
        Order_oeffnen();
      }

}

void Order_oeffnen()
{

    Lots_ermitteln();
 
    OrderSend(......Variable Lotsize bei Orderlots einsetzten....);

}


double Lots_ermitteln()
{

  //Lotsize ermitteln und in einer Variablen speichen....

return(Varible für die Lotsize);
}

am bequemsten ist es die Lotsize Variable Global zu speichern, ist aber natürlich jedem überlassen wie er es händelt.

traderdoc 19.01.18 15:28

Ich habe das nun schon oft geschrieben. Das Erlernen der Sprache MQL4/5 ist relativ einfach, vorausgesetzt, es bestehen gewisse Grundkenntnisse in der Programmierung allgemein und der feste Wille mit fast eigenene Kräften diese Sprache zu erlernen. Warum aus eigenen Kräften? Nicht weil dem User hier keine Hilfe zuteil kommen soll, sondern, weil ich selbst erfahren habe, dass das eigene Beschäftigen mit bereits vorhandenem und funktionierenden Code die beste Schule für einen selbst darstellt. Das in Verbindung mit der Hilfe über F1 sollte nahezu schon ausreichen, um relativ schnell voranzukommen.

Solch eine Fragestellung, wie eine Funktion in den Code integriert wird, kann man locker aus bestehendem Code sehr leicht erlesen. D.h. das Aneignen von Grundkenntnissen, sollte nun wir´klich im Selbststudium absolviert werden.

Und ich erinnere auch gern nochmals an den gut strukturierten Code, wenn er denn hier gepostet wird, als Voraussetzung für eine schnelle Hilfe. Und nicht nur, dass damit dem Beantworter das Leben einfacher gestaltet wird, sondern es geht mir auch darum, dass sich alle "Anfänger" von vornherein einen sauberen Codierungsstil angewöhnen, um später die eigenen Programme schneller lesen zu können.

traderdoc

Lampe 19.01.18 17:56

Um nochmal kurz zur Code Strukturierung zu kommen. Ich weiß nicht ob es nur bei mir so ist aber beim kopieren aus dem MetaEditor hier ins Forum, übernimmt er die Abstände nicht. Das heißt es wird so kopiert das jede Zeile Linksbündig steht. Ist das nur bei mir so?

Ich muss nochmal auf die Funktionen zurück kommen denn es mag nicht so ganz klappen.

Code:

OnTick

Kontostand=AccountInfoDouble(ACCOUNT_BALANCE);
 
  if(Kontostand>KontoHigh)
      {
      KontoHigh=Kontostand;
      }

  KontoHoch=NormalizeDouble(KontoHigh,Digits);

if(a==0)
        {
        LotSize=LotSizeBerechnung();
        LongOrder1=OrderSend(NULL,OP_BUYSTOP,10,KaufPreis,NULL,VerkaufPreis,0,"DAX_H1_StrategieLong",MagicNummer,0,clrGreenYellow);
        ShortOrder1=OrderSend(NULL,OP_SELLSTOP,10,VerkaufPreis,NULL,KaufPreis,0,"DAX_H1_StrategieShort",MagicNummer,0,clrRed);
            {
            if((LongOrder1>0)&&(ShortOrder1>0))
              {
              TradeActionZehnUhr++;
              }
            }
        }

Jetzt möchte ich wie oben ersichtlich die LotSize in der Funktion LotSizeBerechnung berechnen:

Code:

double LotSizeBerechnung()
        {
        if(KontoHoch<7500)
            {
            LotSize=10.0;
            return(LotSize);
            }
        }

Er gibt mir beim Copilieren den Fehler aus:

')' - not all control paths return a value


Ich kann mir vorstellen das der Wert "KontoHoch" nicht in der Funktion ankommt, könnte ist das der Fehler?

Adlerauge 19.01.18 18:33

PHP-Code:

double LotSizeBerechnung()
  {
   if (
KontoHoch 7500)
     {
      
LotSize=10.0;
     }
   return(
LotSize);
  } 

so geht's, return(....) muss vor der letzten Schweifklammer stehen.

Lampe 19.01.18 18:52

Vielen Dank Adlerauge!

MfG
Lampe

Lampe 19.01.18 20:03

Entschuldigung aber ich möchte nochmal den Post von Trader6666 aufgreifen und allgmeine Programmier Frage stellen.

Trader6666 schrieb man sollte alles was nicht wirklich mit jedem Tick berechnet wird auslagern in seperate Funktionen. Der Gedanke leuchtet mir auch soweit ein, allerdings stelle ich mir eine Frage.

Wenn man OnTick eine if Bedingung formuliert wie Beispielsweise oben verwendet:

Code:

if(Longsignal=true)
  {
  OrderSenden();
  }

Dann wird doch bei jedem Tick nur und ausschließlich die erste if Zeile gelesen, und nur dann wenn die stimmt, geht das Programm doch in die Berechnung die innerhalb der geschweiften Klammern steht.

Welchen Vorteil bietet es dann wenn man OrderSenden() auslagert wenn sie eh nur berechnet wird wenn die if Bedingung stimmt?

Oder andersrum gefragt, welche Nachteile habe ich wenn die Berechnung einfach dann OnTick berechnen lasse?

Ich würde mich über ein kurzes Feedback freuen.

Mit freundlichen Grüßen
Lampe


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