//+------------------------------------------------------------------+
//| 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;
}
|