|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Versuchs - EA mit Indikator - wer kann mir helfen?
Hallo,
ich habe mich gestern vorgestellt und dort auch schon mein Problem geschildert. ich bin seit einiger Zeit an dem Programmieren von EAs interessiert und bin gerade dabei, mir diese "geheime Raketenwissenschaft" MQL4 anzueignen, ja geradezu an mich zu reissen. Ich habe mich sehr viel eingelesen, ich habe das Internet gequält, ich habe versucht, überall etwas herzubekommen, was mich beim Programmieren weiterbringen könnte. Es ist eine Qual, wie ich finde, denn man findet kaum etwas dazu. Die Hauptliteratur ist auf Englisch und wenn man - wie ich - etwas konkretes sucht, wird die Suche zur Tortur. Die F1-Hilfe ist oft nicht gerade eine Hilfe und wirft weitere Fragen auf. Aber ich gebe nicht auf! Momentan arbeite ich daran, einen "Test"-EA zu schreiben, wo ein Rechteck ab dem Zeitpunkt in den Chart gezeichnet wird (ObjectCreate(Chart_ID,name,OBJ_RECTANGLE,0,Time1, Close1,Time2,Close2), ab dem die Kauf / Verkaufbedingung, von mir aus die 2 klassischen kreuzende SMA, erfüllt wird. Da fängt es schon an! Ein für mich unüberwindbares Hindernis dieses Rechteck zeichnen zu lassen, so dass es quasi die Phase des Kaufs / Verkaufs "markiert". Das Ding soll für mich anschaulich darstellen, wie ein EA funktioniert, so dass ich an den Programmzeilen ein wenig "spielen" kann. Dabei soll die Kauf/Verkaufbedingung mit jedem Tick neu überprüft werden. Ein Repaint stellt dabei kein Problem dar. Könnt ihr mir bitte bitte helfen? Also ich bin durchaus bereit, mich in der Materie "durchzubeißen". Gerne würde ich zwecks Erfahrungsaustausch auch einen Kreis mit Gleichgesinnten bilden, die auch gerade am Lernen sind. So, nun bin ich mal gespannt, ob ich recht zügig Antworten bekomme oder erst alle paar Tage... :-) |
|
|||
Kann nen Bot überhaupt was in den Chart zeichnen oder geht das nur mit nem selbst gebastelten Indikator?
|
|
|||
@MA-EA, nach über 500 Posts und vielen Programmzeilen, solltest Du das aber wissen.
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Natürlich kann er das, er kann handeln und gleichzeitig auch Dinge anzeigen, wie eben Indikatoren. Lässt man das Kaufen / Verkaufen weg und ersetzt es durch Marker wie ein Rechteck, so hat man das was ich suche...!
Ich poste mal so ungefähr, wie ich mir das vorstelle: Das Rechteck bewegt sich halt nicht sychnron zum Ein/Ausstiegssignal.. die Höhe des Rechtecks ist erst mal irrelevant. long chart_ID=ChartID(); string name="ObjektQ"; //datetime=a; void OnTick() { if (iMA(Symbol(),0,10,0,1,0,0)>iMA(Symbol(),0,20,0,1, 0,0)) { //--- ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,Time[5],Close[5]-0.0001,Time[0],Close[0]+0.0001); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,C'100 ,40,100'); //ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,LimeG reen); ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE _SOLID); ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,5); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true); //true für Hintergrund gefüllt ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, true); // a=a+1; // Comment(a); } else ObjectDelete(name); } //} //+------------------------------------------------------------------+ // Deinitialisierung zum Indikatorende int deinit() { // Löschen von Einträgen und Objekten Comment(""); ObjectDelete(name); return(0); } |
|
|||
Versuchs - EA mit Indikator - wer kann mir helfen?
Hi Angel,
also - falls Dich das motiviert - "durchbeißen" lohnt sich nach meiner Erfahrung auf jeden Fall. Hier mal meine Gedanken zu Deinem Problem: 1. Ich würde Dir empfehlen, das Zeichnen von Chart-Objekten zumindest in eine Include-Datei auszulagern und in den Pre-Compiler-Zeilen Deines EAs auf diese Datei zu referenzieren, z.B. über: #include <Z_MyIncludes\GUI\IN_AH_ChartObjects.mqh> Die .mph-Datei muss natürlich im include-Verzeichnis oder in einem entsprechenden Unterverzeichnis wie im obigen Beispiel abgespeichert sein. Alternativ könnte man auch eine Klasse CRechteck definieren, aber das muss nicht unbedingt sein. 2. Wenn Du in der Include-Datei eine Funktion schreibst, die ein Standard-Rechteck malt, dann hast Du die Funktion einmal definiert und kannst sie von jedem beliebigen EA mit den ensprechenden Parametern aufrufen, ohne jedesmal den Code für das Zeichnen neu in jedem EA zu schreiben. Macht den Code in der EA-Datei einfacher und vermeidet, dass Dir die Code-Versionen bei Änderungen "auseinanderlaufen". 3. Hier mal ein Beispiel-Code für einen Button mit allen möglichen Parametern, die auch "disabled" werden können, wenn man sie nicht benötigt. Kann natürlich auch eine horizontale Linie, ein Label oder eben ein Rechteck sein. Code:
void ButtonCreate (long ButtonChart_ID, // Button Chart ID string ButtonName, // Button Name int ButtonSubWindow, // Button Subwindow Index int ButtonX, // Button X-Coordinate int ButtonY, // Button Y-Coordinate int ButtonWidth, // Button Width int ButtonHeight, // Button Height //int ButtonCorner, // Button Anchoring Chart Corner string ButtonText, // Button Text string ButtonFont, // Button Font int ButtonFontSize, // Button Font Size color ButtonTextColor, // Button Text Color color ButtonBackgroundColor, // Button Background Color color ButtonBorderColor) // Button Border Color //bool ButtonState, // Button State pressed/released //bool ButtonBack, // Button in the Background //bool ButtonSelectable, // Button highlight to move //bool ButtonSelected, // Button highlight to move //bool ButtonHidden, // Button hidden in the Object List //long ButtonZ_Order) // Button Priority for Mouse Click { if(ObjectFind(ButtonName)==-1) { ObjectCreate(ButtonChart_ID,ButtonName,OBJ_BUTTON,ButtonSubWindow,0,0); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_XDISTANCE,ButtonX); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_YDISTANCE,ButtonY); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_XSIZE,ButtonWidth); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_YSIZE,ButtonHeight); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetString(ButtonChart_ID,ButtonName,OBJPROP_TEXT,ButtonText); ObjectSetString(ButtonChart_ID,ButtonName,OBJPROP_FONT,ButtonFont); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_FONTSIZE,ButtonFontSize); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_COLOR,ButtonTextColor); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BGCOLOR,ButtonBackgroundColor); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BORDER_COLOR,ButtonBorderColor); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_STATE,false); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_BACK,false); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_SELECTABLE,false); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_SELECTED,false); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_HIDDEN,true); ObjectSetInteger(ButtonChart_ID,ButtonName,OBJPROP_ZORDER,0); } ObjectSetText(ButtonName,ButtonText,ButtonFontSize,ButtonFont,ButtonTextColor); return; } Code:
ButtonCreate(0,"B_CloseAll",0,50,33,45,20,"C-ALL",ft,fs,clrNeutral,clrClose,clrClose); Hier im Beispiel: Code:
OnTick() { ObjectDelete(0,"B_CloseAll"); if(MySignal) { ButtonCreate(0,"B_CloseAll",0,50,33,45,20,"C-ALL",ft,fs,clrNeutral,clrClose,clrClose); } } Just my 2 cents. Cheers, mocwoc |
|
|||
Hi!
Das ist mal ein endgeiler Beitrag! Das mit den Include-Dateien ist sehr interessant und werde ich angehen. Für jede Aufgabe ein Modul. Aber erstmal muss man die programmieren können :-) Und bei einem dieser Module sind wir hier ja dran. Den Text muss ich bei der nächsten Gelegenheit "auseinanderpflücken" , es ist , so sehe ich es, sehr viel Content und wird mich sicher voranbringen! Leider habe ich sehr wenig Zeit, eigentlich sogar zu wenig für meine normale Arbeit :-/ :-) Danke vorab für den Beitrag, ich melde mcih so schnell es geht!!! |
|
|||
Versuchs - EA mit Indikator - wer kann mir helfen?
Hi Angel,
na dann viel Spaß beim "Zerpflücken". Melde Dich - ggf. per privater Nachricht - wenn Du noch 'ne spezielle Frage hast. Ansonsten viel Erfolg! Cheers, mocwoc. |
|
|||
Ok, der Beitrag von mocwok war sehr aufschlussreich! Danke!
Als nächstes stehe ich vor dem Teilproblem, eine Order aufzugeben. Es soll nur das Problem - die aufgerufene (Bool-)Funktion "kaufen" - betrachtet werden. Nach Kompilierung tritt ein gelbes Ausrufezeichen auf mit dem Satz "return value of "OrderSend" should be checked" "Void" verlangt keinen Rückgabewert, soviel ich weiß. Dennoch soll ich den Wert von "OrderSend" checken? Un dwie mache ich das? Ich habe den "check" mal als Kommentar geschrieben. Falls korrekt: Ja und dann? Wohin soll das Programm dann "springen" und wie weise ich es dazu an? Falls Kaufen() fehlschlug, zB durch zu große Slippage (Hier 3 Pips), wie soll ich denn die Anweisung dazu geben, es nochmal zu versuchen, Kaufen() durchzuführen bzw. die vorhergegangene Kaufbedingung (liegt im void OnTick()-Bereich) nochmals anzulaufen? void Kaufen() { OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,MagicNu mber,0,Green); // if(OrderSend = true) // { // } } Viele Grüße, Angel mit (kleinen aber qualvollen) Fortschritten P.S. In der Zeile "OrderSend" ist das Word "MagicNumber" getrennt und erscheint als "MagicNu mber". In meinem Schreib/ Bearbeitungsfenster sieht alles korrekt aus!!! |
|
|||
Versuchs - EA mit Indikator - wer kann mir helfen?
Hi Angel,
die Ticketnummer ist eine Variable vom Typ integer. Du solltest diese zuvor definieren. Wäre auch gut, das Leerzeichen aus "MagicNu mber" herauszunehmen. Das Syntax-Highlighting müsste Dir das ohnehin schon als problematisch anzeigen. Zudem empfehle ich, den Code komplett auf Englisch zu schreiben. Das erleichtert Dir den Erfahrungsaustausch mit nicht deutschsprachigen Programmierern. Code:
void Buy() { int BuyOrderTicket=OrderSend( Symbol(), OP_BUY, LotSize, Ask, 3, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), NULL, MagicNumber, 0, Green); if(BuyOrderTicket>0) { if(OrderSelect(BuyOrderTicket,SELECT_BY_TICKET)) { Print("Buy order opened at: ", OrderOpenPrice()); SendNotification("Buy Order"); } else Print("Error opening buy order : ", GetLastError()); } return; } } |
|
|||
Wie gesagt, "MagicNu mber" erschien nur im Forum so. Im MetaEditor war alles ok und gibt auch keine Fehlermeldungen.
Ok, Danke für den Code, aber wie gehe ich es an, wenn KEIN Trade eröffnet wurde (Wegen zu hoher Slip o.ä.) und ich will es nochmal versuchen? Obwohl - dann springt das Programm wohl wieder zu void OnTick(), arbeitet die Bedingung ab und prüft über "if(OrdersTotal()==0) ob ein Trade besteht... Ich versuche mal, den Code einzubauen!!! |
Lesezeichen |
Stichworte |
chart, chart linie, chart zeichnen, mql4, programmierung, programmierung metatrader, programmierung mql4, zeichen |
|
|