ChartSaveTemplate

Salva le impostazioni correnti del grafico in un template con un nome specificato.

bool  ChartSaveTemplate(
   long          chart_id,     // Chart ID
   const string  filename      // Nomefile per salvare un template
   );

Parametri

chart_id

[in] ID del Grafico. 0 significa il grafico corrente.

filename

[in] Il nome del file per salvare il template. L'estensione ".tpl" verrà aggiunta al nome del file automaticamente, non c'è bisogno di specificarla. Il template viene salvato in directory_terminale\Profiles\Templates\ e può essere utilizzato per l'applicazione manuale nel terminale. Se un template con lo stesso nome esiste già, il contenuto di questo file verrà sovrascritto.

Valore restituito

In caso di successo, la funzione restituisce true, altrimenti restituisce false. Per ottenere informazioni sull'errore, chiamare la funzione GetLastError().

Nota

Usando i templates, è possibile salvare le impostazioni di grafico con tutti gli indicatori ed oggetti grafici applicati, per poi applicarli ad un altro grafico.

Esempio:

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

Vedi anche

ChartApplyTemplate(), Resources