Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43282
Benutzer: 7.220
Aktive Benutzer: 82
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 56 Minuten
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 1083
Gesamt: 1083
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Like Tree2Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 28.12.17
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 126
Angel befindet sich auf einem aufstrebenden Ast
Standard 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... :-)
  #2 (permalink)  
Alt 29.12.17
Elite Mitglied
 
Registriert seit: Sep 2015
Beiträge: 1.178
MA-EA befindet sich auf einem aufstrebenden Ast
Standard

Kann nen Bot überhaupt was in den Chart zeichnen oder geht das nur mit nem selbst gebastelten Indikator?
  #3 (permalink)  
Alt 29.12.17
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

@MA-EA, nach über 500 Posts und vielen Programmzeilen, solltest Du das aber wissen.

traderdoc
Kronenchakra and Leopold like this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #4 (permalink)  
Alt 29.12.17
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 126
Angel befindet sich auf einem aufstrebenden Ast
Standard

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);
}
  #5 (permalink)  
Alt 08.01.18
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 6
mocwoc befindet sich auf einem aufstrebenden Ast
Standard 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; }
4. Aufruf der ObjectCreate()-Funktion dann im EA selbst mit den ensprechenden Parametern. Hier im Beispiel:

Code:
   ButtonCreate(0,"B_CloseAll",0,50,33,45,20,"C-ALL",ft,fs,clrNeutral,clrClose,clrClose);
5. In der OnTick()-Funktion musst Du das creierte Objekt zunächst mal löschen mit ObjectDelete(0,"ObjectName"), dann mit der ausgelagerten ObjectCreate-Funktion neu zeichnen. Auf diese Weise aktualisiert sich das Objekt bei jedem Tick mit den ensprechenden Parameter. Löschen in der OnDeinit() empfiehlt sich natürlich auch.

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);
}
}
6. Nur so am Rande: In einer Deiner Code-Zeilen ist ein Leerzeichen (COLOR,LimeG reen)

Just my 2 cents.

Cheers, mocwoc
  #6 (permalink)  
Alt 11.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 126
Angel befindet sich auf einem aufstrebenden Ast
Standard

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!!!
  #7 (permalink)  
Alt 11.01.18
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 6
mocwoc befindet sich auf einem aufstrebenden Ast
Standard 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.
  #8 (permalink)  
Alt 15.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 126
Angel befindet sich auf einem aufstrebenden Ast
Standard

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!!!
  #9 (permalink)  
Alt 16.01.18
Neues Mitglied
 
Registriert seit: Dec 2017
Beiträge: 6
mocwoc befindet sich auf einem aufstrebenden Ast
Smile 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; }
}
Cheers, mocwoc
  #10 (permalink)  
Alt 16.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 126
Angel befindet sich auf einem aufstrebenden Ast
Standard

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!!!
Thema geschlossen

Lesezeichen

Stichworte
chart, chart linie, chart zeichnen, mql4, programmierung, programmierung metatrader, programmierung mql4, zeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------