PrintFormat

Formata e entra conjuntos de símbolos e valores no log do Expert Advisor em concordância com um formato predefinido.

void  PrintFormat(
   string format_string,   // string de formato
   ...                     // valores de tipo simples
   );

Parâmetros

format_string

[in]  A string de formato consiste de símbolos simples, e se a string de formato é seguido por argumentos, ela também contém especificações de formato.

...

[in]  Quaisquer valores de tipos simples separados por vírgula. Número total de parâmetros não pode exceder A 64, incluindo a string de formato.

Valor do Retorno

String.

Observação

A função Printformat() não funciona no durante a otimização no Testador de Estratégias.

O número, ordem e tipo dos parâmetros devem corresponder exatamente com o conjunto de qualificadores, caso contrário, o resultado do print é indefinido. Ao invés de PrintFormat(), você pode usar printf().

Se a string de formato for seguida por parâmetros, esta string deve conter especificações de formato que denotem o formato de saída destes parâmetros. Especificações de formato sempre começam com o sinal de percentual (%).

Uma string de formato é lida da esquerda para direita. Quando a primeira especificação de formato é encontrada (se houver alguma), o valor do primeiro parâmetro após a string de formato é transformado e impresso de acordo com a especificação predefinida. A segunda especificação de formato chama a transformação e impressão do segundo parâmetro, e assim por diante até a string de formato acabe.

A especificação de formato tem a seguinte forma:            

          %[flags][largura][.precisão][{h | l | ll | I32 | I64}]tipo

Cada campo da especificação de formato é tanto um símbolo simples, como um número denotando uma opção de formato simples. A especificação de formato mais simples contém somente o sinal de percentagem (%) e um símbolo definindo o tipo do parâmetro de saída (por exemplo, %s). Se você precisar imprimir o sinal de percentual na string de formato, use o especificação de formato %%.

flags

Flag

Descrição

Comportamento Default

— (menos)

Justificação a esquerda dentro da largura (width) predefinida

Justificação a direita

+ (mais)

Imprime o sinal + ou - de valores de tipos com sinal

O sinal somente é mostrada se o valor for negativo

0 (zero)

Zeros são adicionados antes de um valor impresso com a largura predefinida. Se o flag 0 for especificado com um formato inteiro (i, u, x, X, o, d) e a especificação de precisão for definida (por exemplo, %04.d), então 0 é ignorado.

Nada é adicionado

espaço

Um espaço é exibido antes de um valor impresso, se ele for um valor com sinal e positivo

Espaços não são inseridos

#

Se usado em conjunto com o formato o, x ou X, então antes do valor de saída 0, 0x ou 0X é adicionado respectivamente.

Nada é adicionado

 

Se usado em conjunto com o formato e, E, a ou A, o valor é sempre mostrado com um ponto decimal.

Ponto decimal é mostrado somente se houver um parte fracionária não-zero.

 

Se usado em conjunto com o formato g ou G, o flag define a presença de um ponto decimal no valor de saída e evita o truncamento de zeros à esquerda.

O flag # é ignorado quando usado em conjunto com formatos c, d, i, u, s.

Ponto decimal é mostrado somente se houver um parte fracionária não-zero. Zeros à esquerda são cortados.

largura

Um número decimal não negativo que define o número mínimo de símbolos de saída do valor formatado. Se o número de saída de símbolos é menor do que a largura especificada, o correspondente número de espaços é adicionado a partir da esquerda ou direita, dependendo do alinhamento (flag -). Se houver o flag zero (0), o número correspondente de zeros é adicionado antes do valor de saída. Se o número de saída de símbolos de saída é maior do que a largura especificada, o valor de saída não é cortado.

Se um asterisco (*) for especificado como width, um valor de tipo int deve ser indicado no lugar correspondente da lista de parâmetros passados. Ele será usado para especificar a largura do valor de saída.

precisão

Um número decimal não negativo que define a precisão de saída - número de dígitos após o ponto decimal. Como diferença da especificação de largura, a especificação de precisão pode truncar a parte fracionário com ou sem arredondamento.

O uso da especificação de precisão é diferente para tipos de formato diferentes.

Tipos

Descrição

Comportamento Default

a, A

Especificação de precisão define o número de dígitos após o ponto decimal.

Precisão padrão — 6.

c, C

Não usado

 

d, i, u, o, x, X

Define o número mínimo de dígitos de saída. Se o número de dígitos em um parâmetro correspondente for menor que esta precisão, zeros são adicionados a esquerda do valor de saída. O valor de saída não é cortado, se o número de dígitos de saída é maior do que a precisão apurada.

Precisão padrão — 1.

e, E, f

Define o número de dígitos de saída após o ponto decimal. O último dígito é arredondado.

Precisão padrão — 6. Se a definição de precisão for 0 ou a parte decimal estiver ausente, o ponto decimal não é exibido.

g, G

Define o número máximo de números significativos.

6 números significativos são impressos.

s, S

Define o número de saída dos símbolos de uma string. Se o comprimento da string excede ao apurado, a string e cortada.

Toda a string é a saída.

h | l | ll | I32 | I64

Especificação de tamanhos dos dados, passados como parâmetro.

Tipo de Parâmetro

Prefixo Usado

Especificador Conjunto de Tipo

int

l (letra minúscula L)

d, i, o, x, or X

uint

l (letra minúscula L)

o, u, x, or X

long

ll (duas letras minúsculas L)

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

tipo

Especificador de tipo é o único campo obrigatório para a saída formatada.

Símbolo

Tipo

Formato de Saída

c

int

Símbolo de tipo short (Unicode)

C

int

Símbolo de tipo char (ANSI)

d

int

Inteiro decimal com sinal

i

int

Inteiro decimal com sinal

o

int

Inteiro octal sem sinal

u

int

Inteiro decimal sem sinal

x

int

Inteiro hexadecimal sem sinal, usando "abcdef"

X

int

Inteiro hexadecimal sem sinal, usando "ABCDEF"

e

double

Um valor real no formato [-] d.dddde[sinal] ddd, onde d - um dígito decimal, dddd - um ou mais dígitos decimais, ddd - um número de três dígitos que determina o tamanho do exponente, sinal - mais ou menos

E

double

Semelhando ao formato de e, exceto que o sinal do expoente é impresso em letra maiúscula (E ao invés de e)

f

double

Um valor real no format [-] dddd.dddd, onde dddd - um ou mais dígitos decimais. Número de dígitos exibidos depois do ponto decimal depende do tamanho do valor do número. Número de dígitos após o ponto decimal depende da precisão requerida.

g

double

Uma saída de valor real no formato f ou edepende de qual saída é mais compacta.

G

double

Uma saída de valor real no formato F ou Edepende de qual saída é mais compacta.

a

double

Um número real no formato [−]0xh.hhhh p±dd, onde h.hhhh — mantissa na forma de dígitos hexadecimais, usando "abcdef", dd - Um ou mais dígitos de expoente. Número de posições decimais é determinado pela especificação de precisão

A

double

Um número real no formato [−]0xh.hhhh p±dd, onde h.hhhh — mantissa na forma de dígitos hexadecimais, usando "abcdef", dd - Um ou mais dígitos de expoente. Número de posições decimais é determinado pela especificação de precisão

s

string

Saída da string

Ao invés de PrintFormat(), você pode usar printf().

Exemplo:

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
*/
  }

Também Veja

StringFormat, DoubleToString, Tipos reais (double, float)