Функции общего назначения, которые не вошли ни в одну из специализированных групп.
Функция |
Действие |
Alert |
Выводит сообщение в отдельном окне |
CheckPointer |
Возвращает тип указателя объекта |
Comment |
Выводит сообщение в левый верхний угол ценового графика |
CryptEncode |
Преобразует данные массива-источника в массив-приемник указанным методом |
CryptDecode |
Производит обратное преобразование данных массива |
DebugBreak |
Программная точка останова при отладке |
ExpertRemove |
Прекращает работу эксперта и выгружает его с графика |
GetPointer |
Возвращает указатель объекта |
GetTickCount |
Возвращает количество миллисекунд, прошедших с момента старта системы |
GetMicrosecondCount |
Возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы |
MessageBox |
Создает и отображает окно сообщений, а также управляет им |
PeriodSeconds |
Возвращает количество секунд в периоде |
PlaySound |
Воспроизводит звуковой файл |
|
Выводит сообщение в журнал |
PrintFormat |
Форматирует и печатает наборы символов и значений в лог-файл в соответствие с заданным форматом |
ResetLastError |
Устанавливает значение предопределенной переменной _LastError в ноль |
ResourceCreate |
Создает ресурс изображения на основе набора данных |
ResourceFree |
Удаляет динамически созданный ресурс (освобождает занятую ресурсом память) |
ResourceReadImage |
Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX5-файле при компиляции |
ResourceSave |
Сохраняет ресурс в указанный файл |
SetUserError |
Устанавливает предопределенную переменную _LastError в значение, равное ERR_USER_ERROR_FIRST + user_error |
SendFTP |
Посылает файл по адресу, указанному в окне настроек на закладке «FTP» |
SendMail |
Посылает электронное письмо по адресу, указанному в окне настроек на закладке «Почта» |
SendNotification |
Посылает Push-уведомления в мобильные терминалы, чьи MetaQuotes ID указаны на закладке «Уведомления» |
Sleep |
Задерживает выполнение текущего эксперта или скрипта на определенный интервал |
TerminalClose |
Посылает терминалу команду на завершение работы |
TesterStatistics |
Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования |
TesterWithdrawal |
Эмуляция операций снятия средств в процессе тестирования |
TranslateKey |
Возвращает Unicode-символ по виртуальному коду клавиши |
WebRequest |
Отправляет HTTP-запрос на указанный сервер |
ZeroMemory |
Обнуляет переменную, переданную по ссылке. Тип переменной может быть любым, исключение составляют только классы и структуры, имеющие конструкторы |
Alert
Отображает диалоговое окно, содержащее пользовательские данные.
void Alert(argument, // первое значение ... // последующие значения );
Параметры
argument — [in] Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк можно использовать символ перевода строки «\n» либо «\r\n». Количество параметров не может превышать 64.
Возвращаемое значение
Нет возвращаемого значения
Примечание
Массивы нельзя передавать в функцию Alert(). Массивы должны выводиться поэлементно. Данные типа double выводятся с 8 десятичными цифрами после точки, данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в научном формате необходимо использовать функцию DoubleToString().
Данные типа bool выводятся в виде строк «true» или «false«. Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.
При работе в тестере стратегий функция Alert() не выполняется.
CheckPointer
Возвращает тип указателя объекта.
ENUM_POINTER_TYPE CheckPointer( object* anyobject // указатель объекта );
Параметры
anyobject — [in] Указатель объекта.
Возвращаемое значение
Возвращает значение из перечисления ENUM_POINTER_TYPE.
Примечание
Попытка обращения к некорректному указателю приводит к критическому завершению программы. Поэтому существует необходимость использования функции CheckPointer перед использованием указателя. Указатель может быть некорректным в следующих случаях:
указатель равен NULL;
если объект был уничтожен при помощи оператора delete.
Данную функцию можно использовать как проверку указателя на корректность. Значение, отличное от нуля, гарантирует, что по этому указателю можно получить доступ к данным.
Пример:
//+------------------------------------------------------------------+ //| Уничтожает список через уничтожение элементов | //+------------------------------------------------------------------+ void CMyList::Destroy() { //--- служебный указатель для работы в цикле CItem* item; //--- пройдемся в цикле и попытаемся удалить динамические указатели while(CheckPointer(m_items)!=POINTER_INVALID) { item=m_items; m_items=m_items.Next(); if(CheckPointer(item)==POINTER_DYNAMIC) { Print("Dynamyc object ",item.Identifier()," to be deleted"); delete (item); } else Print("Non-dynamic object ",item.Identifier()," cannot be deleted"); } }
Comment
Выводит комментарий, определенный пользователем, в левый верхний угол графика.
void Comment(argument, // первое значение ... // последующие значения );
Параметры
… — [in] Любые значения, разделенные запятыми. Для разделения выводимой информации на несколько строк можно использовать символ перевода строки «\n» либо «\r\n». Количество параметров не может превышать 64. Общая длина выводимого сообщения (включая служебные неотображаемые символы) не может превышать 2045 символов (лишние символы будут обрезаны при выводе).
Возвращаемое значение
Нет возвращаемого значения
Примечание
Массивы нельзя передавать в функцию Comment(). Массивы должны печататься поэлементно.
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно указанном формате необходимо использовать функцию DoubleToString().
Данные типа bool выводятся в виде строк «true» или «false«. Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.
Пример:
void OnTick() { double Ask,Bid; int Spread; Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK); Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID); Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD); //--- Выведем значения в три строчки Comment(StringFormat("Выводим цены\nAsk = %G\nBid = %G\nSpread = %d",Ask,Bid,Spread)); }
CryptEncode
Преобразует данные массива-источника в массив-приемник указанным методом.
int CryptEncode( ENUM_CRYPT_METHOD method, // метод преобразования const uchar& data[], // массив-источник const uchar& key[], // ключ шифрования uchar& result[] // массив-приемник );
Параметры
method — [in] Метод преобразования. Может быть одним из значений перечисления ENUM_CRYPT_METHOD.
data[] — [in] Массив-источник.
key[] — [in] Ключ шифрования.
result[] — [out] Массив-приемник.
Возвращаемое значение
Количество байт в массиве-приемнике или 0 в случае ошибки. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
Пример:
//+------------------------------------------------------------------+ //| ArrayToHex | //+------------------------------------------------------------------+ string ArrayToHex(uchar &arr[],int count=-1) { string res=""; //--- проверка размера if(count<0 || count>ArraySize(arr)) count=ArraySize(arr); //--- преобразование в шестнадцатиричную строку for(int i=0; i<count; i++) res+=StringFormat("%.2X",arr[i]); return(res); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string text="The quick brown fox jumps over the lazy dog"; string keystr="ABCDEFG"; uchar src[],dst[],key[]; //--- подготовка ключа шифрования StringToCharArray(keystr,key); //--- подготовка исходного массива src[] StringToCharArray(text,src); //--- вывод исходных данных PrintFormat("Initial data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src)); //--- шифрование массива src[] методом DES с 56-битным ключом key[] int res=CryptEncode(CRYPT_DES,src,key,dst); //--- проверка результата шифрования if(res>0) { //--- вывод шифрованных данных PrintFormat("Encoded data: size=%d %s",res,ArrayToHex(dst)); //--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[] res=CryptDecode(CRYPT_DES,dst,key,src); //--- проверка результата if(res>0) { //--- вывод дешифрованных данных PrintFormat("Decoded data: size=%d, string='%s'",ArraySize(src),CharArrayToString(src)); } else Print("Ошибка в CryptDecode. Код ошибки=",GetLastError()); } else Print("Ошибка в CryptEncode. Код ошибки=",GetLastError()); }
CryptDecode
Производит обратное преобразование данных массива, полученного при помощи функции CryptEncode().
int CryptDecode( ENUM_CRYPT_METHOD method, // метод преобразования const uchar& data[], // массив-источник const uchar& key[], // ключ шифрования uchar& result[] // массив-приемник );
Параметры
method — [in] Метод преобразования. Может быть одним из значений перечисления ENUM_CRYPT_METHOD.
data[] — [in] Массив-источник.
key[] — [in] Ключ шифрования.
result[] — [out] Массив-приемник.
Возвращаемое значение
Количество байт в массиве-приемнике или 0 в случае ошибки. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
DebugBreak
Программная точка останова при отладке.
void DebugBreak();
Возвращаемое значение
Нет возвращаемого значения.
Примечание
Прерывание выполнения mql5-программы происходит только в том случае, если программа запущена в режиме отладки. Функцию можно использовать для просмотра значений переменных и/или дальнейшего пошагового выполнения.
ExpertRemove
Прекращает работу эксперта и выгружает его с графика.
void ExpertRemove();
Возвращаемое значение
Нет возвращаемого значения.
Примечание
Остановка эксперта не происходит немедленно при вызове функции ExpertRemove(), производится лишь взвод флага для прекращения работы эксперта. Т.е., любое следующее событие эксперт обрабатывать уже не будет, произойдет вызов OnDeinit() и выгрузка с удалением с графика.
Пример:
//+------------------------------------------------------------------+ //| Test_ExpertRemove.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql.su | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql.su" #property version "1.00" input int ticks_to_close=20;// количество тиков до снятия эксперта //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Print(TimeCurrent(),": " ,__FUNCTION__," reason code = ",reason); //--- "clear" comment Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static int tick_counter=0; tick_counter++; Comment("\nДо выгрузки эксперта ",__FILE__," осталось ", (ticks_to_close-tick_counter)," тиков "); //--- до if(tick_counter>=ticks_to_close) { ExpertRemove(); Print(TimeCurrent(),": ",__FUNCTION__," эксперт будет выгружен"); } Print("tick_counter = ",tick_counter); }
GetTickCount
Функция GetTickCount() возвращает количество миллисекунд, прошедших с момента старта системы.
uint GetTickCount();
Возвращаемое значение
Значение типа uint.
Примечание
Счетчик ограничен разрешающей способностью системного таймера. Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера.
Пример:
#define MAX_SIZE 40 //+------------------------------------------------------------------+ //| скрипт для замера времени вычисления 40 чисел Фибоначчи | //+------------------------------------------------------------------+ void OnStart() { //--- запомним начальное значение uint start=GetTickCount(); //--- переменная для получения очередного числа из ряда Фибоначчи long fib=0; //--- цикл, в котором вычисляем заданное количество чисел из ряда Фибоначчи for(int i=0;i<MAX_SIZE;i++) fib=TestFibo(i); //--- получим затраченное время в миллисекундах uint time=GetTickCount()-start; //--- выведем в журнал "Эксперты" сообщение PrintFormat("Вычисление %d первых чисел Фибоначчи заняло %d ms",MAX_SIZE,time); //--- работа скрипта завершена return; } //+------------------------------------------------------------------+ //| Функция получения числа Фибоначчи по его порядковому номеру | //+------------------------------------------------------------------+ long TestFibo(long n) { //--- первый член ряда Фибоначчи if(n<2) return(1); //--- все последующие члены вычисляются по этой формуле return(TestFibo(n-2)+TestFibo(n-1)); }
GetMicrosecondCount
Функция GetMicrosecondCount() возвращает количество микросекунд, прошедших с момента начала работы MQL5-программы.
ulong GetMicrosecondCount();
Возвращаемое значение
Значение типа ulong.
Пример:
//+------------------------------------------------------------------+ //| Тестируемый код | //+------------------------------------------------------------------+ void Test() { int res_int=0; double res_double=0; for(int i=0;i<10000;i++) { res_int+=i*i; res_int++; res_double+=i*i; res_double++; } } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { uint ui=0,ui_max=0,ui_min=INT_MAX; ulong ul=0,ul_max=0,ul_min=INT_MAX; //--- количество тестов for(int count=0;count<1000;count++) { uint ui_res=0; ulong ul_res=0; //--- for(int n=0;n<2;n++) { //--- выбираем способ измерения if(n==0) ui=GetTickCount(); else ul=GetMicrosecondCount(); //--- тестируемый код Test(); //--- копим результат измерения (в зависимости от способа) if(n==0) ui_res+=GetTickCount()-ui; else ul_res+=GetMicrosecondCount()-ul; } //--- собираем минимальное и максимальное время исполнения кода обоих измерений if(ui_min>ui_res) ui_min=ui_res; if(ui_max<ui_res) ui_max=ui_res; if(ul_min>ul_res) ul_min=ul_res; if(ul_max<ul_res) ul_max=ul_res; } Print("GetTickCount error(msec): ",ui_max-ui_min); Print("GetMicrosecondCount error(msec): ",DoubleToString((ul_max-ul_min)/1000.0,2)); }
MessageBox
Создает и отображает окно сообщений, а также управляет им. Окно сообщений содержит сообщение и заголовок, любую комбинацию предопределенных значков и командных кнопок.
int MessageBox( string text, // текст сообщения string caption=NULL, // заголовок окна int flags=0 // определяет набор кнопок в окне );
Параметры
text — [in] Текст, содержащий сообщение для отображения.
caption=NULL — [in] Необязательный текст для отображения в заголовке окна сообщения. Если этот параметр пустой, в заголовке окна будет отображено название эксперта.
flags=0 — [in] Необязательные флаги, определяющие вид и поведение диалогового окна. Флаги могут быть комбинацией специальной группы флагов .
Возвращаемое значение
Если функция успешно выполняется, возвращаемое значение — одно из значений кодов возврата MessageBox().
Примечание
Функцию не рекомендуется использовать в пользовательских индикаторах, так как вызов MessageBox() приостанавливает работу потока исполнения индикатора на всё время ожидания ответа пользователя. А так как все индикаторы по каждому символу выполняются в едином потоке, то будут остановлены все графики на всех таймфреймах по данному символу.
При работе в тестере стратегий функция MessageBox() не выполняется.
PeriodSeconds
Возвращает количество секунд в периоде.
int PeriodSeconds( ENUM_TIMEFRAMES period=PERIOD_CURRENT // период графика );
Параметры
period=PERIOD_CURRENT — [in] Значение периода графика из перечисления ENUM_TIMEFRAMES. Если параметр не указан, то возвращается количество секунд текущего периода графика, на котором запущена программа.
Возвращаемое значение
Количество секунд в указанном периоде.
PlaySound
Воспроизводит звуковой файл.
bool PlaySound( string filename // имя файла );
Параметры
filename — [in] Путь к звуковому файлу. Если filename=NULL, воспроизведение звука прекращается.
Возвращаемое значение
true – если звуковой файл найден, иначе возвращает false.
Примечание
Файл должен быть расположен в каталоге каталог_терминала\Sounds или его подкаталоге. Проигрываются только звуковые файлы в формате WAV.
Вызов PlaySound() с параметром NULL останавливает воспроизведение звука.
При работе в тестере стратегий функция PlaySound() не выполняется.
Печатает некоторое сообщение в журнал экспертов. Параметры могут иметь любой тип.
void Print( argument, // первое значение ... // последующие значения );
Параметры
… — [in] Любые значения, разделенные запятыми. Количество параметров не может превышать 64.
Примечание
Массивы нельзя передавать в функцию Print(). Массивы должны печататься поэлементно.
Данные типа double выводятся с точностью до 16 десятичных цифр после точки, при этом данные могут выводиться либо в традиционном либо в научном формате – в зависимости от того, как запись будет наиболее компактна. Данные типа float выводятся с 5 десятичными цифрами после точки. Для вывода вещественных чисел с другой точностью либо в явно указанном формате необходимо использовать функцию PrintFormat().
Данные типа bool выводятся в виде строк «true» или «false«. Даты выводятся в виде YYYY.MM.DD HH:MI:SS. Для вывода даты в другом формате необходимо использовать функцию TimeToString(). Данные типа color выводятся либо в виде строки R,G,B, либо в виде названия цвета, если этот цвет присутствует в наборе цветов.
При работе в тестере стратегий в режиме оптимизации функция Print() не выполняется.
Пример:
void OnStart() { //--- выведем DBL_MAX с помощью Print(), это равносильно PrintFormat(%%.16G,DBL_MAX) Print("---- как выглядит DBL_MAX -----"); Print("Print(DBL_MAX)=",DBL_MAX); //--- теперь выведем число DBL_MAX с помощью PrintFormat() PrintFormat("PrintFormat(%%.16G,DBL_MAX)=%.16G",DBL_MAX); //--- Вывод в журнал "Эксперты" // Print(DBL_MAX)=1.797693134862316e+308 // PrintFormat(%.16G,DBL_MAX)=1.797693134862316E+308 //--- посмотрим как выводится тип float float c=(float)M_PI; // нужно явно приводить к целевому типу Print("c=",c, " Pi=",M_PI, " (float)M_PI=",(float)M_PI); // c=3.14159 Pi=3.141592653589793 (float)M_PI=3.14159 //--- покажем, что может произойти при арифметических операциях над вещественными типами double a=7,b=200; Print("---- перед арифметическими операциями"); Print("a=",a," b=",b); Print("Print(DoubleToString(b,16))=",DoubleToString(b,16)); //--- разделим a на b (7/200) a=a/b; //--- теперь как будто восстановим значение в переменной b b=7.0/a; // ожидается, что b=7.0/(7.0/200.0)=>7.0/7.0*200.0=200 - но это не так //--- выведем вновь вычисленное значение b Print("----- после арифметических операций"); Print("Print(b)=",b); Print("Print(DoubleToString(b,16))=",DoubleToString(b,16)); //--- вывод в журнал "Эксперты" // Print(b)=200.0 // Print(DoubleToString(b,16))=199.9999999999999716 (видим, что на самом деле b уже не равно 200.0) //--- создадим очень маленькое значение epsilon=1E-013 double epsilon=1e-13; Print("---- создадим очень маленькое число"); Print("epsilon=",epsilon); // получим epsilon=1E-013 //--- теперь вычтем эпсилон из числа b и выведем снова значение в журнал "Эксперты" b=b-epsilon; //--- выводим двумя способами Print("---- после вычитания epsilon из переменной b"); Print("Print(b)=",b); Print("Print(DoubleToString(b,16))=",DoubleToString(b,16)); //--- вывод в журнал "Эксперты" // Print(b)=199.9999999999999 (теперь значение b после вычитания эпсилон не может округлиться до 200) // Print(DoubleToString(b,16))=199.9999999999998578 // (теперь значение b после вычитания эпсилон не может округлиться до 200) }
PrintFormat
Форматирует и печатает наборы символов и значений в журнал экспертов в соответствии с заданным форматом.
void PrintFormat( string format_string, // форматная строка ... // значения простых типов );
Параметры
format_string — [in] Строка формата состоит из обычных символов и, если за строкой формата следуют аргументы, еще и спецификации формата.
…
[in] Любые значения простых типов, разделенные запятыми. Общее количество параметров не может превышать 64, включая форматную строку.
Возвращаемое значение
Строка.
Примечание
При работе в тестере стратегий в режиме оптимизации функция PrintFormat() не выполняется.
Количество, порядок и тип параметров должны точно соответствовать составу спецификаторов, в противном случае результат печати неопределён. Вместо функции PrintFormat() можно использовать функцию printf().
Если за строкой формата следуют еще параметры, то эта строка должна содержать спецификации формата, определяющие формат вывода этих параметров. Спецификация формата всегда начинается с символа знака процента (%).
Строка формата читается слева направо. Когда встречается первая спецификация формата (если она есть), то значение первого параметра после строки формата преобразовывается и выводится согласно заданной спецификации. Вторая спецификация формата вызывает преобразование и вывод второго параметра и так далее, до конца строки формата.
Спецификация формата имеет следующую форму:
%[flags][width][.precision][{h | l | ll | I32 | I64}]type
Каждое поле форматной спецификации является либо простым символом, либо числом, обозначающим обычную форматную опцию. Простейшая спецификация формата содержит только знак процента (%) и символ, определяющий тип выводимого параметра (например %s). Если требуется в форматной строке вывести символ знак процента, то необходимо использовать форматную спецификацию %%.
flags
Флаг |
Описание |
Поведение по умолчанию |
– (минус) |
Выравнивание по левому краю в пределах заданной ширины |
Выравнивание по правому краю |
+ (плюс) |
Вывод знака + или — для значений знаковых типов |
Знак выводится только если значение отрицательное |
0 (ноль) |
Перед выводимом значением добавляются нули в пределах заданной ширины. Если указан флаг 0 с целочисленным форматом (i, u, x, X, o, d) и задана спецификация точности (например, %04.d), то 0 игнорируется. |
Ничего не вставляется |
пробел |
Перед выводимым значением ставится пробел, если значение является знаковым и положительным |
Пробелы не вставляются |
# |
Если используется совместно с форматом o, x или X, то перед выводимым значением добавляется 0, 0x или 0X соответственно. |
Ничего не вставляется |
Если используется совместно с форматом e, E, a или A, то значение всегда выводится с десятичной точкой. |
Десятичная точка выводится только если есть ненулевая дробная часть. |
|
Если используется совместно с форматом g или G, флаг определяет наличие десятичной точки в выводимом значении и препятствует отсечению ведущих нулей. Флаг # игнорируется при совместном использовании с форматами c, d, i, u, s. |
Десятичная точка выводится только если есть ненулевая дробная часть. Ведущие нули отсекаются |
width
Неотрицательное десятичное число, которое задает минимальное число выводимых символов отформатированного значения. Если количество выводимых символов меньше указанной ширины, то добавляется соответствующее количество пробелов слева или справа в зависимости от выравнивания (флаг –). При наличии флага ноль (0), перед выводимым значением добавляется соответствующее количество нулей. Если число выводимых символов больше заданной ширины, то выводимое значение никогда не усекается.
Если в качестве ширины указана звездочка (*), то в списке передаваемых параметров на соответствующем месте должно быть значение типа int, которое будет использовано для указания ширины выводимого значения.
precision
Неотрицательное десятичное число, которое определяет точность вывода – количество цифр после десятичной точки. В отличие от спецификации ширины, спецификация точности может отсекать часть дробного значения с округлением или без округления.
Для разных форматных типов (type) спецификация точности применяется по-разному.
Типы |
Описание |
Поведение по умолчанию |
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, or X |
uint |
l (маленькая L) |
o, u, x, or X |
long |
ll (две маленькие 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 |
type
Спецификатор типа является единственным обязательным полем для форматированного вывода.
Символ |
Тип |
Выводной формат |
c |
int |
Символ типа short (Unicode) |
C |
int |
Символ типа char (ANSI) |
d |
int |
Знаковое десятичное целое |
i |
int |
Знаковое десятичное целое |
o |
int |
Беззнаковое восьмеричное целое |
u |
int |
Беззнаковое десятичное целое |
x |
int |
Беззнаковое шестнадцатиричное целое с использованием «abcdef» |
X |
int |
Беззнаковое шестнадцатиричное целое с использованием «ABCDEF» |
e |
double |
Вещественное значение в формате [ – ]d.dddd e [sign]ddd, где d – одна десятичная цифра, dddd – одна или больше десятичных цифр, ddd – трехзначное число, определяющее размер экспоненты, sign – знак плюс или минус |
E |
double |
Идентично формату e, за исключением того, что знак экспоненты вывоится большой буквой (E вместо e) |
f |
double |
Вещественное значение в формате [ – ]dddd.dddd, где dddd – одна или больше десятичных цифр. Количество выводимых знаков перед десятичной точкой зависит от величины значения числа. Количество знаков после десятичной точки зависит от требуемой точности. |
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 |
Вывод строки |
Вместо функции PrintFormat() можно использовать функцию printf().
Пример:
void OnStart() { //--- имя торгового сервера string server=AccountInfoString(ACCOUNT_SERVER); //--- номер торговго счета int login=(int)AccountInfoInteger(ACCOUNT_LOGIN); //--- вывод значения long long leverage=AccountInfoInteger(ACCOUNT_LEVERAGE); PrintFormat("%s %d: плечо = 1:%I64d", server,login,leverage); //--- валюта депозита string currency=AccountInfoString(ACCOUNT_CURRENCY); //--- вывод значения double с 2 цифрами после десятичной точки double equity=AccountInfoDouble(ACCOUNT_EQUITY); PrintFormat("%s %d: размер собственных средств на счете = %.2f %s", server,login,equity,currency); //--- вывод значения double с обязательным выводом знака +/- double profit=AccountInfoDouble(ACCOUNT_PROFIT); PrintFormat("%s %d: текущий результат по открытым позициям = %+.2f %s", server,login,profit,currency); //--- вывод значения double с переменным количеством цифр после десятичной точки double point_value=SymbolInfoDouble(_Symbol,SYMBOL_POINT); string format_string=StringFormat("%%s: значение одного пункта = %%.%df",_Digits); PrintFormat(format_string,_Symbol,point_value); //--- вывод значения int int spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); PrintFormat("%s: текущий спред в пунктах = %d ", _Symbol,spread); //--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр PrintFormat("DBL_MAX = %.17e",DBL_MAX); //--- вывод значения double в научном формате с плавающей запятой и точностью 17 значащих цифр PrintFormat("EMPTY_VALUE = %.17e",EMPTY_VALUE); //--- вывод через PrintFormat() с точностью по умолчанию PrintFormat("PrintFormat(EMPTY_VALUE) = %e",EMPTY_VALUE); //--- простой вывод через Print() Print("Print(EMPTY_VALUE) = ",EMPTY_VALUE); /* результат выполнения MetaQuotes-Demo 1889998: плечо = 1:100 MetaQuotes-Demo 1889998: размер собственных средств на счете = 22139.86 USD MetaQuotes-Demo 1889998: текущий результат по открытым позициям = +174.00 USD EURUSD: значение одного пункта = 0.00001 EURUSD: текущий спред в пунктах = 12 DBL_MAX = 1.79769313486231570e+308 EMPTY_VALUE = 1.79769313486231570e+308 PrintFormat(EMPTY_VALUE) = 1.797693e+308 Print(EMPTY_VALUE) = 1.797693134862316e+308 */ }
ResetLastError
Устанавливает значение предопределенной переменной _LastError в ноль.
void ResetLastError();
Возвращаемое значение
Нет возвращаемого значения.
Примечание
Необходимо отметить, что функция GetLastError() не обнуляет переменную _LastError. Обычно вызов функции ResetLastError() производится перед вызовом функции, после которой проверяется возникновение ошибки.
ResourceCreate
Создает ресурс изображения на основе набора данных. Существует два варианта функции:
Создание ресурса на основе файла
bool ResourceCreate( const string resource_name, // имя ресурса const string path // относительный путь к файлу );
Динамическое создание ресурса на основе массива пикселей
bool ResourceCreate( const string resource_name, // имя ресурса const uint& data[], // набор данных в виде массива uint img_width, // ширина создаваемой картинки-ресурса uint img_height, // высота создаваемой картинки-ресурса uint data_xoffset, // смещение левого верхнего угла создаваемой картинки по горизонтали вправо uint data_yoffset, // смещение левого верхнего угла создаваемой картинки по вертикали вниз uint data_width, // общая ширина изображения на основе набора данных ENUM_COLOR_FORMAT color_format // способ обработки цвета );
Параметры
resource_name — [in] Имя ресурса.
path — [in] Относительный путь к файлу, содержащему данные для ресурса. Если путь начинается с обратной косой черты «\» (пишется «\\»), то файл ищется относительно папки каталог_данных_терминала\MQL5\. Если обратной косой черты нет, то ресурс ищется относительно расположения EX5-файла, из которого вызывается функция.
data[][] — [in] Одномерный или двумерный массив для создания полного изображения.
img_width — [in] Ширина прямоугольной области изображения в пикселях для помещения в ресурс в виде картинки. Не может быть больше значения data_width.
img_height — [in] Высота прямоугольной области изображения в пикселях для помещения в ресурс в виде картинки.
data_xoffset — [in] Смещение в пикселях прямоугольной области изображения по горизонтали вправо.
data_yoffset — [in] Смещение в пикселях прямоугольной области изображения по вертикали вниз.
data_width — [in] Требуется только для одномерных массивов и означает полную ширину создаваемого изображения из набора данных. Если data_width=0, то подразумевается равным img_width. Для двумерных массивов данный параметр игнорируется и принимается равным второй размерности массива data[].
color_format — [in] Способ обработки цвета из перечисления ENUM_COLOR_FORMAT.
Возвращаемое значение
true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Возможные ошибки:
- 4015 – ERR_RESOURCE_NAME_DUPLICATED (совпадение имен динамического и статического ресурсов),
- 4016 – ERR_RESOURCE_NOT_FOUND (ресурс не найден),
- 4017 – ERR_RESOURCE_UNSUPPORTED_TYPE (тип ресурса не поддерживается),
- 4018 – ERR_RESOURCE_NAME_IS_TOO_LONG (слишком длинное имя ресурса).
Примечание
Если второй вариант функции вызывается для создания одного и того же ресурса с разными параметрами ширины, высоты и сдвига, то новый ресурс не пересоздается, а просто обновляется существующий.
Первый вариант функции позволяет загружать из файлов картинки и звуки, второй вариант предназначен только для динамического создания изображений.
Картинки должны быть в формате BMP с глубиной цвета 24 или 32 бита, звуки могут быть только в формате WAV. Размер ресурса не должен превышать 16 Mb.
Идентификатор |
Описание |
COLOR_FORMAT_XRGB_NOALPHA |
Компонента альфа-канала игнорируется |
COLOR_FORMAT_ARGB_RAW |
Компоненты цвета не обрабатываются терминалом (должны быть корректно заданы пользователем) |
COLOR_FORMAT_ARGB_NORMALIZE |
Компоненты цвета обрабатываются терминалом |
ResourceFree
Удаляет динамически созданный ресурс (освобождает занятую ресурсом память).
bool ResourceFree( const string resource_name // имя ресурса );
Параметры
resource_name — [in] Имя ресурса, должно начинаться с «::».
Возвращаемое значение
true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Примечание
Функция ResourceFree() позволяет разработчику mql5-программы управлять потреблением памяти при активной работе с ресурсами. Графические объекты, привязанные к удаляемому из памяти ресурсу, будут отображаться правильно и после его удаления. Но вновь созданные графические объекты (OBJ_BITMAP и OBJ_BITMAP_LABEL) уже не смогут использовать удалённый ресурс.
Функция удаляет только динамические ресурсы, созданные данной программой.
ResourceReadImage
Читает данные графического ресурса, созданного функцией ResourceCreate() или сохраненного в EX5-файле при компиляции.
bool ResourceReadImage( const string resource_name, // имя графического ресурса для чтения uint& data[], // массив для получения данных из ресурса uint& width, // для получения ширины картинки в ресурсе uint& height, // для получения высоты картинки в ресурсе );
Параметры
resource_name — [in] Имя графического ресурса, содержащего изображение. Для доступа к собственным ресурсам указывается в коротком виде «::resourcename». Если же необходимо загрузить ресурс из скомпилированного EX5-файла, то необходимо имя в полном виде с указанием пути относительно папки MQL5, имени файла и имени ресурса – «path\\filename.ex5::resourcename».
data[][] — [in] Одномерный или двумерный массив для получения данных из графического ресурса.
img_width — [out] Ширина картинки графического ресурса в пикселях.
img_height — [out] Высота картинки графического ресурса в пикселях.
Возвращаемое значение
true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Примечание
Если на основании массива data[] в дальнейшем необходимо создать графический ресурс, то следует использовать формат цвета COLOR_FORMAT_ARGB_NORMALIZE или COLOR_FORMAT_XRGB_NOALPHA.
Если массив data[] является двумерным и его вторая размерность меньше размера X(width) графического ресурса, то функция ResourceReadImage() вернет false и чтение не будет произведено. Но при этом, если ресурс существует, то в параметры width и height возвращаются актуальные размеры картинки. Это позволит сделать еще одну попытку получения данных из ресурса.
ResourceSave
Сохраняет ресурс в указанный файл.
bool ResourceSave( const string resource_name // имя ресурса const string file_name // имя файла );
Параметры
resource_name — [in] Имя ресурса, должно начинаться с «::».
file_name — [in] Имя файла относительно MQL5\Files.
Возвращаемое значение
true – в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Примечание
Функция всегда перезаписывает файл и создаёт при необходимости все промежуточные подкаталоги в имени файла в случае их отсутствия.
SetUserError
Устанавливает предопределенную переменную _LastError в значение, равное ERR_USER_ERROR_FIRST + user_error
void SetUserError( ushort user_error, // номер ошибки );
Параметры
user_error — [in] Номер ошибки, устанавливаемый пользователем.
Возвращаемое значение
Нет возвращаемого значения.
Примечание
После того, как была выставлена ошибка при помощи функции SetUserError(user_error), функция GetLastError() вернет значение, равное ERR_USER_ERROR_FIRST + user_error.
Пример:
void OnStart() { //--- установим номер ошибки 65537=(ERR_USER_ERROR_FIRST +1) SetUserError(1); //--- получим код последней ошибки Print("GetLastError = ",GetLastError()); /* Результат GetLastError = 65537 */ }
SendFTP
Посылает файл по адресу, указанному в окне настроек на закладке «FTP».
bool SendFTP( string filename, // файл для отсылки по ftp string ftp_path=NULL // путь для выгрузки на ftp-сервере );
Параметры
filename — [in] Имя отсылаемого файла.
ftp_path=NULL — [in] Каталог FTP. Если каталог не указан, то используется каталог, описанный в настройках.
Возвращаемое значение
В случае неудачи возвращает false.
Примечание
Отсылаемый файл должен находиться в папке каталог_терминала\MQL5\files или ее подпапках. Отсылка не производится, если в настройках не указан адрес FTP и/или пароль доступа.
При работе в тестере стратегий функция SendFTP() не выполняется.
SendMail
Посылает электронное письмо по адресу, указанному в окне настроек на закладке «Почта».
bool SendMail( string subject, // заголовок string some_text // текст письма );
Параметры
subject — [in] Заголовок письма.
some_text — [in] Тело письма.
Возвращаемое значение
true – если письмо поставлено в очередь на отсылку, иначе возвращает false.
Примечание
Отсылка может быть запрещена в настройках, также может быть не указан адрес электронной почты. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
При работе в тестере стратегий функция SendMail() не выполняется.
SendNotification
Посылает уведомление на мобильные терминалы, чьи MetaQuotes ID указаны в окне настроек на закладке «Уведомления».
bool SendNotification( string text // текст сообщения );
Параметры
text — [in] Текст сообщения в уведомлении. Длина сообщения должна быть не более 255 символов.
Возвращаемое значение
true при успешной отправке уведомления из терминала, в случае неудачи возвращает false. При проверке после неудачной отправки уведомления GetLastError() может выдать одну из следующих ошибок:
4515 – ERR_NOTIFICATION_SEND_FAILED,
4516 – ERR_NOTIFICATION_WRONG_PARAMETER,
4517 – ERR_NOTIFICATION_WRONG_SETTINGS,
4518 – ERR_NOTIFICATION_TOO_FREQUENT.
Примечание
Для функции SendNotification() установлены жесткие ограничения по использованию: не более 2-х вызовов в секунду и не более 10 вызовов в минуту. Контроль за частотой использования осуществляется динамически, и функция может быть заблокирована при нарушении.
При работе в тестере стратегий функция SendNotification() не выполняется.
Sleep
Функция задерживает выполнение текущего эксперта или скрипта на определенный интервал.
void Sleep( int milliseconds // интервал );
Параметры
milliseconds — [in] Интервал задержки в миллисекундах.
Возвращаемое значение
Нет возвращаемого значения.
Примечание
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
TerminalClose
Посылает терминалу команду на завершение работы.
bool TerminalClose( int ret_code // код завершения клиентского терминала );
Параметры
ret_code — [in] Код возврата, возвращаемый процессом клиентского терминала при завершении работы.
Возвращаемое значение
Возвращает true в случае успеха, иначе false.
Примечание
Функция TerminalClose() не производит немедленной остановки работы терминала, она просто посылает терминалу команду на завершение.
В коде советника, вызвавшего TerminalClose(), должны быть сделаны все приготовления для немедленного завершения работы (например, должны быть штатным образом закрыты все ранее открытые файлы). Сразу после вызова этой функции должен идти оператор return.
Параметр ret_code позволяет указывать нужный код возврата для анализа причин программного прекращения работы терминала при его запуске из командной строки.
Пример:
//--- input parameters input int tiks_before=500; // количество тиков до завершения input int pips_to_go=15; // расстояние в пипсах input int seconds_st=50; // сколько секунд даем эксперту //--- globals datetime launch_time; int tick_counter=0; //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Print(__FUNCTION__," reason code = ",reason); Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static double first_bid=0.0; MqlTick tick; double distance; SymbolInfoTick(_Symbol,tick); tick_counter++; if(first_bid==0.0) { launch_time=tick.time; first_bid=tick.bid; Print("first_bid =",first_bid); return; } //--- ход цены в пунктах distance=(tick.bid-first_bid)/_Point; //--- выведем сообщение, чтобы отслеживать работу советника string comm="С момента запуска:\r\n\x25CF прошло секунд: "+ IntegerToString(tick.time-launch_time)+" ;"+ "\r\n\x25CF поступило тиков: "+(string)tick_counter+" ;"+ "\r\n\x25CF цена прошла в пунктах: "+StringFormat("%G",distance); Comment(comm); //--- секция проверки условий для закрытия терминала if(tick_counter>=tiks_before) TerminalClose(0); // выход по счетчику тиков if(distance>pips_to_go) TerminalClose(1); // прошли вверх на pips_to_go пипсов if(distance<-pips_to_go) TerminalClose(-1); // прошли вниз на pips_to_go пипсов if(tick.time-launch_time>seconds_st) TerminalClose(100); // завершение работы по таймауту }
TesterStatistics
Возвращает значение указанного статистического показателя, рассчитанного по результатам тестирования
double TesterStatistics( ENUM_STATISTICS statistic_id // идентификатор );
Параметры
statistic_id — [in] Идентификатор статистического показателя из перечисления ENUM_STATISTICS.
Возвращаемое значение
Значение статистического показателя из результатов тестирования.
Примечание
Функция может быть вызвана внутри OnTester() или OnDeinit() в тестере. В других случаях результат неопределён.
TesterWithdrawal
Специальная функция для эмуляции операций снятия средств в процессе тестирования. Может быть использована в некоторых системах управления капиталом.
bool TesterWithdrawal( double money // размер снимаемой суммы );
Параметры
money — [in] Размер денежных средств, которые необходимо снять со счета (в валюте депозита).
Возвращаемое значение
Возвращает true в случае успеха, иначе false.
TranslateKey
Возвращает Unicode-символ по виртуальному коду клавиши, учитывая текущий язык ввода и состояние управляющих клавиш.
short TranslateKey( int key_code // код клавиши для получения Unicode-символа );
Параметры
key_code — [in] Код клавиши.
Возвращаемое значение
Юникодный символ в случае успешного преобразования. В случае ошибки функция вернёт -1.
Примечание
Функция использует ToUnicodeEx для преобразования нажатых пользователем клавиш в Unicode-символы. Ошибка может возникнуть в том случае, если не сработает ToUnicodeEx – например, при попытке получить символ для клавиши SHIFT.
Пример:
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam) { if(id==CHARTEVENT_KEYDOWN) { short sym=TranslateKey((int)lparam); //--- если введённый символ успешно преобразован в Юникод if(sym>0) Print(sym,"'",ShortToString(sym),"'"); else Print("Error in TranslateKey for key=",lparam); } }
WebRequest
Отправляет HTTP-запрос на указанный сервер. Существует два варианта функции:
1. Для отправки простых запросов вида «ключ=значение» с использованием заголовка Content-Type: application/x-www-form-urlencoded.
int WebRequest( const string method, // метод HTTP const string url, // url-адрес const string cookie, // cookie const string referer, // referer int timeout, // таймаут const char &data[], // массив тела HTTP-сообщения int data_size, // размер массива data[] в байтах char &result[], // массив с данными ответа сервера string &result_headers // заголовки ответа сервера );
2. Для отправки запросов произвольного типа с указанием собственного набора заголовков для более гибкого взаимодействия с различными Web-сервисами.
int WebRequest( const string method, // метод HTTP const string url, // url-адрес const string headers, // заголовки int timeout, // таймаут const char &data[], // массив тела HTTP-сообщения char &result[], // массив с данными ответа сервера string &result_headers // заголовки ответа сервера );
Параметры
method — [in] Метод HTTP.
url — [in] URL-адрес.
headers — [in] Заголовки запроса вида «ключ: значение», разделенные переносом строки «\r\n».
cookie — [in] Значение Cookie.
referer — [in] Значение заголовка Referer HTTP-запроса.
timeout — [in] Таймаут в миллисекундах.
data[] — [in] Массив данных тела HTTP-сообщения.
data_size — [in] Размер массива data[].
result[] — [out] Массив с данными ответа сервера.
result_headers — [out] Заголовки ответа сервера.
Возвращаемое значение
Код ответа HTTP-сервера либо -1 в случае ошибки.
Примечание
Для использования функции WebRequest() следует добавить адреса серверов в список разрешенных URL во вкладке «Советники» окна «Настройки». Порт сервера выбирается автоматически на основе указанного протокола — 80 для «http://» и 443 для «https://».
Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение программы и ждет ответа от запрашиваемого сервера. Так как задержки при получении ответа на отправленный запрос могут быть большими, то функция запрещена для вызовов из индикаторов, поскольку индикаторы работают в едином потоке, общем для всех индикаторов и графиков на данном символе. Задержка выполнения индикатора на одном из графиков символа может привести к остановке обновления всех графиков по данному символу.
Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора GetLastError() вернет ошибку 4014 – «Системная функция не разрешена для вызова«.
При работе в тестере стратегий функция WebRequest() не выполняется.
Пример использования 1-го варианта функции WebRequest():
void OnStart() { string cookie=NULL,headers; char post[],result[]; int res; //--- для работы с сервером необходимо добавить URL "https://www.google.com/finance" //--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"): string google_url="https://www.google.com/finance"; //--- обнуляем код последней ошибки ResetLastError(); //--- загрузка html-страницы с Google Finance int timeout=5000; //--- timeout менее 1000 (1 сек.) недостаточен при низкой скорости Интернета res=WebRequest("GET",google_url,cookie,NULL,timeout,post,0,result,headers); //--- проверка ошибок if(res==-1) { Print("Ошибка в WebRequest. Код ошибки =",GetLastError()); //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления MessageBox("Необходимо добавить адрес '"+google_url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION); } else { //--- успешная загрузка PrintFormat("Файл успешно загружен, Размер файла =%d байт.",ArraySize(result)); //--- сохраняем данные в файл int filehandle=FileOpen("GoogleFinance.htm",FILE_WRITE|FILE_BIN); //--- проверка ошибки if(filehandle!=INVALID_HANDLE) { //--- сохраняем содержимое массива result[] в файл FileWriteArray(filehandle,result,0,ArraySize(result)); //--- закрываем файл FileClose(filehandle); } else Print("Ошибка в FileOpen. Код ошибки =",GetLastError()); } }
Пример использования 2-го варианта функции WebRequest():
#property link "http://www.mql.su" #property version "1.00" #property strict #property script_show_inputs #property description "Пример скрипта, который публикует сообщение " #property description "пользователя в ленте на mql.su" input string InpLogin =""; //Ваш аккаунт в mql.su input string InpPassword=""; //Пароль для вашего аккаунта input string InpFileName="EURUSDM5.png"; //Картинка в папке MQL5/Files/ input string InpFileType="image/png"; //Правильный mime type картинки //+------------------------------------------------------------------+ //| Публикация сообщения с картинкой в ленте mql.su | //+------------------------------------------------------------------+ bool PostToNewsFeed(string login,string password,string text,string filename,string filetype) { int res; // для помещения результата выполнения операций char data[]; // массив с данными для отправки POST-запросов char file[]; // сюда прочитаем картинку string str="Login="+login+"&Password="+password; string auth,sep="-------Jyecslin9mp8RdKV"; // разделитель данных формата multipart //--- имеется файл - пробуем прочитать его if(filename!=NULL && filename!="") { res=FileOpen(filename,FILE_READ|FILE_BIN); if(res<0) { Print("Ошибка открытия файла \""+filename+"\""); return(false); } //--- читаем данные файла if(FileReadArray(res,file)!=FileSize(res)) { FileClose(res); Print("Ошибка чтения файла \""+filename+"\""); return(false); } FileClose(res); } //--- сформируем тело POST запроса на авторизацию ArrayResize(data,StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8)-1); //--- сбросим код ошибки ResetLastError(); //--- выполняем запрос на авторизацию res=WebRequest("POST","http://www.mql.su/ru/auth_login",NULL,0,data,data,str); //--- если авторизация не удалась if(res!=200) { Print("Ошибка авторизации #"+(string)res+", LastError="+(string)GetLastError()); return(false); } //--- вычитаем из заголовка ответа сервера cookie авторизации res=StringFind(str,"Set-Cookie: auth="); //--- если cookie не найден, сообщим об ошибке if(res<0) { Print("Ошибка, данные авторизации не найдены в ответе сервера (проверте логин/пароль)"); return(false); } //--- запомним авторизационные данные и сформируем заголовок для последующих запросов auth=StringSubstr(str,res+12); auth="Cookie: "+StringSubstr(auth,0,StringFind(auth,";")+1)+"\r\n"; //--- если имеется файл данных, отправляем его на сервер if(ArraySize(file)!=0) { //--- сформируем тело запроса str="--"+sep+"\r\n"; str+="Content-Disposition: form-data; name=\"attachedFile_imagesLoader\"; filename=\""+filename+"\"\r\n"; str+="Content-Type: "+filetype+"\r\n\r\n"; res =StringToCharArray(str,data); res+=ArrayCopy(data,file,res-1,0); res+=StringToCharArray("\r\n--"+sep+"--\r\n",data,res-1); ArrayResize(data,ArraySize(data)-1); //--- сформируем заголовок запроса str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n"; //--- сбросим код ошибки ResetLastError(); //--- выполняем запрос на передачу файла изображения на сервер res=WebRequest("POST","http://www.mql.su/upload_file",str,0,data,data,str); //--- проверим результат запроса if(res!=200) { Print("Ошибка передачи файла на сервер #"+(string)res+", LastError="+(string)GetLastError()); return(false); } //--- получим ссылку на картинку, которую загрузили на сервер str=CharArrayToString(data); if(StringFind(str,"{\"Url\":\"")==0) { res =StringFind(str,"\"",8); filename=StringSubstr(str,8,res-8); //--- при ошибке закачки файла, вернётся пустая ссылка if(filename=="") { Print("Передача файла на сервер не удалась"); return(false); } } } //--- сформируем тело запроса публикации сообщения на сервере str ="--"+sep+"\r\n"; str+="Content-Disposition: form-data; name=\"content\"\r\n\r\n"; str+=text+"\r\n"; //--- на каких языках сайта mql.su будет доступна публикация str+="--"+sep+"\r\n"; str+="Content-Disposition: form-data; name=\"AllLanguages\"\r\n\r\n"; str+="on\r\n"; //--- если картинка была загружена на сервер - передадим ссылку на неё if(ArraySize(file)!=0) { str+="--"+sep+"\r\n"; str+="Content-Disposition: form-data; name=\"attachedImage_0\"\r\n\r\n"; str+=filename+"\r\n"; } //--- завершающая строка multipart-запроса str+="--"+sep+"--\r\n"; //--- собираем тело POST-запроса в одну строку StringToCharArray(str,data,0,WHOLE_ARRAY,CP_UTF8); ArrayResize(data,ArraySize(data)-1); //--- подготовим заголовок запроса str=auth+"Content-Type: multipart/form-data; boundary="+sep+"\r\n"; //--- выполняем запрос на публикацию сообщение в ленте пользователя mql.su res=WebRequest("POST","http://www.mql.su/ru/users/"+login+"/wall",str,0,data,data,str); //--- в случае успешной публикации вернем true return(res==200); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- опубликуем пост на mql.su c картинкой, путь к которой возьмем из параметра InpFileName PostToNewsFeed(InpLogin,InpPassword,"Проверка расширенной версии функции WebRequest\r\n" "(Данное сообщение размещено скриптом WebRequest.mq5)",InpFileName,InpFileType); }
ZeroMemory
Функция обнуляет переменную, переданную ей по ссылке.
void ZeroMemory( void & variable // обнуляемая переменная );
Параметры
variable — [in] [out] Переменная, передаваемая по ссылке, которую требуется обнулить (инициализировать нулевыми значениями).
Возвращаемое значение
Нет возвращаемого значения.
Примечание
Если параметром функции является строка, то данный вызов будет эквивалентен указанию для нее значения NULL.
Для простых типов и их массивов, а также структур/классов, состоящих из таких типов, это простое обнуление.
Для объектов, содержащих строки и динамические массивы, производится вызов ZeroMemory() для каждого члена.
Для любых массивов, не защищенных модификатором const, производится обнуление всех элементов.
Для массивов сложных объектов происходит вызов ZeroMemory() для каждого элемента.
Функция ZeroMemory() не применима для классов с защищенными членами или наследованием.