Преобразование данных

Группа функций, обеспечивающих преобразование данных из одного формата в данные другого формата.

Особо следует отметить функцию NormalizeDouble(), которая обеспечивает требуемую точность представления цены. В торговых операциях нельзя использовать ненормализованные цены, чья точность превышает требуемую торговым сервером хотя бы на один знак.

Функция

Действие

CharToString

Преобразование кода символа в односимвольную строку

DoubleToString

Преобразование числового значения в текстовую строку с указанной точностью

EnumToString

Преобразование значения перечисления любого типа в строку

NormalizeDouble

Округление числа с плавающей точкой до указанной точности

StringToDouble

Преобразование строки, содержащей символьное представление числа, в число типа double

StringToInteger

Преобразование строки, содержащей символьное представление числа, в число типа int

StringToTime

Преобразование строки, содержащей время и/или дату в формате «yyyy.mm.dd [hh:mi]», в число типа datetime

TimeToString

Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата «yyyy.mm.dd hh:mi»

IntegerToString

Преобразование значения целого типа в строку указанной длины

ShortToString

Преобразование код символа (unicode) в односимвольную строку

ShortArrayToString

Копирует часть массива в строку

StringToShortArray

Посимвольно копирует строку в указанное место массива типа ushort

CharArrayToString

Преобразует код символа (ansi) в односимвольную строку

StringToCharArray

Посимвольно копирует преобразованную из Unicode в ANSI строку в указанное место массива типа uchar

ColorToARGB

Преобразует тип color в тип uint для получения ARGB-представления цвета.

ColorToString

Преобразует значение цвета в строку вида «R,G,B»

StringToColor

Преобразует строку типа «R,G,B» или строку, содержащую наименование цвета, в значение типа color

StringFormat

Преобразует число в строку в соответствие с заданным форматом

 

CharToString

Преобразование кода символа в односимвольную строку.

string CharToString(
 uchar char_code // числовой код символа
 );

Параметры

char_code — [in] Код символа ANSI.

Возвращаемое значение

Строка, содержащая символ ANSI.

 

CharArrayToString

Копирует и преобразует часть массива типа uchar в возвращаемую строку.

string CharArrayToString(
 uchar array[], // массив
 int start=0, // начальная позиция в массиве
 int count=-1 // количество символов
 uint codepage=CP_ACP // кодовая страница
 );

Параметры

array[] — [in] Массив типа uchar.

start=0 — [in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1 — [in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

codepage=CP_ACP — [in] Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.

Возвращаемое значение

Строка.

 

ColorToARGB

Преобразует тип color в тип uint для получения ARGB-представления цвета. ARGB формат цвета используется при создании графического ресурса, вывода текста и в классе стандартной библиотеки CCanvas.

uint ColorToARGB(
 color clr, // преобразуемый цвет в формате color
 uchar alpha=255 // альфа-канал, управляющий прозрачностью цвета
 );

Параметры

clr — [in] Значение цвета в переменной типа color.

alpha — [in] Значение альфа-канала, для получения цвета в формате ARGB. Задается значением от 0 (цвет накладываемого пикселя совсем не меняет отображения нижележащего пикселя) до 255 (цвет накладывается полностью и перекрывает собою цвет нижележащего пикселя). Прозрачность цвета в процентом выражении вычисляется как (1-alpha/255)*100%, то есть чем меньше значение альфа-канала, тем более прозрачен цвет.

Возвращаемое значение

Представление цвета в формате ARGB, где в четырех байтах типа uint прописаны по порядку значения Alfa, Red, Green, Blue (альфа-канал, красный, зеленый, голубой).

Примечание

Основным общеупотребимым форматом для описания цвета пикселя на экране дисплея в компьютерной графике является RGB, где по названиям базовых цветов задаются красная (Red), зеленая (Green) и синяя (Blue) компоненты цвета. Каждая компонента описывается одним байтом, задающим насыщенность данного цвета в интервале от 0 до 255 (от 0x00 до 0XFF в шестнадцатеричном формате). Так как белый цвет содержит в себе все цвета, то он описывается как 0xFFFFFF, то есть каждая из трех компонент представлена максимальным значением 0xFF.

Но в ряде задач требуется указание прозрачности цвета, чтобы описать, каким образом будет выглядеть изображение, если на него наложен цвет с некоторой долей прозрачности. Для таких случаев вводится понятие альфа-канала (Alpha), который вводится как дополнительная компонента к формату RGB. Схема формата ARGB показана на рисунке.

argb

Значения в виде ARGB обычно указываются в шестнадцатеричном формате, где каждая пара цифр представляет по порядку значения каналов Alpha, Red, Green и Blue. Например, ARGB-цвет 80FFFF00 означает желтый цвет с непрозрачностью 50.2 %. В начале идет 0x80, которое задает 50.2% значение альфа-канала, так как это 50.2% от значения 0xFF; далее первая пара FF представляет максимальное значение красной компоненты; следующая пара FF задает такую же силу зеленой компоненты; и последняя пара 00 представляет минимальное значение синей компоненты (отсутствие синего). Сложение зеленого и красного цвета дает желтый. Если альфа-канал не используется, запись может быть сокращена до 6 цифр RRGGBB, вот почему значения альфа-канала хранятся в верхних битах целочисленного типа uint.

В зависимости от контекста 16-ричные цифры могут записываться с префиксом ‘0x’ или ‘#’, например, 80FFFF00, или 0x80FFFF00, или #80FFFF00.

Пример:

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- зададим прозрачность
   uchar alpha=0x55; // значение 0x55 означает 55/255=21.6 % прозрачности 

   //--- выведем преобразование в ARGB для цвета clrBlue
   PrintFormat("0x%.8X - clrBlue",clrBlue);
   PrintFormat("0x%.8X - clrBlue ARGB with alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrBlue,alpha));

   //--- выведем преобразование в ARGB для цвета clrGreen
   PrintFormat("0x%.8X - clrGreen",clrGreen);
   PrintFormat("0x%.8X - clrGreen ARGB with alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrGreen,alpha));

   //--- выведем преобразование в ARGB для цвета clrRed
   PrintFormat("0x%.8X - clrRed",clrRed);
   PrintFormat("0x%.8X - clrRed ARGB with alpha=0x55 (transparency 21.6%%)",ColorToARGB(clrRed,alpha));
}

 

ColorToString

Преобразует значение цвета в строку вида «R,G,B».

string ColorToString(
 color color_value, // значение цвета
 bool color_name // выводить имя цвета или нет
 );

Параметры

color_value — [in] Значение цвета в переменной типа color.

color_name — [in] Признак необходимости возвращать имя цвета, в случае, если значение цвета совпадает с одной из предопределенных цветовых констант.

Возвращаемое значение

Строковое представление цвета в виде «R,G,B», где R, G и B представляют собой преобразованные в строку десятичные константы со значением от 0 до 255. Если задан параметр color_name=true, то производится попытка преобразовать значение цвета к имени цвета.

Пример:

string clr=ColorToString(C'0,255,0'); // зеленый цвет
Print(clr);
 
clr=ColorToString(C'0,255,0',true); // получить цветовую константу
Print(clr);

 

DoubleToString

Преобразование числового значения в текстовую строку.

string DoubleToString(
 double value, // число
 int digits=8 // кол-во знаков после запятой
 );

Параметры

value — [in] Величина с плавающей точкой.

digits — [in] Формат точности. Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то будет получено строковое представление числа в научном формате с указанным количеством знаков после запятой. Во всех остальных случаях строковое представление числа будет содержать 8 знаков после запятой.

Возвращаемое значение

Строка, содержащая символьное представление числа в указанном формате точности.

Пример:

Print("DoubleToString(120.0+M_PI) : ",DoubleToString(120.0+M_PI));
Print("DoubleToString(120.0+M_PI,16) : ",DoubleToString(120.0+M_PI,16));
Print("DoubleToString(120.0+M_PI,-16) : ",DoubleToString(120.0+M_PI,-16));
Print("DoubleToString(120.0+M_PI,-1) : ",DoubleToString(120.0+M_PI,-1));
Print("DoubleToString(120.0+M_PI,-20) : ",DoubleToString(120.0+M_PI,-20));

 

EnumToString

Преобразование значения перечисления любого типа в текстовое представление.

string EnumToString(
 any_enum value // значение из перечисления любого типа
 );

Параметры

value — [in] Значение перечисления любого типа.

Возвращаемое значение

Строка, содержащая текстовое представление значения. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

Примечание

Функция может установить в переменной _LastError следующие значения ошибок:

ERR_INTERNAL_ERROR – ошибка среды выполнения
ERR_NOT_ENOUGH_MEMORY – недостаточно памяти для завершения операции
ERR_INVALID_PARAMETER – невозможно разрешить имя значения перечисления

Пример:

enum interval // перечисление именованных констант
{
  month=1,     // интервал в один месяц
  two_months,  // два месяца
  quarter,     // три месяца - квартал
  halfyear=6,  // полугодие
  year=12,     // год - 12 месяцев
};

//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
   //--- установим временной интервал равным месяцу
   interval period=month;
   Print(EnumToString(period)+"="+IntegerToString(period));
 
   //--- установим временной интервал равным кварталу (три месяца)
   period=quarter;
   Print(EnumToString(period)+"="+IntegerToString(period));
 
   //--- установим временной интервал равным году (12 месяцев) 
   period=year;
   Print(EnumToString(period)+"="+IntegerToString(period));
 
   //--- проверим как выводится тип ордера
   ENUM_ORDER_TYPE type=ORDER_TYPE_BUY;
   Print(EnumToString(type)+"="+IntegerToString(type));
 
   //--- проверим как выводится неверное значение
   type=WRONG_VALUE;
   Print(EnumToString(type)+"="+IntegerToString(type));
 
   // Результат выполнения:
   // month=1
   // quarter=3
   // year=12
   // ORDER_TYPE_BUY=0
   // ENUM_ORDER_TYPE::-1=-1
}

 

IntegerToString

Преобразует значение целого типа в строку указанной длины и возвращает полученную строку.

string IntegerToString(
 long number, // число
 int str_len=0, // длина строки на выходе
 ushort fill_symbol=' ' // заполнитель
 );

Параметры

number — [in] Число для преобразования.

str_len=0 — [in] Длина строки. Если длина полученной строки окажется больше указанной, то строка не усекается. Если длина полученной строки окажется меньше, то полученная строка будет дополнена слева символом-заполнителем.

fill_symbol=’ ‘ — [in] Символ-заполнитель. По умолчанию – пробел.

Возвращаемое значение

Строка.

 

ShortToString

Преобразует код символа (unicode) в односимвольную строку и возвращает полученную строку.

string ShortToString(
 ushort symbol_code // символ
 );

Параметры

symbol_code — [in] Код символа. Вместо кода символа можно использовать литеральную строку, содержащую символ, либо литеральную строку с двухбайтовым шестнадцатиричным кодом, соответствующему символу из таблицы Unicode.

Возвращаемое значение

Строка.

 

ShortArrayToString

Копирует часть массива в возвращаемую строку.

string ShortArrayToString(
 ushort array[], // массив
 int start=0, // начальная позиция в массиве
 int count=-1 // количество символов
 );

Параметры

array[] — [in] Массив типа ushort (аналог типа wchar_t).

start=0 — [in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1 — [in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

Возвращаемое значение

Строка.

 

TimeToString

Преобразование значения, содержащего время в секундах, прошедшее с 01.01.1970, в строку формата «yyyy.mm.dd hh:mi».

string TimeToString(
 datetime value, // число
 int mode=TIME_DATE|TIME_MINUTES // формат вывода
 );

Параметры

value — [in] Время в секундах от 00:00 1 января 1970.

mode=TIME_DATE|TIME_MINUTES — [in] Дополнительный режим вывода данных. Может быть одним или комбинированным флагом:
TIME_DATE получает результат в форме » yyyy.mm.dd » ,
TIME_MINUTES получает результат в форме » hh:mi » ,
TIME_SECONDS получает результат в форме » hh:mi:ss «.

Возвращаемое значение

Строка.

 

NormalizeDouble

Округление числа с плавающей точкой до указанной точности.

double NormalizeDouble(
 double value, // нормализуемое число
 int digits // кол-во знаков после запятой
 );

Параметры

value — [in] Величина с плавающей точкой.

digits — [in] Формат точности, число цифр после десятичной точки (0-8).

Возвращаемое значение

Значение типа double с заданной точностью.

Примечание

Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits().

Нужно иметь в виду, что нормализованное число при выводе в Журнал с помощью Print() может содержать большее количество знаков после запятой, чем вы ожидаете. Например,

double a=76.671; // нормализованное число с 3 знаками после запятой
Print("Print(76.671)=",a); // выведем его как есть
Print("DoubleToString(a,8)=",DoubleToString(a,8)); // выведем с заданной точностью

выдаст в терминале:

DoubleToString(a,8)=76.67100000
Print(76.671)=76.67100000000001

Пример:

double pi=M_PI;
Print("pi=",DoubleToString(pi,16));
 
double pi_3=NormalizeDouble(M_PI,3);
Print("NormalizeDouble(pi,3) = ",DoubleToString(pi_3,16));
double pi_8=NormalizeDouble(M_PI,8);
Print("NormalizeDouble(pi,8) = ",DoubleToString(pi_8,16));
 
double pi_0=NormalizeDouble(M_PI,0);
Print("NormalizeDouble(pi,0) = ",DoubleToString(pi_0,16));

/*
 Результат:
 pi= 3.1415926535897931
 NormalizeDouble(pi,3)= 3.1419999999999999
 NormalizeDouble(pi,8)= 3.1415926499999998
 NormalizeDouble(pi,0)= 3.0000000000000000
*/

 

StringToCharArray

Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов.

int StringToCharArray(
 string text_string, // строка-источник
 uchar& array[], // массив
 int start=0, // начальная позиция в массиве
 int count=-1 // количество символов
 uint codepage=CP_ACP // кодовая страница
 );

Параметры

text_string — [in] Строка для копирования.

array[] — [out] Массив типа uchar.

start=0 — [in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1 — [in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. Терминальный 0 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. Если размер динамического массива больше длины строки, то размер массива уменьшен не будет.

codepage=CP_ACP — [in] Значение кодовой страницы. Для наиболее употребимых кодовых страниц предусмотрены соответствующие константы.

Возвращаемое значение

Количество скопированных элементов.

 

StringToColor

Преобразует строку типа «R,G,B» или строку, содержащую наименование цвета, в значение типа color.

color StringToColor(
 string color_string // строковое представление цвета
 );

Параметры

color_string — [in] Строковое представление цвета типа «R,G,B» или название одного из предопределенных Web-цветов.

Возвращаемое значение

Значение цвета.

Пример:

color str_color=StringToColor("0,127,0");
Print(str_color);
Print((string)str_color);

//--- немного изменим цвет
str_color=StringToColor("0,128,0");
Print(str_color);
Print((string)str_color);

 

StringToDouble

Преобразование строки, содержащей символьное представление числа, в число типа double.

double StringToDouble(
 string value // строка
 );

Параметры

value — [in] Строка, содержащая символьное представление числа.

Возвращаемое значение

Значение типа double.

 

StringToInteger

Преобразование строки, содержащей символьное представление числа, в число типа int (целое).

long StringToInteger(
 string value // строка
 );

Параметры

value — [in] Строка, содержащая число.

Возвращаемое значение

Значение типа long.

 

StringToShortArray

Посимвольно копирует строку в указанное место массива типа ushort. Функция возвращает количество скопированных элементов.

int StringToShortArray(
 string text_string, // строка-источник
 ushort& array[], // массив
 int start=0, // начальная позиция в массиве
 int count=-1 // количество символов
 );

Параметры

text_string — [in] Строка для копирования.

array[] — [out] Массив типа ushort (аналог типа wchar_t).

start=0 — [in] Позиция, с которой начинается копирование. По умолчанию 0.

count=-1 — [in] Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. Терминальный 0 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. Если размер динамического массива больше длины строки, то размер массива уменьшен не будет.

Возвращаемое значение

Количество скопированных элементов.

 

StringToTime

Преобразование строки, содержащей время и/или дату в формате «yyyy.mm.dd [hh:mi]», в число типа datetime.

datetime StringToTime(
 string value // строка-дата
 );

Параметры

value — [in] Строка в формате » yyyy.mm.dd hh:mi «.

Возвращаемое значение

Значение типа datetime, содержащее количество секунд, прошедших с 01.01.1970.

 

StringFormat

Форматирует полученные параметры и возвращает строку.

string StringFormat(
 string format, // строка с описанием формата
 ... ... // параметры
 );

Параметры

format — [in] Строка, содержащая способ форматирования. Правила форматирования такие же, как и для функции PrintFormat

… — [in] Параметры, разделенные запятой.

Возвращаемое значение

Строка.

Пример:

void OnStart()
{
//--- строковые переменные
   string output_string;
   string temp_string;
   string format_string;
//--- подготовим заголовок спецификации
   temp_string=StringFormat("Спецификация контракта для %s:\n",_Symbol);
   StringAdd(output_string,temp_string);
//--- вывод значения int
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   temp_string=StringFormat("   SYMBOL_DIGITS = %d (количество знаков после запятой)\n",
                            digits);
   StringAdd(output_string,temp_string);
//--- вывод значения double с переменным количеством цифр после десятичной точки
   double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   format_string=StringFormat("   SYMBOL_POINT = %%.%df (значение одного пункта)\n",
                              digits);
   temp_string=StringFormat(format_string,point_value);
   StringAdd(output_string,temp_string);
//--- вывод значения int
   int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
   temp_string=StringFormat("   SYMBOL_SPREAD = %d (текущий спред в пунктах)\n",
                            spread);
   StringAdd(output_string,temp_string);
//--- вывод значения int
   int min_stop=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
   temp_string=StringFormat("   SYMBOL_TRADE_STOPS_LEVEL = %d (минимальный отступ в пунктах для стоп-ордеров)\n",
                            min_stop);
   StringAdd(output_string,temp_string);
//--- вывод значения double без дробной части
   double contract_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   temp_string=StringFormat("   SYMBOL_TRADE_CONTRACT_SIZE = %.f (размер контракта)\n",
                            contract_size);
   StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
   double tick_size=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   temp_string=StringFormat("   SYMBOL_TRADE_TICK_SIZE = %f (минимальное изменение цены)\n",
                            tick_size);
   StringAdd(output_string,temp_string);
//--- определение способа начисления свопов
   int swap_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_SWAP_MODE);
   string str_swap_mode;
   switch(swap_mode)
   {
      case SYMBOL_SWAP_MODE_DISABLED: str_swap_mode="SYMBOL_SWAP_MODE_DISABLED (нет свопов)"; break;
      case SYMBOL_SWAP_MODE_POINTS: str_swap_mode="SYMBOL_SWAP_MODE_POINTS (в пунктах)"; break;
      case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_SYMBOL (в деньгах в базовой валюте символа)"; break;
      case SYMBOL_SWAP_MODE_CURRENCY_MARGIN: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_MARGIN (в деньгах в маржинальной валюте символа)"; break;
      case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT: str_swap_mode="SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT (в деньгах в валюте депозита клиента)"; break;
      case SYMBOL_SWAP_MODE_INTEREST_CURRENT: str_swap_mode="SYMBOL_SWAP_MODE_INTEREST_CURRENT (в годовых процентах от цены инструмента на момент расчета свопа)"; break;
      case SYMBOL_SWAP_MODE_INTEREST_OPEN: str_swap_mode="SYMBOL_SWAP_MODE_INTEREST_OPEN (в годовых процентах от цены открытия позиции по символу)"; break;
      case SYMBOL_SWAP_MODE_REOPEN_CURRENT: str_swap_mode="SYMBOL_SWAP_MODE_REOPEN_CURRENT (переоткрытием позиции по цене закрытия +/- указанное количество пунктов)"; break;
      case SYMBOL_SWAP_MODE_REOPEN_BID: str_swap_mode="SYMBOL_SWAP_MODE_REOPEN_BID (переоткрытием позиции по текущей цене Bid +/- указанное количество пунктов)"; break;
   }
//--- вывод значения string
   temp_string=StringFormat("   SYMBOL_SWAP_MODE = %s\n",
                            str_swap_mode);
   StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
   double swap_long=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_LONG);
   temp_string=StringFormat("   SYMBOL_SWAP_LONG = %f (своп на покупку)\n",
                            swap_long);
   StringAdd(output_string,temp_string);
//--- вывод значения double с точностью по умолчанию
   double swap_short=SymbolInfoDouble(_Symbol,SYMBOL_SWAP_SHORT);
   temp_string=StringFormat("   SYMBOL_SWAP_SHORT = %f (своп на продажу)\n",
                            swap_short);
   StringAdd(output_string,temp_string);
//--- определение режима торговли
   int trade_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE);
   string str_trade_mode;
   switch(trade_mode)
   {
      case SYMBOL_TRADE_MODE_DISABLED: str_trade_mode="SYMBOL_TRADE_MODE_DISABLED (торговля по символу запрещена)"; break;
      case SYMBOL_TRADE_MODE_LONGONLY: str_trade_mode="SYMBOL_TRADE_MODE_LONGONLY (разрешены только покупки)"; break;
      case SYMBOL_TRADE_MODE_SHORTONLY: str_trade_mode="SYMBOL_TRADE_MODE_SHORTONLY (разрешены только продажи)"; break;
      case SYMBOL_TRADE_MODE_CLOSEONLY: str_trade_mode="SYMBOL_TRADE_MODE_CLOSEONLY (разрешены только операции закрытия позиций)"; break;
      case SYMBOL_TRADE_MODE_FULL: str_trade_mode="SYMBOL_TRADE_MODE_FULL (нет ограничений на торговые операции)"; break;
   }
//--- вывод значения string
   temp_string=StringFormat("   SYMBOL_TRADE_MODE = %s\n",
                            str_trade_mode);
   StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
   double volume_min=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   temp_string=StringFormat("   SYMBOL_VOLUME_MIN = %g (минимальный объем сделки)\n",volume_min);
   StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
   double volume_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   temp_string=StringFormat("   SYMBOL_VOLUME_STEP = %g (минимальный шаг изменения объема сделки)\n",volume_step);
   StringAdd(output_string,temp_string);
//--- вывод значения double в компактном виде
   double volume_max=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   temp_string=StringFormat("   SYMBOL_VOLUME_MAX = %g (максимальный объем сделки)\n",volume_max);
   StringAdd(output_string,temp_string);
//--- определение способа вычисления величины залоговых средств
   int calc_mode=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE);
   string str_calc_mode;
   switch(calc_mode)
   {
      case SYMBOL_CALC_MODE_FOREX:str_calc_mode="SYMBOL_CALC_MODE_FOREX (Forex)";break;
      case SYMBOL_CALC_MODE_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_FUTURES (фьючерсы)";break;
      case SYMBOL_CALC_MODE_CFD:str_calc_mode="SYMBOL_CALC_MODE_CFD (CFD)";break;
      case SYMBOL_CALC_MODE_CFDINDEX:str_calc_mode="SYMBOL_CALC_MODE_CFDINDEX (CFD на индексы)";break;
      case SYMBOL_CALC_MODE_CFDLEVERAGE:str_calc_mode="SYMBOL_CALC_MODE_CFDLEVERAGE (CFD при торговле с плечом)";break;
      case SYMBOL_CALC_MODE_EXCH_STOCKS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_STOCKS (торговля ценными бумагами на бирже)";break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES (торговля фьючерсными контрактами на бирже)";break;
      case SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS:str_calc_mode="SYMBOL_CALC_MODE_EXCH_FUTURES_FORTS (торговля фьючерсными контрактами на FORTS)";break;
   }
//--- вывод значения string
   temp_string=StringFormat("   SYMBOL_TRADE_CALC_MODE = %s\n",
                            str_calc_mode);
   StringAdd(output_string,temp_string);
//--- вывод значения double с 2 цифрами после десятичной точки
   double margin_initial=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL);
   temp_string=StringFormat("   SYMBOL_MARGIN_INITIAL = %.2f (начальная маржа)\n",
                            margin_initial);
   StringAdd(output_string,temp_string);
//--- вывод значения double с 2 цифрами после десятичной точки
   double margin_maintenance=SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_MAINTENANCE);
   temp_string=StringFormat("   SYMBOL_MARGIN_MAINTENANCE = %.2f (поддерживающая маржа)\n",
                            margin_maintenance);
   StringAdd(output_string,temp_string);
//--- вывод значения int
   int freeze_level=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
   temp_string=StringFormat("   SYMBOL_TRADE_FREEZE_LEVEL = %d (дистанция заморозки операций в пунктах)",
                            freeze_level);
   StringAdd(output_string,temp_string);
   Print(output_string);
   Comment(output_string);
/* результат выполнения
   Спецификация контракта для EURUSD:
     SYMBOL_DIGITS = 5 (количество знаков после запятой)
     SYMBOL_POINT = 0.00001 (значение одного пункта)
     SYMBOL_SPREAD = 10 (текущий спред в пунктах)
     SYMBOL_TRADE_STOPS_LEVEL = 18 (минимальный отступ в пунктах для стоп-ордеров)
     SYMBOL_TRADE_CONTRACT_SIZE = 100000 (размер контракта)
     SYMBOL_TRADE_TICK_SIZE = 0.000010 (минимальное изменение цены)
     SYMBOL_SWAP_MODE = SYMBOL_SWAP_MODE_POINTS (в пунктах)
     SYMBOL_SWAP_LONG = -0.700000 (своп на покупку)
     SYMBOL_SWAP_SHORT = -1.000000 (своп на продажу)
     SYMBOL_TRADE_MODE = SYMBOL_TRADE_MODE_FULL (нет ограничений на торговые операции)
     SYMBOL_VOLUME_MIN = 0.01 (минимальный объем сделки)
     SYMBOL_VOLUME_STEP = 0.01 (минимальный шаг изменения объема сделки)
     SYMBOL_VOLUME_MAX = 500 (максимальный объем сделки)
     SYMBOL_TRADE_CALC_MODE = SYMBOL_CALC_MODE_FOREX (Forex)
     SYMBOL_MARGIN_INITIAL = 0.00 (начальная маржа)
     SYMBOL_MARGIN_MAINTENANCE = 0.00 (поддерживающая маржа)
     SYMBOL_TRADE_FREEZE_LEVEL = 0 (дистанция заморозки операций в пунктах)
*/
}