//+------------------------------------------------------------------+ //| Test_ChartSaveTemplate.mq5 | //| Copyright 2011, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2000-2024, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property script_show_inputs //--- input parameters input string symbol="GBPUSD"; // Symbol des neuen Charts input ENUM_TIMEFRAMES period=PERIOD_H3; // Timeframe des neuen Charts //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- Zuerst Indikatoren auf den Chart aufsetzen int handle; //--- Den Indikator zu nutzen vorbereiten if(!PrepareZigzag(NULL,0,handle)) return; // Es hat nicht geklappt //--- Den Indikator auf den aktuellen Chart aber einem separaten Fenster aufsetzen if(!ChartIndicatorAdd(0,1,handle)) { PrintFormat("Fehler beim Aufsetzung von Indikator mit Handle=%d auf Chart %s/%s. Fehlercode ist %d", _Symbol, EnumToString(_Period), handle, GetLastError()); //--- Das Programm vorzeitig beenden return; } //--- Den Chart aktualisieren, im den Indikator zu sehen ChartRedraw(); //--- Hier finden wir zwei letzten Zick-Zack-Frakturen double two_values[]; datetime two_times[]; if(!GetLastTwoFractures(two_values,two_times,handle)) { PrintFormat("Fehler beim Such der zwei letzten Zick-Zack-Frakturen im Indikator Zigzag!"); //--- Das Programm vorzeitig beenden return; } //--- Jetzt Standardabweichung Kanal aufsetzen string channel="StdDeviation Channel"; if(!ObjectCreate(0,channel,OBJ_STDDEVCHANNEL,0,two_times[1],0)) { PrintFormat("Objekt %s konnte nicht erstellt werden. Fehlercode %d", EnumToString(OBJ_STDDEVCHANNEL),GetLastError()); return; } else { //--- Der Kanal erstellt wurde, definieren wir den zweiten Punkt ObjectSetInteger(0,channel,OBJPROP_TIME,1,two_times[0]); //--- Tooltip für Kanal definieren ObjectSetString(0,channel,OBJPROP_TOOLTIP,"Demo from MQL5 Help"); //--- Chart aktualisieren ChartRedraw(); } //--- Dies in einer Schablone speichern ChartSaveTemplate(0,"StdDevChannelOnZigzag"); //--- Ein neuer Chart öffnen und die Schablone darauf aufsetzen long new_chart=ChartOpen(symbol,period); //--- Tooltips für graphische Objekten entscheiden ChartSetInteger(new_chart,CHART_SHOW_OBJECT_DESCR,true); if(new_chart!=0) { //--- Die neue Schablone auf den Chart aufsetzen ChartApplyTemplate(new_chart,"StdDevChannelOnZigzag"); } Sleep(10000); } //+------------------------------------------------------------------+ //| Erzeugt Handle auf Zick-Zack, sorgt für Bereitschaft seinen Daten| //+------------------------------------------------------------------+ bool PrepareZigzag(string sym,ENUM_TIMEFRAMES tf,int &h) { ResetLastError(); //--- Indikator Zigzag muss in Terminal_Angaben_Ordner\MQL5\Examples sein h=iCustom(sym,tf,"Examples\\Zigzag"); if(h==INVALID_HANDLE) { PrintFormat("%s: Handle von Zigzag konnte nicht erstellt werden. Fehlercode %d", __FUNCTION__,GetLastError()); return false; } //--- Bei der Erstellung eines Indokatorhandles, benötigt es Zeit um Werte zu berechnen int k=0; // Die Anzahl der Versuche für Warten der Berechnung des Indikators //--- Auf die Berechnung in Zyklus warten, eine Pause von 50 Millisekunden machen, wenn die Berechnung noch nicht fertig ist while(BarsCalculated(h)<=0) { k++; //--- Die Anzahl der Versuche anzeigen PrintFormat("%s: k=%d",__FUNCTION__,k); //--- 50 Millisekunden warten, während der Indikator berechnet wird Sleep(50); //--- Wenn mehr als 100 Versuche gemacht worden, dann ist etwas falsch if(k>100) { //--- Problem melden PrintFormat("Indikator konnte nicht in %d Versuche berechnet werden!"); //--- Problem melden return false; } } //--- Alles ist fertig, der Indikator ist erstellt und die Werde sind berechnet return true; ;} //+------------------------------------------------------------------+ //| Sucht für die letzten 2 Zick-Zack-Frakturen und setzt in Arrays | //+------------------------------------------------------------------+ bool GetLastTwoFractures(double &get_values[],datetime &get_times[],int handle) { double values[]; // Array für die Werte der Zick-Zack datetime times[]; // Array, um Zeit zu bekommen int size=100; // Größe der Arrays ResetLastError(); //--- Letzten 100 Werte kopieren int copied=CopyBuffer(handle,0,0,size,values); //--- Die Anzahl der kopierten Werte überprüfen if(copied<100) { PrintFormat("%s: %d Werte des Indikators mit Handle =%d konnte nicht kopiert werden. Fehlercode %d", __FUNCTION__,size,handle,GetLastError()); return false; } //--- Reihenfolge der Zugriff auf das Array als in einer Zeitreihe definieren ArraySetAsSeries(values,true); //--- Die Nummer der Bars mit Frakturen hier schreiben int positions[]; //--- Dimensionen der Arrays definieren ArrayResize(get_values,3); ArrayResize(get_times,3); ArrayResize(positions,3); //--- Zähler int i=0,k=0; //--- Start der Suche nach Frakturen while(i<100) { double v=values[i]; //--- NULL-Werte interessieren uns hier nicht if(v!=0.0) { //--- Merken wir uns die Nummer des Bars positions[k]=i; //--- Merken wir uns den Wert des Zick-Zacks auf die Fraktur get_values[k]=values[i]; PrintFormat("%s: Zigzag[%d]=%G",__FUNCTION__,i,values[i]); //--- Erhöhung des Zählers k++; //--- Wenn zwei Frakturen sind gefunden, brechen den Zyklus if(k>2) break; } i++; } //--- Reihenfolge der Zugriff auf das Array als in einer Zeitreihe definieren ArraySetAsSeries(times,true); ArraySetAsSeries(get_times,true); if(CopyTime(_Symbol,_Period,0,size,times)<=0) { PrintFormat("%s: %d Werte aus CopyTime() konnten nicht kopiert werden. Fehlercode %d", __FUNCTION__,size,GetLastError()); return false; } //--- Finden die Öffnungzeit von Bars, an denen die 2 Frakturen sind get_times[0]=times[positions[1]];// Der vorletzte Wert ist als erster Fraktur geschrieben get_times[1]=times[positions[2]];// Dritter von Ende Wert ist als zweiter Fraktur geschrieben PrintFormat("%s: Erst=%s, Zweit=%s",__FUNCTION__,TimeToString(get_times[1]),TimeToString(get_times[0])); //--- Fertig return true; } |