PrintFormat

Formatea e imprime juegos de símbolos y valores en el registro histórico del Asesor Experto conforme al formato predefinido.

void  PrintFormat(
   string format_string,   // línea de formato
   ...                     // valor de tipos simples
   );

Parámetros

format_string

[in]  Una línea de formato se compone de símbolos simples y si los argumentos siguen la línea de formato, también contiene la especificación de formato.

...

[in]  Cualquieres valores de tipos simples separados por comas. El número total de parámetros no puede superar 64, inclusive la línea de formato.

Valor devuelto

Una cadena.

Nota

Durante el trabajo en el Probador de Estrategias en el modo de optimización, la función PrintFormat() no se ejecuta.

La cantidad, orden y tipo de parámetros tiene que corresponder exactamente a la composición de los especificadores, en caso contrario el resultado de la impresión estará indefinida. En vez de la función PrintFormat() se puede usar la función printf().

Si después de la línea de formato siguen los parámetros, esta línea debe contener las especificaciones del formato que denotan el formato de salida de estos parámetros. La especificación del formato siempre se empieza con el signo del porcentaje (%).

Una línea de formato se lee de izquierda a derecha. Al encontrar la primera especificación del formato (si hay), el valor del primer parámetro después de la línea de formato se transforma y se saca conforme a la especificación establecida. La segunda especificación provoca la transformación y salida del segundo parámetro, y así sucesivamente hasta el fin de la línea de formato.

La especificación del formato tiene la siguiente forma:            

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

Cada campo de la especificación de formato es un símbolo simple o un número que denota una opción de formato corriente. La especificación de formato más simple contiene sólo el signo de porcentaje (%) y un símbolo que define el tipo de parámetro de salida (por ejemplo %s). Si en la línea de formato hay que mostrar el signo de porcentaje, es necesario usar la especificación de formato %%.

flags

Bandera

Descripción

Comportamiento por defecto

— (menos)

Alineación por el lado izquierdo dentro del ancho establecido

Alineación por el lado derecho

+ (más)

Muestra de signos + o - para los tipos con signos

El signo se muestra sólo si el valor es negativo

0 (cero)

Antes de un valor de salida se añaden los ceros dentro del ancho establecido. Si la bandera 0 está especificada con un formato entero (i, u, x, X, o, d) y está determinada la especificación de precisión (por ejemplo, %04.d), entonces 0 se ignora.

Nada se añade

espacio

Antes de un valor de salida se pone un espacio, si el valor es de signo o positivo

Los espacios no se insertan

#

Si se usa junto con el formato o, x o X, entonces antes del valor de salida se añade 0, 0x o 0X respectivamente.

Nada se añade

 

Si se usa junto con el formato e, E, a o A, el valor siempre se muestra con punto decimal.

El punto decimal se muestra sólo si hay una parte fraccionaria no nula

 

Si se usa junto con el formato g o G, la bandera determina la presencia del punto decimal en el valor de salida e impide el recorte de ceros principales.

La bandera # se ignora durante el uso compartido con los formatos c, d, i, u, s.

El punto decimal se muestra sólo si hay una parte fraccionaria no nula. Los ceros principales se cortan

width #

El número decimal no negativo que establece el número mínimo de símbolos de salida del valor formateado. Si el número de símbolos de salida es menos que el ancho especificado, entonces se añade la cantidad correspondiente de espacios a la izquierda o a la derecha dependiendo de la alineación (bandera —). Si hay bandera cero (0), se añade la cantidad correspondiente de ceros antes del valor de salida. Si el número de símbolos de salida es más que el ancho especificado, entonces el valor de salida nunca se corta.

Si el asterisco (*) está especificado como el ancho, el valor del tipo int tiene que estar en la lista de parámetros pasados en el lugar correspondiente. Este valor va a ser usado para especificar el ancho del valor de salida.

precision #

El número decimal no negativo que determina la precisión de salida, es decir, el número de cifras después del punto decimal. A diferencia de la especificación del ancho, la especificación de precisión puede recortar parte del valor fraccionario con redondeo o sin él.

Para diferentes tipos (type) de formato la especificación de precisión se aplica de diferentes maneras.

Tipos

descripción

Comportamiento por defecto

a, A

La especificación de precisión fija el número de dígitos después del punto decimal.

Precisión por defecto — 6.

c, C

No se usa.

 

d, i, u, o, x, X

Fija el número mínimo de cifras de salida. Si el número de cifras en el parámetro correspondiente es menos de la precisión indicada, el valor de salida se completa con ceros por la izquierda. El valor de salida no se recorta, si el número de cifras de salida es más de la precisión indicada.

Precisión por defecto  — 1.

e, E, f

Fija el número de dígitos después del punto decimal. La última cifra se redondea.

Precisión por defecto  — 6. Si está especificada la precisión 0 o falta la parte fraccionaria, el punto decimal no se muestra.

g, G

Fija el número máximo de cifras significantes.

Se muestran 6 cifras significantes.

s

Fija el número de símbolos de salida de una línea. Si el largo de una línea supera el valor de la precisión, esta línea se recorta en la salida.

Se muestra toda la línea.

 

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

h | l | ll | I32 | I64

Especificación de tamaños de datos pasados como parámetros.

Tipo de parámetro

Prefijo utilizado

Especificador compartido del tipo

int

l (L minúscula)

d, i, o, x, or X

uint

l (L minúscula)

o, u, x, or X

long

ll (dos L minúsculas)

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 #

El especificador del tipo es el único campo obligatorio para la salida formateada.

Símbolo

Tipo

Formato de salida

c

int

Símbolo del tipo short (Unicode)

C

int

Símbolo del tipo char (ANSI)

d

int

Entero decimal con signo

i

int

Entero decimal con signo

o

int

Entero octal sin signo

u

int

Entero decimal sin signo

x

int

Entero hexadecimal sin signo, utilizando "abcdef"

X

int

Entero hexadecimal sin signo, utilizando "ABCDEF"

e

double

Valor real en formato [ — ]d.dddd e [sign]ddd, donde la d es una cifra decimal, dddd — una o más cifras decimales, ddd — número de tres cifras que determina el tamaño de exponente, sign — signo más o menos

E

double

Similar al formato e, salvo que el signo de exponente se imprime con mayúscula (E en vez de e)

f

double

Valor real en formato [ — ]dddd.dddd, donde dddd — una o más cifras decimales. El número de dígitos antes del punto decimal depende de la magnitud del valor del número. El número de dígitos después del punto decimal depende la precisión necesaria.

g

double

Valor real mostrado en el formato f o e, dependiendo de cuál de las salidas va a ser más compacta.

G

double

Valor real mostrado en el formato f o E, dependiendo de cuál de las salidas va a ser más compacta.

a

double

Valor real en el formato [−]0xh.hhhh p±dd, donde h.hhhh es la mantisa en forma de cifras hexadecimales, usando "abcdef", dd — una o más cifras de la exponente. El número de dígitos después del punto decimal se determina por laespecificación de precisión

A

double

Valor real en el formato [−]0xh.hhhh P±dd, donde h.hhhh es la mantisa en forma de cifras hexadecimales, usando "ABCDEF", dd — una o más cifras de la exponente. El número de dígitos después del punto decimal se determina por la especificación de precisión

s

string

Muestra de línea

En vez de la función PrintFormat() se puede usar la función printf().

Ejemplo:

void OnStart()
  {
//--- nombre del servidor comercial
   string server=AccountInfoString(ACCOUNT_SERVER);
//--- número de la cuenta comercial
   int login=(int)AccountInfoInteger(ACCOUNT_LOGIN);
//--- mostrar valor long
   long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE);
   PrintFormat("%s %d: apalancamiento = 1:%I64d",
               server,login,leverage);
//--- divisa del depósito
   string currency=AccountInfoString(ACCOUNT_CURRENCY);               
//--- mostrar valor double con 2 dígitos tras punto decimal
   double equity=AccountInfoDouble(ACCOUNT_EQUITY);
   PrintFormat("%s %d: tamaño de fondos propios en la cuenta = %.2f %s",
               server,login,equity,currency);
//--- mostrar valor double visualizando obligatoriamente el signo +/-
   double profit=AccountInfoDouble(ACCOUNT_PROFIT);
   PrintFormat("%s %d: resultado actual de posiciones abiertas = %+.2f %s",
               server,login,profit,currency);
//--- mostrar valor double con el número aleatorio de dígitos tras el punto decimal
   double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   string format_string=StringFormat("%%s: valor de un punto  = %%.%df",_Digits);
   PrintFormat(format_string,_Symbol,point_value);
//--- mostrar valor int
   int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   PrintFormat("%s: spread actual en puntos = %d ",
               _Symbol,spread);
//--- mostrar valor double en formato científico con el punto flotante y precisión de 17 dígitos
   PrintFormat("DBL_MAX = %.17e",DBL_MAX);   
//--- mostrar valor double en formato científico con el punto flotante y precisión de 17 dígitos
   PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE);  
//--- visualización a través PrintFormat() con precisión predefinida
   PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE);
//--- visualización simple a través de Print()
   Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE);
/* resultado de ejecución
   MetaQuotes-Demo 1889998: apalancamiento = 1:100
   MetaQuotes-Demo 1889998: tamaño de fondos propios en la cuenta = 22139.86 USD
   MetaQuotes-Demo 1889998: resultado actual de posiciones abiertas = +174.00 USD
   EURUSD: valor de un punto  = 0.00001
   EURUSD: spread actual en puntos = 12 
   DBL_MAX = 1.79769313486231570e+308
   EMPTY_VALUE = 1.79769313486231570e+308
   PrintFormat(EMPTY_VALUE) = 1.797693e+308
   Print(EMPTY_VALUE) = 1.797693134862316e+308
*/   
  }

Véase también

StringFormat, DoubleToString, Tipos reales (double, float)