Abenteuer eines Neulings - Seite 3

 
niko:

Vielen Dank Cloudbreaker! Das fängt an, ein bisschen mehr Spaß zu machen, ich wusste nicht, dass man eine Funktion innerhalb eines Returns aufrufen kann (obwohl es wahrscheinlich im mql-Buch steht, so wie alles andere theoretisch). Schöner Hubschrauber EC 155! Warum 'zum Glück', willst du nicht deinen eigenen Hubschrauber?

Frage Aero HC2:


Ich habe bis jetzt 3 Skripte für meine Strategie. 2 sind uni-direktional, 1 ist bidirektional (das ist das, an dem wir hier arbeiten).

Sollte ich nach Ihrer Erfahrung mit MT4 ernsthafte Probleme erwarten, wenn ich verschiedene Skripte an 5 oder mehr Paare auf dem Bildschirm anhänge (1 Skript pro Paar). Das ist einfacher für mich, als 1 großes Skript zu programmieren oder zu ändern und dieses Skript das gewünschte Paar auswählen zu lassen (da dies eine tägliche Änderung des Codes erfordern würde)?

 
niko:

Frage Aero HC2:


Ich habe bis jetzt 3 Skripte für meine Strategie. 2 sind uni-direktional, 1 ist bidirektional (das ist das, an dem wir hier arbeiten).

Sollte ich nach Ihrer Erfahrung mit MT4 ernsthafte Probleme erwarten, wenn ich verschiedene Skripte an 5 oder mehr Paare auf dem Bildschirm anhänge (1 Skript pro Paar). Wäre das einfacher für mich, als 1 großes Skript zu programmieren oder zu ändern und dieses Skript das gewünschte Paar auswählen zu lassen (da dies eine tägliche Änderung des Codes erfordern würde)?

Unter der Annahme, dass wir hier über eine einzige Handelsstrategie für alle Währungspaare sprechen :-

Ich ziehe es vor, meine EAs paar-agnostisch zu machen - d.h. derselbe EX4 kann mit jedem Paar verbunden werden.

-Auf diese Weise haben wir nur eine Codebasis zu pflegen.

-Die Logik bleibt so einfach wie möglich.

 
cloudbreaker:

Unter der Annahme, dass wir hier über eine einzige Handelsstrategie für alle Währungspaare sprechen:.

Ich ziehe es vor, meine EAs paar-agnostisch zu machen - d.h. derselbe EX4 kann mit jedem Paar verbunden werden.

-Auf diese Weise haben wir nur eine Codebasis zu pflegen.

-Die Logik bleibt so einfach wie möglich.

Ja, das wäre ideal, aber ich setze jeden Tag einen manuellen Filter für jede Währung, der nicht auf einem Indikator basiert, und es stellt sich heraus, dass es 3 Strategien sind, obwohl die Idee die gleiche ist. Das würde den Code in meinen Augen sehr umfangreich machen und es wäre mühsam, ihn täglich anzupassen, wenn wir alles zusammenfügen würden. In naher Zukunft werde ich den Filter programmieren, um meine Arbeitszeit zu verkürzen, aber es gibt immer Dinge, die man nicht programmieren kann (90% müssen programmiert werden, für den Rest ist das Gehirn da, denke ich. Obwohl ich dem "heiligen Gral" nachgejagt bin, bevor ich versucht habe, alles zu programmieren und das perfekte Modell zu entwickeln (haha, das geht in die falsche Richtung).


Ich werde die 2 Strategien diesen Montag live schalten, da der Code dafür fertig ist. Sie wurden manuell von meinem Schwiegervater und mir selbst ein wenig ausgeführt, Kodierung sollte höhere Ergebnisse bringen. Für die Kombinierte Strategie kann ich 2 EA's auf demselben Chart starten (eine für Long eine für Short), aber ich will noch lernen, also werde ich den Kodierungsprozess wieder aufnehmen. Also erwarten Sie viele Fragen zu kommen sehr bald!


In welchem Land sind Sie ansässig? Ich bin in London, UK.

 

Hallo Cloudbreaker und andere mt4-Gurus hier!


Frage: Ich habe 2 Skripte (eines ist zum Kaufen, das andere zum Shorten). Ich wollte beide heute auf 3 Paare verwenden. Nun, da nur 1 EA an einen Chart angehängt werden kann, habe ich 6 Charts geöffnet (2 pro Paar) und die Skripte an diese angehängt. Es wurde jedoch nur 1 Skript ausgeführt. Ich habe keine Ahnung, warum. Kann mir jemand helfen?


Also, um zusammenzufassen: 2 EAs, eine tut nur kaufen eine andere nur tut Leerverkäufe, sehr grundlegende Regeln (goldenes Kreuz auf emas und das ist es), Gewinn nehmen 20 Pips, kein Stop-Loss. Warum wird nur 1 ausgeführt? Ich habe überprüft, dass Expert Advisors aktiviert war, und alle Skripte hatten lächelnde Gesichter neben ihnen in den Charts.

 
niko

Hallo Cloudbreaker und andere mt4-Gurus hier!


Frage: Ich habe 2 Skripte (eines ist zum Kaufen, das andere zum Shorten). Ich wollte beide heute auf 3 Paare verwenden. Nun, da nur 1 EA an einen Chart angehängt werden kann, habe ich 6 Charts geöffnet (2 pro Paar) und die Skripte an diese angehängt. Es wurde jedoch nur 1 Skript ausgeführt. Ich habe keine Ahnung, warum. Kann mir jemand helfen?


Also, um zusammenzufassen: 2 EAs, eine tut nur kaufen eine andere nur tut Leerverkäufe, sehr grundlegende Regeln (goldenes Kreuz auf emas und das ist es), Gewinn nehmen 20 Pips, kein Stop-Loss. Warum wird nur 1 ausgeführt? Ich habe überprüft, ob die Expert Advisors aktiviert waren, und alle Skripte hatten lächelnde Gesichter neben sich in den Charts.



Was sagen die Logdateien aus, d. h. die im Verzeichnis logs und die im Verzeichnis experts?

Erhalten Sie Meldungen wie "Trade Context Busy"? Wenn ja, würde ich empfehlen, eine Logik hinzuzufügen, die die Funktion IsTradeAllowed() verwendet.

Wenn nicht, dann würde ich empfehlen, Ihre EAs mit Print()-Anweisungen zu überhäufen.

 
cloudbreaker wrote >>

Was sagen die Protokolldateien aus, z. B. die im Verzeichnis logs und die im Verzeichnis experts?

Erhalten Sie Meldungen wie "Trade Context Busy"? Wenn ja, dann würde ich empfehlen, eine Logik hinzuzufügen, die die IsTradeAllowed()-Funktion verwendet.

Wenn nicht, dann würde ich empfehlen, Ihre EAs mit Print()-Anweisungen zu überhäufen.

Hallo Cloudbreaker! Danke, dass du mir hilfst!

1. Was meinst du mit Log-Verzeichnis? Wie komme ich an diese beiden Verzeichnisse heran? (Ich habe versucht, es über C>Programme>MT4>Experts>Logs zu öffnen, aber der Ordner ist leer).

 
niko wrote >>

Hallo Cloudbreaker! Danke, dass du uns gerettet hast!

1. Was meinst du mit Log-Verzeichnis? Wie komme ich an diese beiden Verzeichnisse heran? (Ich habe versucht, sie über C>Programme>MT4>Experts>Logs zu öffnen, aber der Ordner ist leer).

Hallo Wolkenbrecher!

Ich habe deine Kommentare zur Codierung schon oft gelesen (ich habe sie alle an meiner Pinnwand gepostet) und versucht, alles zu verstehen und zusammenzufügen, aber ich bin immer noch völlig ratlos. Soweit ich gekommen bin, habe ich die Funktion MyOrderCount aus einem anderen EA kopiert, aber ich habe immer noch keine Ahnung, wie ich das in den Code integrieren soll. Ich bin völlig überfordert, aber das heißt nicht, dass wir nicht weiterkommen können. Wenn Sie mir helfen könnten, den Code Stück für Stück aufzubauen (und mich auf vielleicht spezifischere Dinge hinweisen, die ich auch selbst aufbauen könnte), dann werden wir den Code fertig bekommen und ich werde viel schneller lernen.

Ich habe den Code angehängt, so weit ich damit gekommen bin, und auch die Karte des Programmdesigns, so wie ich es sehe. Machen Sie sich keine Sorgen über die kleinen Dinge wie Klammern im Code, ich werde sie mit Notepad++ überprüfen, während wir weitermachen.

Das Wichtigste ist, dass Sie mir helfen, den MyOrderCount-Code Schritt für Schritt in den Rest zu integrieren, und bitte erklären Sie mir alles Stück für Stück, während wir weitermachen. Sie können mich auch auf bestimmte Teile des Buches oder ähnliches verweisen, wenn Sie es für angebracht halten. Auf diese Weise werden wir viel schneller vorankommen.

Herzlichen Dank dafür!

ps: Lassen Sie mich wissen, wenn die Programmkarte nicht angehängt wurde

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps: bitte ignorieren Sie die zufälligen // Kommentare im Code, sie stammen aus alten Notizen

 
niko wrote >>

Hallo Wolkenbrecher!

Ich bin deine Kommentare zum Thema Coding schon oft durchgegangen (ich habe sie alle an meiner Pinnwand gepostet) und habe versucht, alles zu verstehen und zusammenzuflicken, aber ich bin immer noch völlig ratlos. Soweit ich gekommen bin, habe ich die Funktion MyOrderCount aus einem anderen EA kopiert, aber ich habe immer noch keine Ahnung, wie ich das in den Code integrieren soll. Ich bin völlig überfordert, aber das heißt nicht, dass wir nicht weiterkommen können. Wenn Sie mir helfen könnten, den Code Stück für Stück aufzubauen (und mich auf vielleicht spezifischere Dinge hinweisen, die ich auch selbst aufbauen könnte), dann werden wir den Code fertig bekommen und ich werde viel schneller lernen.

Ich habe den Code angehängt, so weit ich damit gekommen bin, und auch die Karte des Programmdesigns, so wie ich es sehe. Machen Sie sich keine Sorgen über die kleinen Dinge wie Klammern im Code, ich werde sie mit Notepad++ überprüfen, während wir weitermachen.

Das Wichtigste ist, dass Sie mir helfen, den MyOrderCount-Code Schritt für Schritt in den Rest zu integrieren, und bitte erklären Sie mir alles Stück für Stück, während wir weitermachen. Oder Sie können mich auch auf bestimmte Teile des Buches oder ähnliches hinweisen, wenn Sie das für angebracht halten. Auf diese Weise werden wir viel schneller vorankommen.

Herzlichen Dank dafür!

ps: Lassen Sie mich wissen, wenn die Programmkarte nicht angehängt wurde

ps: bitte ignorieren Sie die zufälligen // Kommentare im Code, sie stammen aus alten Notizen

Hallo Niko

Darf ich meine Meinung zu dieser Diskussion äußern,

Als alter, fast schon antiker :), Programmierer mit ein wenig Lehr- und Schulungserfahrung bin ich im Laufe meiner Zeit auf eine ganze Menge schlechten Code gestoßen. Ein häufiger Fehler, der zu schlecht geschriebenem Code führt, ist mangelnde Planung. Es mag offensichtlich sein, aber Sie müssen wirklich festlegen, was Sie tun wollen, bevor Sie versuchen, es zu programmieren. Das mag wie zusätzliche Arbeit erscheinen, aber auf lange Sicht werden Sie dadurch viel Zeit sparen und einen zuverlässigeren, verständlicheren und leichter zu wartenden Code produzieren.

Eine sehr nützliche Technik zur Spezifizierung von Computercode ist die sogenannte Pseudocodierung. Im Grunde handelt es sich dabei um eine logische Reihe von computerähnlichen Anweisungen, die in einfachem Englisch geschrieben sind. Es ist kein bestimmtes Format vorgeschrieben, aber Sie können den typischen Computerprogramm-Jargon verwenden, der in der einen oder anderen Form in fast jeder Computerprogrammiersprache zu finden ist.

Hier ist ein Beispiel für einen Pseudo-Code zum Kochen von Käse und Makkaroni. Ich habe es dem Artikel "Intro to Programming by Patrick Nouvion" auf der IBFX-Website entnommen. Der gesamte Artikel ist es wahrscheinlich wert, gelesen zu werden. http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

STARTEN SIE
Milch, Butter und Kraftkarton suchen
Wenn gefunden, weiter
sonst Kind in den Laden schicken

Finde Topf im Schrank

Wenn gefunden, weitergehen, sonst Frau bitten, bei der Suche zu helfen

Finde den Herd
Wenn gefunden, weiter
sonst Pizza bestellen

Prüfen, ob ein Brenner frei ist
Wenn vorhanden, weiter
sonst zur Verfügung stellen

Herd auf hohe Stufe stellen
Wasser suchen
Wenn gefunden, weiter
sonst Pizza bestellen

Wasser in den Topf geben
Sicherstellen, dass der Herd heiß ist
wenn heiß, weiter
sonst prüfen, ob der Stecker eingesteckt ist
sonst Reparaturmann anrufen und Pizza bestellen

Topf auf den Brenner stellen
wenn Sie Salz haben, fügen Sie eine Prise Salz hinzu
wenn nicht, weitermachen
wenn Sie Pfeffer haben, fügen Sie eine Prise Pfeffer hinzu
wenn nicht, weiter
solange das Wasser nicht kocht, warten
Kraft-Schachtel öffnen
die Makkaroni aus der Packung in den Topf geben
8 Minuten warten
während des Wartens, wenn der Topf überkocht, die Hitze reduzieren und pusten
Sieb finden
Makkaroni im Sieb abtropfen lassen
zurück in den Topf geben
Inhalt des Käsepakets hinzufügen
Butter hinzufügen
1 Esslöffel Milch hinzugeben
umrühren, um zu kombinieren
wenn zu dick, 1 Esslöffel Milch hinzufügen; wenn nicht, essen
ENDE

Wenn ich diesen Pseudocode selbst schreiben würde, würde ich ihn noch ein wenig verfeinern, indem ich ihn in Funktionsblöcke aufteile und ein wenig einrücke, damit er "hübsch" aussieht. Zum Beispiel

START BLOCK - Kochendes Wasser vorbereiten

Wasser in den Topf geben

Topf auf den Brenner stellen
wenn Sie Salz haben, fügen Sie eine Prise Salz hinzu
wenn nicht, weiter
wenn Sie Pfeffer haben, fügen Sie eine Prise Pfeffer hinzu
wenn nicht, weiter
solange das Wasser nicht kocht, warten

END BLOCK - Bereite kochendes Wasser vor

und so weiter....

Niko, ich gratuliere dir, dass du lernen willst, deinen eigenen Code zu schreiben. Meiner Erfahrung nach ist der schnellste und einfachste Weg zu lernen, das zu tun, was du tust, und es einfach mal auszuprobieren. Ich würde allerdings vorschlagen, dass Sie einen kurzen Schritt zurückgehen und in Pseudocode aufschreiben, was Sie erreichen wollen. Das sollte Ihnen helfen, sich darüber klar zu werden, was genau Sie erreichen wollen.

Wenn Sie das getan haben, können Sie es hier posten, damit ich oder jemand anderes einen Blick darauf werfen kann. Sobald Sie den Pseudocode richtig haben, können Sie damit beginnen, ihn in MT4-Code zu konvertieren. Der Versuch, alles auf einmal zu machen, ist ein zu großer Sprung, besonders wenn man Anfänger ist.

Übrigens ist mein Pseudocode nie verschwendet. Das meiste davon landet als Kommentar in meinem fertigen Code.

Viel Glück!

Tim Wilson

 
niko:

Hallo Wolkenbrecher!

Ich bin deine Kommentare zum Thema Coding schon oft durchgegangen (ich habe sie alle an meiner Pinnwand gepostet) und habe versucht, alles zu verstehen und zusammenzuflicken, aber ich bin immer noch völlig ratlos. Soweit ich gekommen bin, habe ich die Funktion MyOrderCount aus einem anderen EA kopiert, aber ich habe immer noch keine Ahnung, wie ich das in den Code integrieren soll. Ich bin völlig überfordert, aber das heißt nicht, dass wir nicht weiterkommen können. Wenn Sie mir helfen könnten, den Code Stück für Stück aufzubauen (und mich auf vielleicht spezifischere Dinge hinweisen, die ich auch selbst aufbauen könnte), dann werden wir den Code fertig bekommen und ich werde viel schneller lernen.

Ich habe den Code angehängt, so weit ich damit gekommen bin, und auch die Karte des Programmdesigns, so wie ich es sehe. Machen Sie sich keine Sorgen über die kleinen Dinge wie Klammern im Code, ich werde sie mit Notepad++ überprüfen, während wir weitermachen.

Das Wichtigste ist, dass Sie mir helfen, den MyOrderCount-Code Schritt für Schritt in den Rest zu integrieren, und bitte erklären Sie mir alles Stück für Stück, während wir weitermachen. Oder Sie können mich auch auf bestimmte Teile des Buches oder ähnliches hinweisen, wenn Sie das für angebracht halten. Auf diese Weise werden wir viel schneller vorankommen.

Herzlichen Dank dafür!

ps: Lassen Sie mich wissen, wenn die Programmkarte nicht angehängt wurde

ps: bitte ignorieren Sie die zufälligen // Kommentare im Code, sie stammen aus alten Notizen

Ein kurzer Blick sagt mir, dass Sie einen grundlegenden Fehler machen.

Sie scheinen zu versuchen, die Funktion MyOrderCount() innerhalb des Codeblocks der Funktion start() zu deklarieren.

Stellen Sie sich Ihren Code als eine Reihe von Funktionen init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN() vor.

Die Funktionen init() und start() sind spezielle Funktionen. Die init()-Funktion wird einmal ausgeführt, wenn Sie den EA zum ersten Mal initialisieren. Die start()-Funktion wird jedes Mal ausgeführt, wenn ein neuer Tick eintrifft.

Die start()-Funktion bildet also die Wurzel, von der aus Ihre gesamte Logik aufgerufen wird, sobald der EA in Betrieb ist.

Ein Beispiel: Jedes Mal, wenn ein Tick eintrifft, wird Ihre start()-Funktion ausgeführt und tut Folgendes:

- einige Bedingungen prüfen

- wenn die Bedingungen erfüllt sind, eine Order ausführen

Eine der Bedingungen, die Sie erfüllen müssen, ist, dass Sie sicherstellen müssen, dass Sie nicht bereits einen Auftrag des Typs (z. B. Kaufen) haben, bevor Sie einen Kaufauftrag erteilen.

Ausgehend von der start()-Funktion müssen Sie also durch einen CALL an Ihre Funktion zum Zählen von Kaufaufträgen (deren Codeblock sich AUSSERHALB der start()-Funktion befindet) herausfinden, welche Kaufaufträge existieren.

Ihre Funktion zum Zählen von Kaufaufträgen gibt die Anzahl der Kaufaufträge zurück, und Sie setzen die Ausführung der Funktion start() in der Zeile nach dem Aufruf der Funktion zum Zählen von Kaufaufträgen fort.

Dann verwenden Sie den von der Funktion zum Zählen von Kaufaufträgen zurückgegebenen Wert, um zu entscheiden, ob Ihr Kaufauftrag ausgeführt werden soll oder nicht.

Die tatsächliche Ausführung der Kauforder kann ein Aufruf einer ANDEREN Funktion sein, die Sie für sich selbst erstellen (wiederum außerhalb der start()-Funktion deklariert).

Ich hoffe, das macht Sinn. Vielleicht strukturieren Sie es ganz anders, aber ich versuche nur, Ihnen das Konzept von Funktionen und Aufrufen nahe zu bringen.


CB

 

Hallo TSWilson und CB!

Ihr seid großartig! Ich danke euch vielmals.

Das mit dem Pseudocode ist absolut richtig. Ich habe das gemacht, als ich sehr einfache Programmierung in der Pro**Echtzeitsprache gemacht habe, aber da war es so einfach, keine Deklarationen, keine Blöcke usw. (der ganze Code war nur 'if...then' haha). Ich habe heute Morgen mit dem Pseudocode begonnen (ich bin eine Stunde früher zur Arbeit gekommen, nur um das zu tun) und habe ein visuelles Diagramm geschrieben, wie und welche Blöcke ich haben muss. Ich werde das heute noch fertigstellen und hier posten.

Sobald das erledigt ist, kann ich den Rest der Blöcke und die Besonderheiten des Codes mit eurer Hilfe herausfinden. Also zurück zum Zeichenbrett!

Ich bin gerne bereit, heute und morgen die Nacht durchzuarbeiten, um den Code so schnell wie möglich fertigzustellen, da ich nächste Woche in den Urlaub fahre und alles fertig haben möchte, bevor ich gehe.

Also behalte diesen Thread im Auge, ich werde heute den Pseudocode und das Diagramm posten!

Und wie immer danke ich dem Universum für Leute wie Sie!