Jump to content
Tom Next - Daytrading Community

Recommended Posts

Posted

Da ich absolut keine Ahnung habe, wo der Thread am besten hingehört, start ich ihn einfach mal im Allgemein.

 

@ FinGeR @ Mythos @ Krümel @all

 

Wollen wir uns gleich auf einen Standard einigen?

Bei dem "Drive", den wir hier in den letzten Wochen verzeichnen, ist abzusehen, dass sich früher oder später mehr Leute zu dem Thema MT4/ entwicklung EA etc melden. Ich denke darunter werden auch Programmierer sein. Wir haben mit Alex das Thema schon mal im Kleinen durchexerziert und alle fanden es sinnvoll, eine Kennzeichnungeinzuführen.

Sollten sich später weitere Entwickler melden, die bei dem einen oder anderen Projekt mitwirken wollen, dann könnten die diese Standards gleich übernehmen.

 

Ich start einfach mit einer Diskussionsgrundlage:

 

Dateinamen (wie von FinGeR vorgeschlagen):

Der erste Buchstabe identifiziert den Typ:

Indikatoren ... "iMeinIndikator.mql4"

Experts ... "eMeinEA.mql4"

Script ... "sMeinScript.mql4"

Includedatei ... "hMeineInclude.mql4"

Library ... "lMeine Lib.mql4" (das ist ein kleines L)

 

Zum Code selber:

  • " /* */ " Kommentare werden nur zum debuggen verwendet und bleiben nicht dauerhaft im Code.
  • Vor jeder Funktion gibt es einen Kommentarblock, der kurz die Aufgabe der FUnktion beschreibt, und Information über die Parameter und den Rückgabewert enthält.
  • Kommentare und Variablennamen werden grundsätzlich in englisch/deutsch geschrieben (an sich wird immer englisch verwendet, ich finde aber, das man in einer deutschen Community auch ruhig sich auf deutsch einigen sollte)
  • Alle Funktionen aus einer library beginnen mit einem eindeutigen Identifier der Library (wie zB "tb" für TradeBox)

Zu den Variablen/Funktionsnamen im speziellen:

  • durch #define definierte Konstante in Großbuchstaben mit Underlines
  • globale Variablen durchgehend klein, mit underlines und einem Underline am Schluss
  • lokale Variablen durchgehend klein mit underlines ohne abschließendem underline
  • Funktionsnamen mit kleinem Anfangsbuchstaben und rest Kapitälchen
  • Parameter beginnen mit großem Anfangsbuchstaben und Kapitälchen (oder underlines?)

Zum allgemeinen Stil:

  • Variablen werden direkt bei der Deklaration initialisiert, auch wenn es eine Dummy-initialisierung ist.
  • es sollten sprechende Variablennamen verwendet werden (int i,j,k; ist nicht sprechend ;)
  • Es ist auf korrekte Einrückung zu achten (if und zugehörige else immer auf der gleichen Einrückungsstufe, innerhalb von Blöcken wird eingerückt etc.)
  • zwischen Funktionen zur leichteren Lesbarkeit "//------"

Das ist soweit eigentlich ein Auszug aus der Codingconvention für C++ wie ich es gelernt hab auf der Uni ;)

Bis jetzt hab ich damit recht gute Erfahrungen gemacht.

Aber ist wie gesagt nur eine Diskussiongrundlage. :laugh:

Ich denke diese Codingconvention sollte auch keine Liste von Ver- und Geboten sein, sondern nur eine Liste von Empfehlungen wodurch gemeinsamer Code bzw. hier veröffentlichter Code für die anderen schneller lesbar wird.

So Sachen wie "Funktionen dürfen nicht mehr als 75 Zeilen haben" etc. würd ich sagen lassen wir weg ;)

 

kleines Beispiel:

 

#import "lTradeBox.ex4"
 int tbSendOrder(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit, string comment,int magic, datetime expiration,int max_retries= -1);
#import

#define MAGIC_NUMBER 1
#define ALLOWED_SLIPAGE 3

extern int ParameterEins = 0;
extern string NameOfSymbol = "EURUSD";

double global_stop_=0;

//----------------------------------------------------------------------------
// berechnet den neuen Stop und macht Requotes
// @param foo: beschränkt die Anzahl der Requotes
// @param bar: der neue Stop
// @return: Wert des neuen Stops
double newStop(int foo, double bar)
{
 int lokale_variable=0;
 double temp_stop=1.0;

 if(bar < 0)
 {
Print("RTFM");
return(0);
 }
 else
 {
temp_stop= bar;
 }
 
 for(lokale_variable= 0; lokale_variable < foo; lokale_variable++)
 {
RefreshQuotes();
temp_stop= MathMin(temp_stop,Bid);
 }

 return(temp_stop);
}

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

int start()
{
 global_stop_= newStop(1,global_stop_);
 tbSendOrder(Symbol(),OP_SELLSTOP,1,Bid,ALLOWED_SLIPAGE,global_stop_,0,"Demo Order",MAGIC_NUMBER,0,-1);
 return(0);
}

Posted

Ich bin da relativ leidenschaftslos, da ich schon fast alles benutzen durfte/musste inklusive der ungarischen Notationsabwandlung von Microsoft. :laugh:

ic.arrow.right.png Spricht man hier.

Eine Vereinheitlichung erleicht in jedem Fall das Codeverständnis und die Möglichkeit, den Code untereinander zu diskutieren, vorausgesetzt, jeder Coder hält sich dran und die Codenutzer lesen die Namensregeln auch mal ;).

Posted
Ich start einfach mit einer Diskussionsgrundlage:

 

:laugh:

 

 

Da ich absolut keine Ahnung habe, wo der Thread am besten hingehört, start ich ihn einfach mal im Allgemein.

 

Ich glaube, im Augenblick ist er hier gut aufgehoben, oder? Später werden wir ihn in's Lab verschieben, da es primär ein Thema ist, womit sich die Coder beschäftigen.

Danke an der Stelle für die Mühe, die Du Dir gemacht hast.

 

Eine Vereinheitlichung erleicht in jedem Fall das Codeverständnis und die Möglichkeit, den Code untereinander zu diskutieren, vorausgesetzt, jeder Coder hält sich dran und die Codenutzer lesen die Namensregeln auch mal ;).

 

Sehe ich auch so.

Ich denke es ist den Versuch wert. Möglicherweise ist es zu früh, zu umständlich, schläft wieder ein... Ich weiss es nicht.

Schön wäre es dennoch, wenn wir gemeinsam an Projekten arbeiten, dass wir das in der bzw. einer für alle Entwickler passenden Form anwenden.

Ein Anfang ist gemacht und das ist, was zählt. Wie heißt es so schön, "Rom wurde auch nicht an einem Tag erobert".

 

Danke Mythos für den Vorschlag, Krümel für das Feedback!

 

 

Ich bin da relativ leidenschaftslos, da ich schon fast alles benutzen durfte/musste inklusive der ungarischen Notationsabwandlung von Microsoft. :sad:

ic.arrow.right.png Spricht man hier.

 

 

Ich hätte jetzt etwas anderes erwartet... :laugh:

 

Bei der ungarischen Notation handelt es sich um eine von Programmierern verwendete Namenskonvention zur Wahl von Bezeichnern für Variablen, Funktionen usw.

 

Der Name rührt zum einen daher, dass der Erfinder der Konvention, Charles Simonyi, ein Ungar ist, zum anderen daher, dass die „ungarisch“ notierten Bezeichner tatsächlich eine gewisse Ähnlichkeit zum Ungarischen aufweisen und für Neulinge oft „fremdländisch“ klingen.

 

Quelle: wikipedia

Posted

Ich würde bei der Unterscheidung zwischen EA´s und Scripts usw keine Dateinamensänderung vornehmen, sondern im Header es eindeutig zu erwähnen

z.b

//+------------------------------------------------------------------+
//|											   Test_Indikator.mq4 |
//|										Copyright © 2009, titanfx |
//+------------------------------------------------------------------+
//| Indikator										   Version: 1.1 |
//|------------------------------------------------------------------|
//| kurze Beschreibung											   |
//+------------------------------------------------------------------+

oder

//+------------------------------------------------------------------+
//|											   Test_Indikator.mq4 |
//|										Copyright © 2009, titanfx |
//+------------------------------------------------------------------+
//| ../indicators/Test_Indikator.mq4					Version: 1.1 |
//|------------------------------------------------------------------|
//| kurze Beschreibung											   |
//+------------------------------------------------------------------+

Posted

Jede Stimme zählt

 

oder

 

//+------------------------------------------------------------------+
//|											   Test_Indikator.mq4 |
//|										Copyright © 2009, titanfx |
//+------------------------------------------------------------------+
//| ../indicators/Test_Indikator.mq4					Version: 1.1 |
//|------------------------------------------------------------------|
//| kurze Beschreibung											   |
//+------------------------------------------------------------------+

 

:laugh:

Posted
Ich würde bei der Unterscheidung zwischen EA´s und Scripts usw keine Dateinamensänderung vornehmen, sondern im Header es eindeutig zu erwähnen

 

i bin für beides. Dann weiß man sofort wenn man ein file herunterläd bzw. nur online den Dateinamen sieht.

Eine allgemeine Kurzbeschreibung im Header find ich super!

 

 

und auf die Dateiendung achten

bei include files include_file.mqh,

der Rest file.mq4 (nicht file.mql4) :laugh:

 

stimmt sorry, hab beim tippen nit mitgedacht ;)

Posted

Was ich noch sinnvpll finde - die Zeilenlänge zu begrenzen.

Bei mir begrenze ich Pragrammcode in der Zeile auf 90 Symbolen

und wenn die Befehlszeile zu lang ist, einfach den Rest der Befehlszeile in die nächste Zeile

übertragen, so dass die Zeilenenden bündig stehen.

Das ist ist auch hilfreich, wenn man den Programmcode ausdrucken möchte.

z.B:

//---- macd counted in the 1-st additional buffer				// max. Lange 90 Symbolen 
  for(int i=0; i<limit; i++)
  MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,
															MODE_EMA,PRICE_CLOSE,i);
//---- signal line counted in the 2-nd additional buffer		 // max. Lange 90 Symbolen 
  for(i=0; i<limit; i++)
  SignalBuffer[i]=iMAOnArray(MacdBuffer,Bars,SignalSMA,0,MODE_SMA,i);

  • 1 year later...
Posted

Hab diesen Thread erst gerade entdeckt; und er kommt meiner perfektionistischen Ader sehr entgegen. Hab mit vor einiger Zeit eine "eigene" Convention gebastelt. Mit eingeflossen sind die Ungarische und die abgeleitete Microsoft, sowie eigene Layout-Regeln: (Ist für TS5/Equilla entstanden!!!)

 

Ich mache das per "Präfix - Gruppe-Name-Bezeichnung - Postfix"

z.B. "ldBollingerBandPrice":

- Präfix: ld = lokal double

- Gruppe: Bollinger

- Bezeichnung: Band

- Postfix: Price

 

oder "liBollingerBandPeriod":

das selbe, nur daß die Variable einen int-Wert enthält und

die Funktion des Wertes ist nicht wie oben Price = Bid, Ask, Last, Open, High, Low, Close oder entsprechend im Chart auf der rechten Skala darzustellen

sondern Period = Periodenangabe, Timebase- oder Timelevel-Angabe.

 

Ein paar weitere Postfixe, die ich verwende sind: Flag (bei bool oder digital), Count (z.B. in for-next-Schleifen), Date, Time. Bei etwas komplizierteren Berechnungen ist finde ich die Variablen-Funktionen Cash, Lots, Price, Range, Value, Period, und Points sehr hilfreich.

 

Das ganze ist am Anfang wirklich sehr gewöhnungsbedürftig und es kommt einem sehr aufwendig vor, aber: Wenn man nach einiger Zeit einen älteren Code überarbeiten muß oder einen Fehler sucht und man an diese Schreibweise gewöhnt ist, kann man sich enorm viel Zeit sparen.

 

Die Variablennamen werden hald wirklich richtig lang. Das ist aber meiner Erfahrung nach der einzige Nachteil.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...