PrintFormat
PrintFormat
该函数根据预设格式对智能交易器的日志中的符号和值进行格式化并输入。
void PrintFormat(
string format_string, // format string
... // values of simple types
);参数
- format_string
[in] 格式字符串由简单符号组成,如果格式字符串后跟有参数,则还包含格式规范。
- …
[in] 由逗号分隔的简单类型值。包括格式字符串在内,参数的总数不得超过64个。
返回值
字符串。
注意
PrintFormat() 函数在 策略测试器的优化过程中不起作用。
参数的数量、顺序和类型必须完全匹配那些规范,否则打印结果将是未定义的。可以使用 printf() 代替 PrintFormat()。
如果格式字符串后跟有参数,则该字符串必须包含表示这些参数输出格式的格式规范。格式规范始终以百分号(%)开头。
格式字符串从左到右读取。当满足第一个格式规范时(如果有的话),格式字符串后的第一个参数的值会根据预设的规范进行转换和输出。第二个格式规范会调用第二个参数的转换和输出,依此类推直到格式字符串结束。
格式规范具有以下形式:
%[flags][width][.precision][{h | l | ll | I32 | I64}]type
格式规范中的每个字段要么是简单符号,要么是表示简单格式选项的数字。最简单的格式规范仅包含百分号(%)和一个符号,用于定义输出参数的类型(例如,%s)。如果需要在格式字符串中输出百分号,则使用格式规范 %%。
flags
| 标志 | 描述 | 默认行为 |
|---|---|---|
| – (减号) | 在指定宽度内左对齐 | 右对齐 |
| + (加号) | 对于符号类型的值,输出+或-符号 | 只有当值为负数时才显示符号 |
| 0 (零) | 在预设宽度内的输出值前添加零。如果整数格式(i, u, x, X, o, d)指定了0标志并且设置了精度规范(例如,%04.d),则忽略0。 | 不添加任何内容 |
| space | 如果输出值是符号且为正值,则在输出值前显示空格 | 不插入空格 |
| # | 如果与格式o、x或X一起使用,则分别在输出值前添加0、0x或0X。 | 不添加任何内容 |
| 如果与格式e、E、a或A一起使用,值总是带有小数点。 | 只有当有非零小数部分时才显示小数点。 | |
| 如果与格式g或G一起使用,该标志定义了输出值中是否包含小数点,并防止前导零被截断。 当与格式c、d、i、u、s一起使用时,该标志被忽略。 | 只有当有非零小数部分时才显示小数点。前导零会被截断。 |
width
一个非负十进制数,用于设置格式化值的最小输出符号数。如果输出符号数少于指定宽度,则根据对齐方式(标志–)在左侧或右侧添加相应数量的空格。如果指定了零标志(0),则在输出值前添加相应数量的零。如果输出符号数大于指定宽度,则不会截断输出值。
如果指定了星号(*)作为宽度,则必须在传递的参数列表中指定int类型的值。它将用于指定输出值的宽度。
precision
一个非负十进制数,用于设置输出精度——小数点后的位数。与宽度规范不同,精度规范可以截断小数部分,无论是否四舍五入。
不同格式类型对精度规范的使用方式不同。
| 类型 | 描述 | 默认行为 |
|---|---|---|
| a, A | 精度规范设置小数点后的位数。 | 默认精度为6。 |
| c, C | 不使用 | |
| d, i, u, o, x, X | 设置最小输出位数。如果相应参数中的位数少于此精度,则在输出值左侧添加零。如果输出位数大于指定精度,则不会截断输出值。 | 默认精度为1。 |
| e, E, f | 设置小数点后的输出位数。最后一位是四舍五入的。 | 默认精度为6。如果设置精度为0或小数部分不存在,则不显示小数点。 |
| g, G | 设置最大有效数位数。 | 输出6个有效数位。 |
| s, S | 设置字符串的输出符号数。如果字符串长度超过精度,则截断字符串。 | 输出整个字符串。 |
h | l | ll | I32 | I64
作为参数传递的数据大小规范。
| 参数类型 | 使用的前缀 | 类型的联合规范器 |
|---|---|---|
| int | l (小写L) | d, i, o, x, 或 X |
| uint | l (小写L) | o, u, x, 或 X |
| long | ll (两个小写L) | d, i, o, x, 或 X |
| short | h | d, i, o, x, 或 X |
| ushort | h | o, u, x, 或 X |
| int | I32 | d, i, o, x, 或 X |
| uint | I32 | o, u, x, 或 X |
| long | I64 | d, i, o, x, 或 X |
| ulong | I64 | o, u, x, 或 X |
type
类型规范器是格式化输出中唯一的必填字段。
| 符号 | 类型 | 输出格式 |
|---|---|---|
| c | int | 短类型(Unicode)的符号 |
| C | int | char类型(ANSI)的符号 |
| d | int | 有符号十进制整数 |
| i | int | 有符号十进制整数 |
| o | int | 无符号八进制整数 |
| u | int | 无符号十进制整数 |
| x | int | 无符号十六进制整数,使用“abcdef” |
| X | int | 无符号十六进制整数,使用“ABCDEF” |
| e | double | 实数值,格式为[-] d.dddde[sign] ddd,其中d是一个小数位,ddddd是一个或多个小数位,ddd是一个三位数的数字,用于确定指数的大小,sign是加号或减号 |
| E | double | 与e格式类似,但指数的符号用大写字母表示(E代替e) |
| f | double | 实数值,格式为[-] dddd.dddd,其中ddddd是一个或多个小数位。小数点前的显示位数取决于数值的大小。小数点后的位数取决于所需的精度。 |
| g | double | 根据哪种输出更紧凑,以f或e格式输出实数值。 |
| G | double | 根据哪种输出更紧凑,以F或E格式输出实数值。 |
| a | double | 实数值,格式为[−]0xh.hhhh p±dd,其中h.hhhh是十六进制数字形式的尾数,使用“abcdef”,dd是一个或多个指数位。小数位的个数由精度规范决定 |
| A | double | 实数值,格式为[−]0xh.hhhh P±dd,其中h.hhhh是十六进制数字形式的尾数,使用“ABCDEF”,dd是一个或多个指数位。小数位的个数由精度规范决定 |
| s | string | 字符串输出 |
可以使用printf()代替PrintFormat()。
示例:
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 orders = %+.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 4236774: leverage = 1:100
MetaQuotes-Demo 4236774: account equity = 9998.49 USD
MetaQuotes-Demo 4236774: current result for open orders = -1.51 USD
EURJPY: point value = 0.001
EURJPY: current spread in points = 15
DBL_MAX = 1.79769313486231570e+308
EMPTY_VALUE = 2.14748364700000000e+009
PrintFormat(EMPTY_VALUE) = 2.147484e+009
Print(EMPTY_VALUE) = 2147483647
*/
}