PrintFormat

Formatta ed introduce un set di simboli e valori nel registro Expert Advisor secondo un formato prestabilito.

void  PrintFormat(
   string format_string,   // formato stringa
   ...                     // valori dei tipi semplici
   );

Parametri

format_string

[in] Un formato stringa è composto di simboli semplici, e se il formato stringa è seguito da argomenti, contiene anche le specifiche di formato.

...

[in] Tutti i valori di tipi semplici separati da virgole. Il numero di parametri non può superare i 64 compreso il formato stringa.

Valore restituito

String.

Nota

La funzione PrintFormat() non funziona durante l'ottimizzazione nel Tester di strategia.

Il numero, l'ordine e il tipo di parametri devono corrispondere esattamente al set di qualificatori, altrimenti il ​​risultato di stampa è indefinito. Invece di PrintFormat() è possibile utilizzare printf().

Se il formato stringa è seguito dai parametri, questa stringa deve contenere le specifiche di formato che indicano il formato di output di questi parametri. Specification of format always starts with the percent sign (%).

Un formato stringa viene letto da sinistra a destra. Quando viene soddisfatta la prima specifica di formato (se presente), il valore del primo parametro dopo il formato stringa viene trasformato ed emesso in output secondo la specifica preset. La specifica del secondo formato chiama la trasformazione e l'output del secondo parametro, e così via fino alla fine del formato stringa.

La specifica del formato ha la seguente forma:            

          %[flags][width][.precision][{h | l | ll | I32 | I64}]type

Ogni campo della specifica di formato è un simbolo semplice, o un numero che denota una semplice opzione formato. La più semplice specifica di formato contiene solo il segno di percentuale (%) ed un simbolo che definisce il tipo di parametro di output (ad esempio,%s). Se avete bisogno di emettere in output il segno di percentuale nel formato stringa, utilizzare la specifica di formato %%.

flags

Flag

Descrizione

Comportamento Predefinito

– (meno)

Giustificazione a sinistra all'interno della larghezza impostata

Giustificazione a destra

+ (più)

Output del segno + o - per i valori di tipi di segno

Il segno viene visualizzato solo se il valore è negativo

0 (zero)

Gli zeri vengono aggiunti prima di un valore di output all'interno del preset larghezza. Se 0 flag è specificato con un formato intero (i, u, x, X, o, d) e l'accuratezza della specifica è impostata (per esempio, %04.d), allora 0 viene ignorato.

Nulla viene aggiunto

spazio

Uno spazio viene mostrato prima di un valore di uscita, se è un segno e valore positivo

Gli spazi non sono inseriti

#

Se usato insieme con il formato o, x o X, allora prima del valore di output 0, viene aggiunto rispettivamente 0x o 0X .

Nulla viene aggiunto

 

Se usato insieme con il formato e, E, a o A, il valore viene sempre visualizzato con un punto decimale.

Decimal point is shown only if there is a non-zero fractional part.

 

Se usato insieme con il formato g o G, il flag definisce la presenza di un punto decimale nel valore di uscita ed impedisce il taglio degli zeri iniziali.

Il flag # viene ignorato se utilizzato con i formati c, d, i, u, s.

Decimal point is shown only if there is a non-zero fractional part. Gli zeri iniziali sono tagliati fuori.

width #

Un numero non negativo decimale che imposta il numero minimo di simboli di output del valore formattato. Se il numero di simboli di uscita è inferiore alla larghezza specificata, il corrispondente numero di spazi viene aggiunto da sinistra o destra a seconda dell'allineamento (flag -). Se c'è flag zero (0), il corrispondente numero di zeri viene aggiunto prima del valore di uscita. Se il numero di simboli di uscita è maggiore della larghezza specificata, il valore di uscita non viene mai tagliato.

Se un asterisco (*) viene specificato come larghezza, il valore di tipo int deve essere indicato nel punto corrispondente della lista dei parametri passati. Esso sarà utilizzato per specificare lunghezza del valore di uscita.

precision #

Un numero non negativo decimale che imposta la precisione di uscita - numero di cifre dopo la virgola decimale. A differenza della specificazion della larghezza, una specifica di precisione può tagliare la parte frazionaria del tipo con o senza arrotondamento.

L'uso di specifica di precisione è diverso per diversi tipi di formato.

Tipi

Descrizione

Comportamento Predefinito

a, A

Specifiche di precisione impostano il numero di cifre dopo la virgola decimale.

Precisione di default - 6.

c, C

Non utilizzato

 

d, i, u, o, x, X

Imposta il numero minimo di cifre di uscita. Se il numero di cifre in un parametro corrispondente è minore di questa precisione, vengono aggiunti zeri alla sinistra del valore di uscita. Il valore di uscita non viene tagliato, se il numero di cifre di uscita è maggiore della precisione specificata.

Precisione di default - 1.

e, E, f

Imposta il numero di cifre di uscita dopo un punto decimale. L'ultima cifra è arrotondata.

Precisione di default - 6. Se la precisione impostata è 0, o la parte parte decimale è assente, il punto decimale non viene mostrato.

g, G

Imposta il numero massimo di numeri significativi.

6 numeri significativi sono in output.

s

Imposta il numero di simboli di uscita di una stringa. Se la lunghezza della stringa supera la precisione, la stringa viene tagliata.

L'intera stringa viene emessa in output.

 

   PrintFormat("1. %s"_Symbol);
   PrintFormat("2. %.3s"_Symbol);
   int length=4;
   PrintFormat("3. %.*s"length_Symbol);
   /*
   1EURUSD
   2EUR
   3EURU
   /

h | l | ll | I32 | I64

Specificazione dei formati di dati, passati come parametro.

Tipo di Parametro

Prefisso utilizzato

Identificatore Comune del Tipo

int

l (L minuscola)

d, i, o, x, or X

uint

l (L minuscola)

o, u, x, or X

long

ll (due L minuscole)

d, i, o, x, or X

short

h

d, i, o, x, or X

ushort

h

o, u, x, or X

int

I32

d, i, o, x, or X

uint

I32

o, u, x, or X

long

I64

d, i, o, x, or X

ulong

I64

o, u, x, or X

type #

Lo specificatore di tipo è l'unico campo obbligatorio per l'output formattato.

Symbol

Tipo

Formato di Output

c

int

Simbolo di tipo Short (Unicode)

C

int

Simbolo di tipo char (ANSI)

d

int

Segno decimale intero

i

int

Segno decimale intero

o

int

Ottale intero senza segno

u

int

Intero decimale senza segno

x

int

Esadecimale intero senza segno, con "abcdef"

X

int

Esadecimale intero senza segno, usando "ABCDEF"

e

double

Un valore reale nel formato [-] d.dddde[segno] ddd, dove d - una cifra decimale, dddd - una o più cifre decimali, ddd - un numero a tre cifre che determina la grandezza del segno dell'esponente, - più o meno

E

double

Simile al formato di e, tranne che il segno di esponente è in output dalla lettera maiuscola (E invece di e)

f

double

Un valore reale nel formato [-] dddd.dddd, dove dddd - una o più cifre decimali. Il numero di cifre prima del punto decimale dipende dalla grandezza del valore numerico. Il numero di cifre dopo la virgola decimale dipende dalla precisione richiesta.

g

double

Un valore di output reale in formato f o e dipende da quale output è più compatto.

G

double

Un valore di output reale in formato F o E dipende da quale output è più compatto.

a

double

Un numero reale in formato [-] 0xh.hhhh p± dd, dove h.hhhh - mantissa in forma di cifre esadecimali, con "abcdef", dd - Uno o più cifre dell' esponente. Il numero di cifre decimali è determinato dalle specifiche di accuratezza

A

double

Un numero reale in formato [−]0xh.hhhh P±dd, dove h.hhhh - mantissa in forma di cifre esadecimali, usando "ABCDEF", dd - Uno o più cifre di esponente. Il numero di cifre decimali è determinato dalle specifiche di accuratezza

s

string

Stringa di output

Invece di PrintFormat() è possibile utilizzare printf().

Esempio:

void OnStart()
  {
//--- trade server name
   string server=AccountInfoString(ACCOUNT_SERVER);
//--- account number
   int login=(int)AccountInfoInteger(ACCOUNT_LOGIN);
//--- long value output
   long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
   PrintFormat("%s %d: leverage = 1:%I64d",
               server,login,leverage);
//--- account currency
   string currency=AccountInfoString(ACCOUNT_CURRENCY);
//--- double value output with 2 digits after the decimal point
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);
   PrintFormat("%s %d: account equity = %.2f %s",
               server,login,equity,currency);
//--- double value output with mandatory output of the +/- sign
   double profit=AccountInfoDouble(ACCOUNT_PROFIT);
   PrintFormat("%s %d: current result for open positions = %+.2f %s",
               server,login,profit,currency);
//--- double value output with variable number of digits after the decimal point
   double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   string format_string=StringFormat("%%s: point value  = %%.%df",_Digits);
   PrintFormat(format_string,_Symbol,point_value);
//--- int value output
   int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   PrintFormat("%s: current spread in points = %d ",
               _Symbol,spread);
//--- double value output in the scientific (floating point) format with 17 meaningful digits after the decimal point
   PrintFormat("DBL_MAX = %.17e",DBL_MAX);
//--- double value output in the scientific (floating point) format with 17 meaningful digits after the decimal point
   PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE);
//--- output using PrintFormat() with default accuracy
   PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE);
//--- simple output using Print()
   Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE);
/* execution result
   MetaQuotes-Demo 1889998: leverage = 1:100
   MetaQuotes-Demo 1889998: account equity = 22139.86 USD
   MetaQuotes-Demo 1889998: current result for open positions = +174.00 USD
   EURUSD: point value  = 0.00001
   EURUSD: current spread in points = 12 
   DBL_MAX = 1.79769313486231570e+308
   EMPTY_VALUE = 1.79769313486231570e+308
   PrintFormat(EMPTY_VALUE) = 1.797693e+308
   Print(EMPTY_VALUE) = 1.797693134862316e+308
*/
  }

Vedi anche

StringFormat, DoubleToString, Tipi Reali (double, float)