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: 3966
Beiträge: 37836
Benutzer: 6.258
Aktive Benutzer: 409
Links: 80
Wir begrüßen unseren neuesten Benutzer: Fago
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 6 Stunden
- Fago
vor 12 Stunden
- Fikri2015
vor einem Tag
- xifengit
vor einem Tag
- CEO1992
vor 2 Tagen
- AlexSk91

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

Empfehlungen

Like Tree2Likes
Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #11 (permalink)  
Alt 16.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Thumbs up

@mocwoC saugeil, es klappt, nachdem ich Deinen Code übernommen und die letzte geschweifte Klammer entfernt habe! Danke!
Dann kann ich heute und morgen mal so richtig ausgiebig experimentieren
Mit Zitat antworten
  #12 (permalink)  
Alt 19.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Standard

So... nun bin ich mit viel Kampfgeist ein wenig weiter.. jetzt brauche ich jedoch mal wieder Hilfe.
Ich möchte bei Erscheinen eines Kauf- oder Verkaufssignals eine Sounddatei abspielen. Das Kauf / Verkaufssignal wird bei mir mit jedem Tick auf Vorliegen geprüft.
Somit liegt die Prüfroutine in der OnTick-Funktion.
Die Anweisung PlaySound() liegt jedoch auch dort.
Wie kann ich es denn verhindern, dass der Sound nicht bei jedem Tick abgespielt wird bzw. wie kann denn ich nur eine bestimmte Anzahl von Sounds nach Erreichen der Ein / Ausstiegslogik abspielen?
Für Hilfe wäre ich dankbar.. dann kann ich über das WE mir Gedanken machen.. denn der Markt ist ja zu und testen kann ich es aufgrund fehlender Ticks nicht..
Mit Zitat antworten
  #13 (permalink)  
Alt 23.01.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Standard

Hallo!

Wie kann ich denn eine Sounddatei mit PlaySound eigentlich für eine definierte Zeit abspielen, sagen wir 5 Sekunden lang? Geht das überhaupt???
Mit Zitat antworten
  #14 (permalink)  
Alt 29.01.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Mocwoc hat dir schon gut geholfen.
Ich wollte trotzdem noch kurz meinen Senf dazugeben

Zitat:
Zitat von Angel Beitrag anzeigen
Code:
if (iMA(Symbol(),0,10,0,1,0,0)>iMA(Symbol(),0,20,0,1,0,0))
   
 {
  ...
   }
    else ObjectDelete(name);
Die Bedingung ist nicht gut. Falls sie zutrifft, wird dein Rechteck erstellt, auch wiederholt!
Falls die Bedingung nicht zutrifft, so löscht du das Objekt, auch wenn keines vorhanden ist. Und das immer wieder und wieder...

Zitat:
Zitat von mocwoc Beitrag anzeigen
1. Ich würde Dir empfehlen, das Zeichnen von Chart-Objekten zumindest in eine Include-Datei auszulagern...
Grundsätzlich schon, allerdings macht es auch nur Sinn, wenn man es auch wirklich benötigt.
Bei seinem Test-EA und seinen Kentnissen ist das allerdings wahrscheinlich noch nicht der Fall. Das verwirrt ihn vielleicht sogar ein bischen...

Zitat:
Zitat von mocwoc Beitrag anzeigen
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.
Das würde ich nicht machen, schon garnicht in OnTick(). Es ist überhaupt nicht nötig, das Objekt zu löschen und neu zu zeichnen.
Dafür gibt es die Funktion "ObjectMove()"!

Zitat:
Zitat von Angel Beitrag anzeigen
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?
Deine Funktion "Kaufen()" hat den Typ "Void", daher hat DEINE Funktion keinen Rückgabewert, wohl aber die Funktion "OrderSend()", auf welche
sich der Warnhinweis bezieht. Diese Funktion hat einen Int-Rückgabewert und liefet die Tecketnummer bei Erfolg, -1 bei Problemen.

Zitat:
Zitat von Angel Beitrag anzeigen
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?
Z.B. durch einen einfachen Schalter (bool-Variable), oder der Überprüfung der vorhandenen Orders.

Zitat:
Zitat von Angel Beitrag anzeigen
Es soll nur das Problem - die aufgerufene (Bool-)Funktion "kaufen" - betrachtet werden...
... "Void" verlangt keinen Rückgabewert, soviel ich weiß...
Code:
void Kaufen()
   {
   OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,MagicNumber,0,Green);
   //   if(OrderSend = true)
   //         {
   //         }
   }
Wiederspricht sich bischen, deine aufgerufene Bool-Funktion "void Kaufen()"

=== === === === === === === === === === === === ===

Also zusammengefasst (Kommentare beachten!):

Zusammen mit dem Beispiel bzgl. von PlaySound(), welches ich dir hier gepostet habe,
würde eine mögliche Umsetzung so aussehen:
Code:
#property copyright "Copyright No Matter"
#property version   "1.00"
#property strict


long     chart_ID       = ChartID();
string   name           = "ObjektQ";
bool     OBJECT_EXIST   = false;
datetime LAST_BAR       = Time[0];

int      SEC_ON_START   = 0;
int      SEC_CUR        = 0;
bool     SOUND_ACTIVE   = false;

int OnInit()
{
   // Timer setzen, um PlaySound() zu managen...
   EventSetTimer(1);
   
   return(INIT_SUCCEEDED);
}
  
void OnDeinit(const int reason)
{
   ObjectDelete(name);
   EventKillTimer();
}
  
void OnTimer()
{
   if(SOUND_ACTIVE)
   {
      SEC_CUR = TimeSeconds(TimeCurrent());
   
      if(SEC_ON_START < 55)
      {
         if((SEC_CUR >= SEC_ON_START+5) || (SEC_CUR < SEC_ON_START))
            {PlaySound(NULL); SOUND_ACTIVE = false;}
      }
      else
         if(SEC_CUR < SEC_ON_START && SEC_CUR+60 >= SEC_ON_START+5)
            {PlaySound(NULL); SOUND_ACTIVE = false;}
   }
}  

void OnTick()
{
   // Objekt NUR EINMAL erstellen!
   if(!OBJECT_EXIST && 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_STYLE,STYLE_SOLID);
      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,5);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, true);
      
      OBJECT_EXIST = true;
      
      // Sofern dieselben Bedingungen für deine Funktion "Kaufen()" gelten...
      // Eine Funktion, die einfach nur eine andere aufruft, ist unnötig!
      
      ResetLastError();
      
      // Hier würde ich unbedingt noch auf deinen StopLoss und TakeProfit achten.
      // Üblicherweise nutzt man z.B. "Ask/Bid +/- StopLoss * Point"
      if(OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,MagicNumber,0,Green) == -1)
      {
         // Fehler bei Orderausführung. Ausgabe des Fehlers mit z.B. einer MessageBox:
         MessageBox("Order konnte nicht ausgeführt werden. Fehler: "+IntegerToString(GetLastError()));
         
         // Vor einem erneuten Versuch Fehler beachten.
         // Bei falschen Bedingungen und entsprechendem Fehler (falscher Stop, Traden deaktiviert, ect...)
         // könnte es schnell zu einer Endlosschleife von Versuchen führen !!!
      }
      else
      {
         // Order wurde gesetzt.
         // PlaySound() aufrufen und nach 5 Sekunden beenden.
         PlaySound("DEINE DATEI");
         SEC_ON_START = TimeSeconds(TimeCurrent());
         SOUND_ACTIVE = true;
      }
   }
   else
   {
      // Da du nicht angegeben hast, wo genau das Rechteck aufhören soll,
      // Zeichnet es sich einfach bei jeder neuen Kerze mit weiter.
      // Hier müsstest du bestimmte Bedingungen setzen...
      
      if(Time[0] != LAST_BAR)
      {
         ObjectMove(chart_ID,name,1,Time[0],ObjectGetDouble(chart_ID,name,OBJPROP_PRICE2));
         LAST_BAR = Time[0];
      }
      
      // === === === === === === === === === ===
      
      // Die Bedingung oben trifft nur einmal zu.
      // Danach musst du Order hier managen.
      // Je nach Vorhaben halt mit erneuter iMA-Prüfung...
      
      if(OrdersTotal() == 0 && iMA(Symbol(),0,10,0,1,0,0) > iMA(Symbol(),0,20,0,1, 0,0))
      {
         // Order wurde offenbar nicht gesetzt.
         // Hier darauf reagieren mit z.B. einem erneuten Versuch.
         // Bei erfolgreichem OrderSend() dann auch PlaySound() setzen...
      }
      else
      {
         // Vorhandene Order managen.
         // Falls mehrere Orders vorhanden, so mit der Ticketnummer filtern
      }
      
   }
}
  
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   // Für zukünftiges...
}
Mit Zitat antworten
  #15 (permalink)  
Alt 13.03.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Red face Nochmal das Rechteck-Problem...

So, jetzt fuchst mich das Rechteck nun doch.
Die Hilfen hier waren aufschlussreich, jedoch komme ich nicht recht weiter.

Nocheinmal zu der Problemstellung EURUSD:
Ich habe vor, zB im M15-Chart die Tageskerze abbilden zu lassen.
Oder später, wenn ich es verstanden habe, im M15 die Stundenkerzen. Aber daher erstmal zu der einen Tageskerze.
Ich möchte dies durch ein einfaches Rechteck zwischen Open und Close der aktuellen Tageskerze verwirklichen. Somit bewegt sich das Rechteck nicht einfach, sondern es wird mit zunehmender Zeit größer. Die Lunte und den Docht kann ich sicher irgendwie auf eine andere Weise "dranfriemeln", aber das größer werdende Rechteck erscheint mir erstmal wichtiger.
Ich habe das Problem, nicht zu wissen, wie ich die Ankerpunkte bzw. die Zeit der Ankerpunkte beschreibe.
PHP-Code:
void OnTick()
{
ObjectDelete(chart_idname);

ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,Time[10],Open[10],Time[0],Close[0]);
   
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,LimeGreen);
   
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
   
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,1);
   
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,false); //true für Hintergrund gefüllt
   
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);  

Wie man sieht, war ich fleissig und kann nun auch Code einfügen ;-)
Also Time[10] ist natürlich nur beispielhaft für den 10.ten Bar vor dem aktuellen Bar.
Ich hoffe, mir kann jemand auf die Spünge helfen?! Also wie zu sehen ist, mache ich im 3.ten Monat Fortschritte ;-) (Ist aber schon hart ... )
Mit Zitat antworten
  #16 (permalink)  
Alt 13.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Angel Beitrag anzeigen
Die Lunte und den Docht kann ich sicher irgendwie auf eine andere Weise "dranfriemeln"
Willste ne Kerze nachbauen, oder was ist damit gemeint?

Zitat:
Zitat von Angel Beitrag anzeigen
Ich möchte dies durch ein einfaches Rechteck zwischen Open und Close der aktuellen Tageskerze verwirklichen. Somit bewegt sich das Rechteck nicht einfach, sondern es wird mit zunehmender Zeit größer.
Dann wäre hier noch zu klären, ob die Zeit-Koordinaten des Rechtecks auch mit der aktuellen Kerze beginnen, oder ob das Rechteck
nach Links hin schon zum Start einen Körper hat.
Außerdem, wann willst du dein Rechteck aktualisieren? Soll es durchgehend mit der Kerze wachsen, also bei jedem einzelnen Tick?

Zitat:
Zitat von Angel Beitrag anzeigen
Ich habe das Problem, nicht zu wissen, wie ich die Ankerpunkte bzw. die Zeit der Ankerpunkte beschreibe.
Ein einfach gehaltenes Beispiel, bei dem das Rechteck nach jeder (M15-)Kerze mit nach rechts geht (größer wird) und sich bei jedem Tick
an Close der Tageskerze anpasst.
Code:
ObjectCreate(0,"RECHTECK",OBJ_RECTANGLE,0,Time[10],iOpen(Symbol(),PERIOD_D1,0),Time[0],iClose(Symbol(),PERIOD_D1,0));
ObjectSetInteger(0,"RECHTECK",OBJPROP_BGCOLOR,clrTurquoise);
ObjectSetInteger(0,"RECHTECK",OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,"RECHTECK",OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,"RECHTECK",OBJPROP_SELECTED,false);
ObjectSetInteger(0,"RECHTECK",OBJPROP_FILL,true);
ObjectSetInteger(0,"RECHTECK",OBJPROP_BACK,true);

// In OnTick()
ObjectMove(0,"RECHTECK",1,Time[0],iClose(Symbol(),PERIOD_D1,0));
Mit Zitat antworten
  #17 (permalink)  
Alt 13.03.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Standard

Hallo und vielen Dank für die rasche Antwort!!!

Ja, ich möchte damit quasi die Tageskerze in unteren Timeframes abbilden.

Die Zeitkoordinaten sollen mit der Tageskerze beginnen, bei EURUSD also bei 23:00 Uhr MEZ und es soll mit jedem Tick aktualisiert werden - was mit dem Code innerhalb der void OnTick-Funktion bereits erreicht wurde.

Dein Beispiel ist Weltklasse und brachte mich schon weiter! Vielen Dank dafür! Wenn Du mir nun noch mit den Zeitkoordinaten der beginnenden Tageskerze auf die Sprünge helfen könntest...?!
Mit Zitat antworten
  #18 (permalink)  
Alt 13.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Angel Beitrag anzeigen
Wenn Du mir nun noch mit den Zeitkoordinaten der beginnenden Tageskerze auf die Sprünge helfen könntest...?!
Dazu musst du beim erstellen des Rechtecks einfach die im Beispiel genutzte Zeit-Koordinate "Time[10]" durch
Code:
iTime(Symbol(),PERIOD_D1,0)
ersetzen. Damit erhälst du die Eröffnungszeit der aktuellen Tageskerze...

Geändert von next user (13.03.18 um 11:07 Uhr) Grund: N' Wort vergessen ;)
Mit Zitat antworten
  #19 (permalink)  
Alt 13.03.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Thumbs up

Was soll ich sagen...?

Endgeil...! Danke!!!
__________________
MQL4-Interessiert... und noch gaaaanz am Anfang
Mit Zitat antworten
  #20 (permalink)  
Alt 13.03.18
Mitglied
 
Registriert seit: Dec 2017
Ort: 76891
Beiträge: 59
Angel befindet sich auf einem aufstrebenden Ast
Standard

In der Zeile
PHP-Code:
ObjectSetInteger(0,"RECHTECK",OBJPROP_BGCOLOR,clrRed); 
möchte ich die Farbe als Variable einfügen, damit sich durch eine Abfrage wie

PHP-Code:
 if (Ask>(iOpen(Symbol(),PERIOD_D1,0)))
      {
Col="clrLime";
      }
  if (
Ask<(iOpen(Symbol(),PERIOD_D1,0)))
      {
Col="clrRed";
      } 
die Farbe entprechend gemäß über oder unter D1-Open ändert.
Nun versuchte ich, clrRed durch eine string-Variable "Col" zu ersetzen, über deren Inhalt wie oben entschieden wird.
Nur: Dann zeigt sich das Rechteck farblos. Was mache ich nur falsch?
__________________
MQL4-Interessiert... und noch gaaaanz am Anfang
Mit Zitat antworten
Antwort

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 +2. Es ist jetzt 18:09 Uhr.



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