//+--------------------------------------------------------------------------------+
//| 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
//--- parametri di input
input string symbol="GBPUSD"; // Il simbolo di un nuovo grafico
input ENUM_TIMEFRAMES period=PERIOD_H3; // Il timeframe di un nuovo grafico
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
{
//--- Per prima cosa alleghiamo gli indicatori al grafico
int handle;
//--- Preparariamo l'indicatore per l'uso
if(!PrepareZigzag(NULL,0,handle)) return; // Fallimento, quindi uscita
//--- Alleghiamo l'indicatore al grafico corrente, ma in una finestra separata.
if(!ChartIndicatorAdd(0,1,handle))
{
PrintFormat("Fallimento nell'allegare al grafico %s/%s l'indicatore con l'handle=%d. Codice errore %d",
_Symbol,
EnumToString(_Period),
handle,
GetLastError());
//--- Termina operazione del programma
return;
}
//--- Aggiorna il del grafico per visualizzare l'indicatore
ChartRedraw();
//--- Trova le ultime due fratture del zig-zag
double two_values[];
datetime two_times[];
if(!GetLastTwoFractures(two_values,two_times,handle))
{
PrintFormat("Fallimento nel trovare le ultime due fratture del ZigZag!");
//--- Termina operazione del programma
return;
}
//--- Ora colleghiamo un canale di deviazione standard
string channel="StdDeviation Channel";
if(!ObjectCreate(0,channel,OBJ_STDDEVCHANNEL,0,two_times[1],0))
{
PrintFormat("Fallimento nel creare l'oggetto %s. Codice errore %d",
EnumToString(OBJ_STDDEVCHANNEL),GetLastError());
return;
}
else
{
//--- Il canale è stato creato, definiamo il secondo punto
ObjectSetInteger(0,channel,OBJPROP_TIME,1,two_times[0]);
//--- Imposta un testo tooltip per il canale
ObjectSetString(0,channel,OBJPROP_TOOLTIP,"Demo dall' MQL5 Help");
//--- Aggiorna il grafico
ChartRedraw();
}
//--- Salva il risultato in un template
ChartSaveTemplate(0,"StdDevChannelOnZigzag");
//--- Apre un nuovo grafico ed applica un template salvato ad esso
long new_chart=ChartOpen(symbol,period);
//--- Abilita i suggerimenti per gli oggetti grafici
ChartSetInteger(new_chart,CHART_SHOW_OBJECT_DESCR,true);
if(new_chart!=0)
{
//--- Applica il template salvato al grafico
ChartApplyTemplate(new_chart,"StdDevChannelOnZigzag");
}
Sleep(10000);
}
//+--------------------------------------------------------------------------------+
//| Crea un handle a zig-zag e garantisce la disponibilità dei suoi dati |
//+--------------------------------------------------------------------------------+
bool PrepareZigzag(string sym,ENUM_TIMEFRAMES tf,int &h)
{
ResetLastError();
//--- L'indicatore Zigzag deve essere situato in terminal_data_folder\MQL5\Examples
h=iCustom(sym,tf,"Examples\\Zigzag");
if(h==INVALID_HANDLE)
{
PrintFormat("%s: Fallimento nel creare l' handle dell' indicatore ZigZag. Codice errore %d",
__FUNCTION__,GetLastError());
return false;
}
//--- Quando si crea un handle di indicatore, esso richiede tempo per calcolare i valori
int k=0; // Il numero di tentativi di attesa per il calcolo dell'indicatore
//--- Attende per il calcolo in un ciclo, fermandosi a 50 millisecondi se il calcolo non è ancora pronto
while(BarsCalculated(h)<=0)
{
k++;
//--- Mostra il numero di tentativi
PrintFormat("%s: k=%d",__FUNCTION__,k);
//--- Aspettare 50 millisecondi di attesa fino a quando l'indicatore viene calcolato
Sleep(50);
//--- Se più di 100 tentativo, allora c'è qualcosa che non va
if(k>100)
{
//--- Riporta un problema
PrintFormat("Fallimento nel calcolo dell' indicatore per %d tentativi!");
//--- Termina operazione del programma
return false;
}
}
//--- Tutto è pronto, l'indicatore viene creato ed i valori sono calcolati
return true;
}
//+--------------------------------------------------------------------------------+
//| Cerca le ultime 2 fratture zigzag e le piazza negli array |
//+--------------------------------------------------------------------------------+
bool GetLastTwoFractures(double &get_values[],datetime &get_times[],int handle)
{
double values[]; // Un array per i valori del zigzag
datetime times[]; // Un array per ottenere l'orario
int size=100; // Grandezza dell'array
ResetLastError();
//--- Copia gli ultimi 100 valori dell'indicatore
int copied=CopyBuffer(handle,0,0,size,values);
//--- Controlla il numero di valori copiati
if(copied<100)
{
PrintFormat("%s: Fallimento nel copiare %d valori dell' indicatore con l'handle=%d. Codice errore %d",
__FUNCTION__,size,handle,GetLastError());
return false;
}
//--- Definisce l'ordine di accesso alla matrice come in una timeseries
ArraySetAsSeries(values,true);
//--- Scrivi qui il numero di barre, in cui le fratture sono state trovate
int positions[];
//--- Imposta la grandezza dell'array
ArrayResize(get_values,3); ArrayResize(get_times,3); ArrayResize(positions,3);
//--- Contatori
int i=0,k=0;
//--- Avvia la ricerca delle fratture
while(i<100)
{
double v=values[i];
//--- Non siamo interessati a valori vuoti
if(v!=0.0)
{
//--- Ricorda il numero della barra
positions[k]=i;
//--- Ricorda il valore del zigzag sulla frattura
get_values[k]=values[i];
PrintFormat("%s: Zigzag[%d]=%G",__FUNCTION__,i,values[i]);
//--- Incrementa il contatore
k++;
//--- Se vengono trovate due fratture, interrompere il ciclo
if(k>2) break;
}
i++;
}
//--- Definisce l'ordine di accesso agli array come in una timeseries
ArraySetAsSeries(times,true); ArraySetAsSeries(get_times,true);
if(CopyTime(_Symbol,_Period,0,size,times)<=0)
{
PrintFormat("%s: Fallimento nella copia di %d valori da CopyTime(). Codice errore %d",
__FUNCTION__,size,GetLastError());
return false;
}
//--- Apre l'orario di apertura della barra, in cui le ultime 2 fratture si sono verificate
get_times[0]=times[positions[1]];// Il penultimo valore, sarà scritto come la prima frattura
get_times[1]=times[positions[2]];// Il terzultimo valore sarà la seconda frattura
PrintFormat("%s: first=%s, second=%s",__FUNCTION__,TimeToString(get_times[1]),TimeToString(get_times[0]));
//--- Successo
return true;
}
|