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 Variablendurchgehend 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.
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);
}
Da ich absolut keine Ahnung habe, wo der Thread am besten hingehört, start ich ihn einfach mal im Allgemein.
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:
Zu den Variablen/Funktionsnamen im speziellen:
Zum allgemeinen Stil:
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.
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); }