System function is not allowed to call
Thank you very much, really appreciated. I was using this function because I want to use the same indicator with different parameters (variable parameters), but I don’t want to use IndicatorRelease if I’m using the same parameters.
Источник
CopyTicks & error 4014
To gather ticks infos, I use the code provided by mql5 with the strategy tester on EURUSD, M1, quality 100% :
And that’s simply the error I’m getting :
Anyone to help there ?
To gather ticks infos, I use the code provided by mql5 with the strategy tester on EURUSD, M1, quality 100% :
And that’s simply the error I’m getting :
Anyone to help there ?
What is the total number of variables ticks ?
What is the total number of variables ticks ?
Work with ticks in the Strategy Tester ? There is no missed ticks there so CopyTicks is useless. If you want to work with ticks the Strategy Tester is useless, it’s not real ticks but calculated ones.
The «alternative» is to work on live chart or eventually record the ticks yourself.
Work with ticks in the Strategy Tester ? There is no missed ticks there so CopyTicks is useless. If you want to work with ticks the Strategy Tester is useless, it’s not real ticks but calculated ones.
The «alternative» is to work on live chart or eventually record the ticks yourself.
why can’t we use copyTicks in the tester ?
i got an indicator that uses the copyTicks function of MT5 to display a line.
When used in Tester, the first few bars are completely off due to the inability to gather data previous to the current bar. If i make a simple MA, i need previous data to create the first value ! I need precise tick data to calculate my indi, i cannot do it without, with only OHLC
so what’s the solution to this ? i can only hide the first few bar computation in the tester because they are not right but that’s not a solution i’m totally comfortable with.
Источник
WebRequest MQL5: error 4014 even though I have maintained the Url in «tools / options»
I am following the instructions for WebRequest in the documentation of MQL5.
I am using the example implementation for testing, but I get the «error 4014».
According to my understanding, it means that you are not allowed to make the web request .
However, I have maintained the web address in tools / options, as it is indicated in the example.
Am I missing something? thanks for your help!!
Show your sample code. Show a screenshot of the options. Etc.
We cannot possibly know what is wrong from such little information you provide.
Hello, thanks for your responses.
In the meantime, I have seen (also from various other, similar questions, and also by reading the documentation attentively . )
that the web request is not working in » Strategy Tester » mode, but only in «live» mode.
I could also test my program, it works without error in live mode.
my next challenge is now to perform testing, because I have the impression I cannot «debug» in live mode .
I will prepare a sample data set and the debug in strategy tester, I think.
However, thanks for looking into this,
I also wanted to document the result here, in case some other green-horn as myself hast the same question.
Источник
Discussion of article «MetaTrader 5 and Python integration: receiving and sending data» — page 2
I’m running EA, localhost is enabled.
hmm.. I dont’t know. Python program must be running before.
hmm.. I dont’t know. Python program must be running before.
The issue is narrowed down.
SocketCreate is successful if EA is attached to chart.
SocketCreate ends with error 4014 if EA is executed in Strategy Tester .
The issue is narrowed down.
SocketCreate is successful if EA is attached to chart.
SocketCreate ends with error 4014 if EA is executed in Strategy Tester .
ahh, right. Sockets still not work in strategy tester, maybe later developers fix this
» Unfortunately, the current implementation of the socket client in MetaTrader 5 is not suitable for running in the Strategy Tester, so no full testing and measurement of the solution performance were performed. Let us wait for further updates of the socket functionality » from the bottom of the article
though very limited, but you can try following steps in a live chart:
1. Load your data from history or precomputed results from other indicators
2. Add a loop in the tick processing call, which simply loops over each item of your pre-loaded data.
3. Let your EA decide on each loop -> write your results (buy/sell/update SL, etc.) to a file for later performance analysis.
Hope that helps a bit.
I just wanted to say thank you for making this available. I always wanted to be able to code my indicators in Python and since you began this thread I’ve been able to access realtime futures data and use it to develop and run my indicators. I use my Python to plot and analyze the live feed and I place trades through the MT5 platform — it works great. Please keep up the good work and I truly hope Python will be full embraced my the MT community.
Thank you and best regards!
Thank You Maxim !
This article is really helpful.
I was wondering if the Python server is on an another PC ( Windows 10 ) on a local Network did you experiment some socket connection error ?
I ask you that question because on same local host all is fine fine. The connection is perfect . However if I want to have the server program on another PC then I get a socket connection error ( connot connect )
I did check with ping command the remote PC IP , all is fine.
I did add IP address in the Expert advisor URL section.
What could prevent the socket connection ( outside the Firewall ) ?
I did make the change in windows firewall ( however I’m not a create expert there ).
I was wondering if the MT5 socket works on a local network.
Thank you in advance for any suggestions because I’ m stuck
Источник
Adblock
detector
Все приказы на совершение торговых операций отправляются в виде структуры торгового запроса MqlTradeRequest с помощью функции OrderSend(). Результат выполнения этой функции помещается в структуру MqlTradeResult, поле retcode которой содержит код возврата торгового сервера.
10004 |
TRADE_RETCODE_REQUOTE |
Реквота |
10006 |
TRADE_RETCODE_REJECT |
Запрос отклонен |
10007 |
TRADE_RETCODE_CANCEL |
Запрос отменен трейдером |
10008 |
TRADE_RETCODE_PLACED |
Ордер размещен |
10009 |
TRADE_RETCODE_DONE |
Заявка выполнена |
10010 |
TRADE_RETCODE_DONE_PARTIAL |
Заявка выполнена частично |
10011 |
TRADE_RETCODE_ERROR |
Ошибка обработки запроса |
10012 |
TRADE_RETCODE_TIMEOUT |
Запрос отменен по истечению времени |
10013 |
TRADE_RETCODE_INVALID |
Неправильный запрос |
10014 |
TRADE_RETCODE_INVALID_VOLUME |
Неправильный объем в запросе |
10015 |
TRADE_RETCODE_INVALID_PRICE |
Неправильная цена в запросе |
10016 |
TRADE_RETCODE_INVALID_STOPS |
Неправильные стопы в запросе |
10017 |
TRADE_RETCODE_TRADE_DISABLED |
Торговля запрещена |
10018 |
TRADE_RETCODE_MARKET_CLOSED |
Рынок закрыт |
10019 |
TRADE_RETCODE_NO_MONEY |
Нет достаточных денежных средств для выполнения запроса |
10020 |
TRADE_RETCODE_PRICE_CHANGED |
Цены изменились |
10021 |
TRADE_RETCODE_PRICE_OFF |
Отсутствуют котировки для обработки запроса |
10022 |
TRADE_RETCODE_INVALID_EXPIRATION |
Неверная дата истечения ордера в запросе |
10023 |
TRADE_RETCODE_ORDER_CHANGED |
Состояние ордера изменилось |
10024 |
TRADE_RETCODE_TOO_MANY_REQUESTS |
Слишком частые запросы |
10025 |
TRADE_RETCODE_NO_CHANGES |
В запросе нет изменений |
10026 |
TRADE_RETCODE_SERVER_DISABLES_AT |
Автотрейдинг запрещен сервером |
10027 |
TRADE_RETCODE_CLIENT_DISABLES_AT |
Автотрейдинг запрещен клиентским терминалом |
10028 |
TRADE_RETCODE_LOCKED |
Запрос заблокирован для обработки |
10029 |
TRADE_RETCODE_FROZEN |
Ордер или позиция заморожены |
10030 |
TRADE_RETCODE_INVALID_FILL |
Указан неподдерживаемый тип исполнения ордера по остатку |
10031 |
TRADE_RETCODE_CONNECTION |
Нет соединения с торговым сервером |
10032 |
TRADE_RETCODE_ONLY_REAL |
Операция разрешена только для реальных счетов |
10033 |
TRADE_RETCODE_LIMIT_ORDERS |
Достигнут лимит на количество отложенных ордеров |
10034 |
TRADE_RETCODE_LIMIT_VOLUME |
Достигнут лимит на объем ордеров и позиций для данного символа |
10035 |
TRADE_RETCODE_INVALID_ORDER |
Неверный или запрещённый тип ордера |
10036 |
TRADE_RETCODE_POSITION_CLOSED |
Позиция с указанным POSITION_IDENTIFIER уже закрыта |
10038 |
TRADE_RETCODE_INVALID_CLOSE_VOLUME |
Закрываемый объем превышает текущий объем позиции |
10039 |
TRADE_RETCODE_CLOSE_ORDER_EXIST |
Для указанной позиции уже есть ордер на закрытие. Может возникнуть при работе в системе хеджинга:
|
10040 |
TRADE_RETCODE_LIMIT_POSITIONS |
Количество открытых позиций, которое можно одновременно иметь на счете, может быть ограничено настройками сервера. При достижении лимита в ответ на выставление ордера сервер вернет ошибку TRADE_RETCODE_LIMIT_POSITIONS. Ограничение работает по-разному в зависимости от типа учета позиций на счете:
|
10041 |
TRADE_RETCODE_REJECT_CANCEL |
Запрос на активацию отложенного ордера отклонен, а сам ордер отменен |
10042 |
TRADE_RETCODE_LONG_ONLY |
Запрос отклонен, так как на символе установлено правило «Разрешены только длинные позиции» (POSITION_TYPE_BUY) |
10043 |
TRADE_RETCODE_SHORT_ONLY |
Запрос отклонен, так как на символе установлено правило «Разрешены только короткие позиции» (POSITION_TYPE_SELL) |
10044 |
TRADE_RETCODE_CLOSE_ONLY |
Запрос отклонен, так как на символе установлено правило «Разрешено только закрывать существующие позиции« |
Предупреждения компилятора носят информационный характер и не являются сообщениями об ошибках.
21 |
Неполная запись даты в строке datetime |
22 |
Ошибочные числа в строке datetime для даты, требования: год 1970<=X<=3000 месяц 0<X<=12 день 0<X<= 31/30/28(29)…. |
23 |
Ошибочные числа в строке datetime для времени, требования: час 0<=X<24 минута 0<=X<60 |
24 |
Некорректный цвет в формате RGB: одна из компонент RGB меньше 0 или больше 255 |
25 |
Неизвестный символ эскейп последовательности. Известные: n r t \ » ’ X x |
26 |
Слишком большой объем локальных переменных (>512кб) функции, уменьшите их количество |
29 |
Перечисление уже определено (дублирование) – члены будут добавлены к первому определению |
30 |
Переопределение макроса |
31 |
Переменная объявлена, но нигде не используется |
32 |
Конструктор должен иметь тип void |
33 |
Деструктор должен иметь тип void |
34 |
Константа не вмещается в диапазон целых (X>_UI64_MAX || X<_I64_MIN) и будет преобразована в тип double |
35 |
Слишком длинный HEX больше 16 значащих символов (обрезаются старшие полубайты) |
36 |
Нет ни одного полубайта в HEX строке «0x» |
37 |
Нет ни одной функции — нечего будет выполнять |
38 |
Используется неинициализированная переменная |
41 |
Функция не имеет тела, но и не вызывается |
43 |
Возможны потери данных при преобразовании типа. Пример: int x=(double)z; |
44 |
Потеря точности(данных) при преобразовании константы. Пример: int x=M_PI |
45 |
Несовпадение знаков операндов в операциях сравнения. Пример: (char)c1>(uchar)c2 |
46 |
Проблемы с импортом функций – требуется объявление #import либо импорт функций уже закрыт |
47 |
Описание слишком большое – лишние символы не будут включены в исполняемый файл |
48 |
Количество индикаторных буферов объявлено меньше, чем требуется |
49 |
Не указан цвет для отрисовки графической серии в индикаторе |
50 |
Нет ни одной графической серии для отображения индикатора |
51 |
Не обнаружена функция-обработчик ‘OnStart» в скрипте |
52 |
Функция-обработчик ‘OnStart» определена с неверными параметрами |
53 |
Функция ‘OnStart’ может быть определена только в скрипте |
54 |
Функция ‘OnInit’ определена с неверными параметрами |
55 |
Функция ‘OnInit’ не используется в скриптах |
56 |
Функция ‘OnDeinit’ определена с неверными параметрами |
57 |
Функция ‘OnDeinit’ не используется в скриптах |
58 |
Определены две функции ‘OnCalculate’. Будет использована OnCalculate() на одном ценовом массиве |
59 |
Обнаружено переполнение при вычислении сложной целочисленной константы |
60 |
Возможно, переменная неинициализирована. |
61 |
Данное объявление делает недоступным обращение к локальной переменной, объявленной на указанной строке |
62 |
Данное объявление делает недоступным обращение к глобальной переменной, объявленной на указанной строке |
63 |
Не может быть использовано для статических массивов |
64 |
Данное объявление делает недоступным обращение к предопределенной переменной |
65 |
Значение выражения всегда true/false |
66 |
Использование переменной или выражения типа bool в математических операциях является небезопасным |
67 |
Результат применения оператора унарного минуса к беззнаковому типу ulong неопределен |
68 |
Версия, указанная в свойстве #property version, недопустима для размещения в разделе Маркет, правильный формат #property version «XXX.YYY» |
69 |
Отсутствует выражение для выполнения по условию |
70 |
Неверный возвращаемый тип функции или некорректные параметры при объявлении функции-обработчика события |
71 |
Требуется явное приведение структур к одному типу |
72 |
Данное объявление делает недоступным прямое обращение к члену класса, объявленному на указанной строке. Доступ будет возможен только с помощью операции разрешения контекста :: |
73 |
Константа в двоичной записи слишком велика, старшие разряды будут отброшены |
74 |
Параметр в методе наследуемого класса отличается модификатором const, дочерняя функция перегрузила функцию родителя |
75 |
Отрицательное или слишком большое значения смещения в битовой операции сдвига, результат выполнения неопределён |
76 |
Функция должна вернуть значение |
77 |
Функция типа void не должна возвращать значение |
78 |
Не все варианты выполнения возвращают значение |
79 |
Выражения на глобальном уровне не разрешены |
80 |
Возможна ошибка в последовательности выполнения операций, используйте скобки для явного указания порядка |
81 |
Найдено два вида вызова OnCalCulate(). Вызываться будет вариант с использованием таймсерий OHLC |
82 |
Структура не содержит членов, размер будет приравнен 1 байту |
83 |
Нет обработки результата выполнения функции |
84 |
Индикатор, включаемый как ресурс, скомпилирован в режиме отладки. Это снижает его производительность. Для повышения скорости работы его нужно перекомпилировать |
85 |
Слишком большой код символа в строке, должен быть в диапазоне от 0 до 65535 |
86 |
Нераспознанный служебный символ в строке |
87 |
Не указано свойство индикатора, задающее вывод в главное окно или в отдельное подокно. Будет применено свойство #property indicator_chart_window |
MetaEdtior 5, редактор mql5-программ, выдает сообщения об ошибках программы, обнаруженных встроенным компилятором на стадии компиляции. Список этих ошибок приведен ниже в таблице. Для компиляции исходного кода в исполняемый нажмите F7. Программы с ошибками не могут быть скомпилированы, пока ошибки, указанные компилятором, не будут устранены.
100 |
Ошибка чтения файла |
101 |
Ошибка открытия *.EX5 файла для записи |
103 |
Недостаточно свободной памяти для завершения компиляции |
104 |
Нераспознанная компилятором пустая синтаксическая единица |
105 |
Некорректное имя файла в #include |
106 |
Ошибка доступа к файлу в #include (возможно файл не существует) |
108 |
Неподходящее имя для #define |
109 |
Неизвестная команда препроцессора (допустимы #include,#define,#property,#import) |
110 |
Неизвестный для компилятора символ |
111 |
Функция не реализована (описание есть, тела нет) |
112 |
Пропущена двойная кавычка («) |
113 |
Пропущена открывающая угловая скобка (<) или двойная кавычка («) |
114 |
Пропущена одинарная кавычка (‘) |
115 |
Пропущена закрывающая угловая скобка «>» |
116 |
Не указан тип в объявлении |
117 |
Нет оператора возврата return или имеется не во всех ветках выполнения |
118 |
Ожидалась открывающая скобка параметров вызова |
119 |
Ошибка записи EX5 |
120 |
Некорректный доступ к элементу массива |
121 |
Функция не имеет тип void и оператор return должен вернуть значение |
122 |
Некорректное объявление деструктора |
123 |
Отсутствует двоеточие «:» |
124 |
Переменная уже объявлена |
125 |
Переменная с таким идентификатором уже объявлена |
126 |
Имя переменной слишком длинное (>250 символов) |
127 |
Структура с таким идентификатором уже определена |
128 |
Структура не определена |
129 |
Член структуры с таким именем уже определен |
130 |
Нет такого члена структуры |
131 |
Нарушена парность квадратных скобок |
132 |
Ожидается открывающая круглая скобка «(« |
133 |
Несбалансированные фигурные скобки ( отсутствует «}» ) |
134 |
Сложно для компиляции (слишком большое ветвление, внутренний стек уровней переполнен) |
135 |
Ошибка открытия файла на чтение |
136 |
Недостаточно памяти для загрузки исходного файла в память |
137 |
Ожидается переменная |
138 |
Ссылка не может быть инициализирована |
140 |
Ожидалось присваивание (возникает при объявлении) |
141 |
Ожидается открывающая фигурная скобка «{« |
142 |
Параметр может быть только динамическим массивом |
143 |
Использование типа «void» недопустимо |
144 |
Нет пары для «)» или «]», т.е. отсутствует «(» или «[« |
145 |
Нет пары для «(» или «[«, т.е. отсутствует «)» или «]» |
146 |
Некорректная размерность массива |
147 |
Слишком много параметров (>64) |
149 |
Этот токен тут не ожидается |
150 |
Недопустимое использование операции (неправильные операнды) |
151 |
Выражение типа void недопустимо |
152 |
Ожидается оператор |
153 |
Неправильное использование break |
154 |
Ожидается точка с запятой «;» |
155 |
Ожидается запятая «,» |
156 |
Тип должен быть определен как класс, а не как структура |
157 |
Ожидалось выражение |
158 |
В HEX встречается «не HEX символ» или слишком длинное число (количество цифр > 511) |
159 |
Строка-константа имеет более 65534 символов |
160 |
Определение функции здесь недопустимо |
161 |
Неожиданный конец программы |
162 |
Форвардная декларация для структур запрещена |
163 |
Функция с таким именем уже определена и имеет иной тип возвращаемого значения |
164 |
Функция с таким именем уже определена и имеет иной набор параметров |
165 |
Функция с таким именем уже определена и реализована |
166 |
Перегрузка функции для данного вызова не найдена |
167 |
Функция с возвращаемым значением типа void не может возвращать значение |
168 |
Функция не определена |
170 |
Ожидается значение |
171 |
В выражении case допустимы только целочисленные константы |
172 |
Значение для case в этом switch уже использовано |
173 |
Ожидается целочисленное значение |
174 |
В выражении #import ожидается имя файла |
175 |
Выражения на глобальном уровне не допустимы |
176 |
Пропущена круглая скобка «)» перед «;» |
177 |
Слева от знака равенства предполагается переменная |
178 |
Результат выражения не используется |
179 |
Объявление переменных в case недопустимо |
180 |
Неявное преобразование из строки в число |
181 |
Неявное преобразование числа в строку |
182 |
Неоднозначный вызов перегруженной функции (подходят несколько перегрузок) |
183 |
Недопустимый else без соответствующего if |
184 |
Недопустимый case или default без соответствующего switch |
185 |
Недопустимое использование эллипсиса |
186 |
Инициализирующая последовательность имеет большее количество элементов чем инициализируемая переменная |
187 |
Ожидается константа для case |
188 |
Требуется константное выражение |
189 |
Константная переменная не может быть изменена |
190 |
Ожидается закрывающая скобка или запятая (объявление члена массива) |
191 |
Идентификатор перечисления уже используется |
192 |
Перечисление не может иметь модификаторов доступа (const, extern, static) |
193 |
Член перечисления уже объявлен с другим значением |
194 |
Существует переменная, определенная с таким же именем |
195 |
Существует структура, определенная с таким же именем |
196 |
Ожидается имя члена перечисления |
197 |
Ожидается целочисленное выражение |
198 |
Деление на ноль в константном выражении |
199 |
Неверное количество параметров в функции |
200 |
Параметром по ссылке должна быть переменная |
201 |
Ожидается переменная такого же типа для передачи по ссылке |
202 |
Константная переменная не может быть передана по неконстантной ссылке |
203 |
Требуется целочисленная положительная константа |
204 |
Ошибка доступа к защищенному члену класса |
205 |
Импорт уже определен по другому пути |
208 |
Исполняемый файл не создан |
209 |
Для индикатора не найдена точка входа ‘OnCalculate’ |
210 |
Оператор continue может быть использован только внутри цикла |
211 |
Ошибка доступа к private(закрытому) члену класса |
213 |
Метод структуры или класса не объявлен |
214 |
Ошибка доступа к private(закрытому) методу класса |
216 |
Копирование структур с объектами недопустимо |
218 |
Выход индекса за границы массива |
219 |
Недопустима инициализация массивов в объявлении структуры или класса |
220 |
Конструктор класса не может иметь параметров |
221 |
Деструктор класса не может иметь параметров |
222 |
Метод класса или структуры с таким именем и параметрами уже объявлен |
223 |
Ожидается операнд |
224 |
Метод класса или структуры с таким именем есть, но с другими параметрами (объявление!=реализация) |
225 |
Импортируемая функция не описана |
226 |
Функция ZeroMemory() не применима для классов с защищенными членами или наследованием |
227 |
Неоднозначный вызов перегруженной функции (точное совпадение параметров для нескольких перегрузок) |
228 |
Ожидается имя переменной |
229 |
Ссылку нельзя объявить в этом месте |
230 |
Уже используется в качестве имени перечисления |
232 |
Ожидается класс или структура |
235 |
Нельзя вызывать delete для удаления массива |
236 |
Ожидается оператор ‘ while ‘ |
237 |
В delete должен быть указатель |
238 |
default для этого switch уже есть |
239 |
Синтаксическая ошибка |
240 |
Escape-последовательность может встретиться только в строках ( начинается с ‘’ ) |
241 |
Требуется массив – квадратная скобка ‘[‘ не относится к массиву либо в качестве параметра-массива подают не массив |
242 |
Не может быть инициализировано посредством инициализирующей последовательности |
243 |
Импорт не определен |
244 |
Ошибка оптимизатора на синтаксическом дереве |
245 |
Объявлено слишком много структур (упростите программу) |
246 |
Преобразование параметра недопустимо |
247 |
Некорректное использование оператора delete |
248 |
Нельзя объявить указатель на ссылку |
249 |
Нельзя объявить ссылку на ссылку |
250 |
Нельзя объявить указатель на указатель |
251 |
Недопустимо объявление структуры в списке параметров |
252 |
Недопустимая операция приведения типов |
253 |
Указатель можно объявить только для класса или структуры |
256 |
Необъявленный идентификатор |
257 |
Ошибка оптимизатора исполняемого кода |
258 |
Ошибка генерации исполняемого кода |
260 |
Недопустимое выражение для оператора switch |
261 |
Переполнение пула строковых констант, упростите программу |
262 |
Невозможно преобразовать к перечислению |
263 |
Нельзя использовать virtual для данных (членов класса или структуры) |
264 |
Нельзя вызвать защищенный метод класса |
265 |
Переопределяемая виртуальная функция возвращает другой тип |
266 |
Класс нельзя наследовать от структуры |
267 |
Структуру нельзя наследовать от класса |
268 |
Конструктор не может быть виртуальным (спецификатор virtual недопустим) |
269 |
Структура не может иметь виртуальных методов |
270 |
Функция должна иметь тело |
271 |
Перегрузка системных функций (функций терминала) запрещена |
272 |
Спецификатор const недопустим для функций, не являющихся членом класса или структуры |
274 |
Нельзя менять члены класса в константном методе |
276 |
Неподходящая инициализирующая последовательность |
277 |
Пропущено значение по умолчанию для параметра (специфика объявления параметров по умолчанию) |
278 |
Переопределение параметра по умолчанию (в объявлении и реализации разные значения) |
279 |
Нельзя вызвать неконстантный метод для константного объекта |
280 |
Для доступа к членам требуется объект (поставлена точка для не класса/структуры) |
281 |
Имя уже объявленной структуры нельзя использовать при объявлении |
284 |
Неразрешенное преобразование (при закрытом наследовании) |
285 |
Структуры и массивы не могут быть использованы в качестве input-переменных |
286 |
Спецификатор const недопустим для конструктора/деструктора |
287 |
Неправильное строковое выражение для типа datetime |
288 |
Неизвестное свойство (#property) |
289 |
Некорректное значение для свойства |
290 |
Некорректный индекс для свойства в #property |
291 |
Пропущен параметр вызова – < func(x,) > |
293 |
Объект должен быть передан по ссылке |
294 |
Массив должен быть передан по ссылке |
295 |
Функция была декларирована как экспортируемая |
296 |
Функция не была декларирована как экспортируемая |
297 |
Экспортировать импортируемую функцию нельзя |
298 |
Импортируемая функция не может иметь такого параметра (нельзя передавать указатель, класс или структуру, содержащую динамический массив, указатель, класс и т.д.) |
299 |
Должен быть класс |
300 |
Секция #import не закрыта |
302 |
Несоответствие типов |
303 |
extern-переменная уже инициализирована |
304 |
Не найдено ни одной экспортируемой функции или стандартной точки входа |
305 |
Явный вызов конструктора запрещен |
306 |
Метод был объявлен константным |
307 |
Метод не был объявлен константным |
308 |
Некорректный размер ресурсного файла |
309 |
Некорректное имя ресурса |
310 |
Ошибка открытия файла ресурса |
311 |
Ошибка чтения файла ресурса |
312 |
Неизвестный тип ресурса |
313 |
Некорректный путь к файлу ресурса |
314 |
Указанное имя ресурса уже используется |
315 |
Ожидались параметры макроса |
316 |
После имени макроса должен быть пробел |
317 |
Ошибка в описании параметров макроса |
318 |
Неверное число параметров при использовании макроса |
319 |
Превышение максимального количества(16) параметров для макроса |
320 |
Макрос слишком сложный, требуется упрощение |
321 |
Параметром EnumToString() может быть только перечисление |
322 |
Имя ресурса слишком длинное |
323 |
Неподдерживаемый формат изображения (допустим только BMP-формат с глубиной цвета 24 или 32 бита) |
324 |
Объявление массива внутри оператора запрещено |
325 |
Функцию можно определить только на глобальном уровне |
326 |
Данное объявление недопустимо для текущей области видимости (области определения) |
327 |
Инициализация статичных переменных значениями локальных недопустима |
328 |
Недопустимое объявление массива объектов, не имеющих конструктора по умолчанию |
329 |
Список инициализации разрешен только для конструкторов |
330 |
Отсутствует определение функции после списка инициализации |
331 |
Список инициализации пуст |
332 |
Инициализация массива в конструкторе запрещена |
333 |
В списке инициализации запрещено инициализировать члены родительского класса |
334 |
Ожидалось выражение целого типа |
335 |
Требуемый объем памяти для массива превышает максимально допустимое значение |
336 |
Требуемый объем памяти для структуры превышает максимально допустимое значение |
337 |
Требуемый объем памяти для переменных, объявленных на глобальном уровне, превышает максимально допустимое значение |
338 |
Требуемый объем памяти для локальных переменных превышает максимально допустимое значение |
339 |
Конструктор не определен |
340 |
Недопустимое имя для файла иконки |
341 |
Не удалось открыть файла иконки по указанному пути |
342 |
Файл иконки некорректен и не соответствует формату ICO |
343 |
Повторная инициализация члена в конструкторе класса/структуры с помощью списка инициализации |
344 |
Инициализация статических членов в списке инициализации конструктора не допускается |
345 |
Инициализация нестатического члена класса/структуры на глобальном уровне запрещена |
346 |
Имя метода класса/структуры совпадает с ранее объявленным именем члена |
347 |
Имя члена класса/структуры совпадает с ранее объявленным именем метода |
348 |
Виртуальная функция не может быть объявлена как static |
349 |
Модификатор const недопустим для статической функции |
350 |
Конструктор или деструктор не могут быть статическими |
351 |
Нельзя обращаться к нестатическому члену/методу класса или структуры из статической функции |
352 |
После ключевого слова operator ожидается перегружаемая операция (+,-,[],++,— и т.д.) |
353 |
Не все операции можно перегружать в MQL5 |
354 |
Определение не соответствует объявлению |
355 |
Указано неверное количество параметров для оператора |
356 |
Не обнаружено ни одной функции-обработчика события |
357 |
Методы не могут быть экспортируемыми |
358 |
Нельзя приводить указатель на константный объект к указателю на неконстантный объект |
359 |
Шаблоны классов пока не поддерживаются |
360 |
Перегрузка шаблонов функций пока не поддерживается |
361 |
Невозможно применить шаблон функции |
362 |
Неоднозначный параметр в шаблоне функции (подходят несколько типов параметра) |
363 |
Невозможно определить к какому типу параметра приводить аргумент шаблона функции |
364 |
Неверное количество параметров в шаблоне функции |
365 |
Шаблон функции не может быть виртуальным |
366 |
Шаблоны функций не могут быть экспортированы |
367 |
Нельзя импортировать шаблоны функций |
368 |
Структуры, содержащие объекты, недопустимы |
369 |
Массивы строк и структуры, содержащие объекты, недопустимы |
370 |
Статический член класса/структуры должен быть явно инициализирован |
371 |
Ограничение компилятора: строка не может содержать более 65 535 символов |
372 |
Несогласованные #ifdef/#endif |
373 |
Результатом выполнения функции не может быть объект класса, так как отсутствует конструктор копирования |
374 |
Нельзя использовать нестатические члены и/или методы при инициализации статической переменной |
375 |
OnTesterInit() нельзя использовать без объявления обработчика OnTesterDeinit() |
376 |
Имя локальной переменной совпадает с именем одного из параметров функции |
377 |
Нельзя использовать макросы __FUNCSIG__ и __FUNCTION__ вне тела функции |
378 |
Недопустимый возвращаемый тип. Например, такая ошибка будет выдана для функций, импортированных из DLL, которые возвращают структуру или указатель в качестве результата |
379 |
Ошибка при использовании шаблона |
380 |
Не используется |
381 |
Недопустимый синтаксис при объявлении чисто виртуальной функции, разрешено «=NULL» или «=0» |
382 |
Только виртуальные функции могут быть объявлены со спецификатором чисто виртуальной функции («=NULL» или «=0») |
383 |
Нельзя создать экземпляр абстрактного класса |
384 |
Для динамического приведения с помощью оператора dynamic_cast типом назначения должен быть указатель на пользовательский тип |
385 |
Ожидается тип «указатель на функцию» |
386 |
Указатели на методы не поддерживаются |
387 |
Ошибка – невозможно определить тип указателя на функцию |
388 |
Приведение типа недоступно из-за закрытого наследования |
389 |
Переменная с модификатором const должна быть проинициализирована при объявлении |
393 |
В интерфейсе могут быть объявлены только методы с публичным доступом |
394 |
Недопустимое вложение интерфейса в другой интерфейс |
395 |
Интерфейс может наследоваться только от другого интерфейса |
396 |
Ожидается интерфейс |
397 |
Интерфейсы поддерживают только публичное наследование |
398 |
Интерфейс не может содержать члены |
399 |
Нельзя создавать объекты интерфейса напрямую, только через наследование |
GetLastError() – функция, возвращающая код последней ошибки, которая хранится в предопределенной переменной _LastError. Значение этой переменной можно сбросить в ноль функцией ResetLastError().
ERR_SUCCESS |
0 |
Операция выполнена успешно |
ERR_INTERNAL_ERROR |
4001 |
Неожиданная внутренняя ошибка |
ERR_WRONG_INTERNAL_PARAMETER |
4002 |
Ошибочный параметр при внутреннем вызове функции клиентского терминала |
ERR_INVALID_PARAMETER |
4003 |
Ошибочный параметр при вызове системной функции |
ERR_NOT_ENOUGH_MEMORY |
4004 |
Недостаточно памяти для выполнения системной функции |
ERR_STRUCT_WITHOBJECTS_ORCLASS |
4005 |
Структура содержит объекты строк и/или динамических массивов и/или структуры с такими объектами и/или классы |
ERR_INVALID_ARRAY |
4006 |
Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива |
ERR_ARRAY_RESIZE_ERROR |
4007 |
Недостаточно памяти для перераспределения массива либо попытка изменения размера статического массива |
ERR_STRING_RESIZE_ERROR |
4008 |
Недостаточно памяти для перераспределения строки |
ERR_NOTINITIALIZED_STRING |
4009 |
Неинициализированная строка |
ERR_INVALID_DATETIME |
4010 |
Неправильное значение даты и/или времени |
ERR_ARRAY_BAD_SIZE |
4011 |
Запрашиваемый размер массива превышает 2 гигабайта |
ERR_INVALID_POINTER |
4012 |
Ошибочный указатель |
ERR_INVALID_POINTER_TYPE |
4013 |
Ошибочный тип указателя |
ERR_FUNCTION_NOT_ALLOWED |
4014 |
Системная функция не разрешена для вызова |
ERR_RESOURCE_NAME_DUPLICATED |
4015 |
Совпадении имени динамического и статического ресурсов |
ERR_RESOURCE_NOT_FOUND |
4016 |
Ресурс с таким именем в EX5 не найден |
ERR_RESOURCE_UNSUPPOTED_TYPE |
4017 |
Неподдерживаемый тип ресурса или размер более 16 MB |
ERR_RESOURCE_NAME_IS_TOO_LONG |
4018 |
Имя ресурса превышает 63 символа |
ERR_MATH_OVERFLOW |
4019 |
При вычислении математической функции произошло переполнение |
Графики |
||
ERR_CHART_WRONG_ID |
4101 |
Ошибочный идентификатор графика |
ERR_CHART_NO_REPLY |
4102 |
График не отвечает |
ERR_CHART_NOT_FOUND |
4103 |
График не найден |
ERR_CHART_NO_EXPERT |
4104 |
У графика нет эксперта, который мог бы обработать событие |
ERR_CHART_CANNOT_OPEN |
4105 |
Ошибка открытия графика |
ERR_CHART_CANNOT_CHANGE |
4106 |
Ошибка при изменении для графика символа и периода |
ERR_CHART_WRONG_PARAMETER |
4107 |
Ошибочное значение параметра для функции по работе с графиком |
ERR_CHART_CANNOT_CREATE_TIMER |
4108 |
Ошибка при создании таймера |
ERR_CHART_WRONG_PROPERTY |
4109 |
Ошибочный идентификатор свойства графика |
ERR_CHART_SCREENSHOT_FAILED |
4110 |
Ошибка при создании скриншота |
ERR_CHART_NAVIGATE_FAILED |
4111 |
Ошибка навигации по графику |
ERR_CHART_TEMPLATE_FAILED |
4112 |
Ошибка при применении шаблона |
ERR_CHART_WINDOW_NOT_FOUND |
4113 |
Подокно, содержащее указанный индикатор, не найдено |
ERR_CHART_INDICATOR_CANNOT_ADD |
4114 |
Ошибка при добавлении индикатора на график |
ERR_CHART_INDICATOR_CANNOT_DEL |
4115 |
Ошибка при удалении индикатора с графика |
ERR_CHART_INDICATOR_NOT_FOUND |
4116 |
Индикатор не найден на указанном графике |
Графические объекты |
||
ERR_OBJECT_ERROR |
4201 |
Ошибка при работе с графическим объектом |
ERR_OBJECT_NOT_FOUND |
4202 |
Графический объект не найден |
ERR_OBJECT_WRONG_PROPERTY |
4203 |
Ошибочный идентификатор свойства графического объекта |
ERR_OBJECT_GETDATE_FAILED |
4204 |
Невозможно получить дату, соответствующую значению |
ERR_OBJECT_GETVALUE_FAILED |
4205 |
Невозможно получить значение, соответствующее дате |
MarketInfo |
||
ERR_MARKET_UNKNOWN_SYMBOL |
4301 |
Неизвестный символ |
ERR_MARKET_NOT_SELECTED |
4302 |
Символ не выбран в MarketWatch |
ERR_MARKET_WRONG_PROPERTY |
4303 |
Ошибочный идентификатор свойства символа |
ERR_MARKET_LASTTIME_UNKNOWN |
4304 |
Время последнего тика неизвестно (тиков не было) |
ERR_MARKET_SELECT_ERROR |
4305 |
Ошибка добавления или удаления символа в MarketWatch |
Доступ к истории |
||
ERR_HISTORY_NOT_FOUND |
4401 |
Запрашиваемая история не найдена |
ERR_HISTORY_WRONG_PROPERTY |
4402 |
Ошибочный идентификатор свойства истории |
ERR_HISTORY_TIMEOUT |
4403 |
Превышен таймаут при запросе истории |
ERR_HISTORY_BARS_LIMIT |
4404 |
Количество запрашиваемых баров ограничено настройками терминала |
ERR_HISTORY_LOAD_ERRORS |
4405 |
Множество ошибок при загрузке истории |
ERR_HISTORY_SMALL_BUFFER |
4407 |
Принимающий массив слишком мал чтобы вместить все запрошенные данные |
Global_Variables |
||
ERR_GLOBALVARIABLE_NOT_FOUND |
4501 |
Глобальная переменная клиентского терминала не найдена |
ERR_GLOBALVARIABLE_EXISTS |
4502 |
Глобальная переменная клиентского терминала с таким именем уже существует |
ERR_GLOBALVARIABLE_NOT_MODIFIED |
4503 |
Не было модификаций глобальных переменных |
ERR_GLOBALVARIABLE_CANNOTREAD |
4504 |
Не удалось открыть и прочитать файл со значениями глобальных переменных |
ERR_GLOBALVARIABLE_CANNOTWRITE |
4505 |
Не удалось записать файл со значениями глобальных переменных |
ERR_MAIL_SEND_FAILED |
4510 |
Не удалось отправить письмо |
ERR_PLAY_SOUND_FAILED |
4511 |
Не удалось воспроизвести звук |
ERR_MQL5_WRONG_PROPERTY |
4512 |
Ошибочный идентификатор свойства программы |
ERR_TERMINAL_WRONG_PROPERTY |
4513 |
Ошибочный идентификатор свойства терминала |
ERR_FTP_SEND_FAILED |
4514 |
Не удалось отправить файл по ftp |
ERR_NOTIFICATION_SEND_FAILED |
4515 |
Не удалось отправить уведомление |
ERR_NOTIFICATION_WRONG_PARAMETER |
4516 |
Неверный параметр для отправки уведомления – в функцию SendNotification() передали пустую строку или NULL |
ERR_NOTIFICATION_WRONG_SETTINGS |
4517 |
Неверные настройки уведомлений в терминале (не указан ID или не выставлено разрешение) |
ERR_NOTIFICATION_TOO_FREQUENT |
4518 |
Слишком частая отправка уведомлений |
ERR_FTP_NOSERVER |
4519 |
Не указан FTP сервер |
ERR_FTP_NOLOGIN |
4520 |
Не указан FTP логин |
ERR_FTP_FILE_ERROR |
4521 |
Не найден файл в директории MQL5Files для отправки на FTP сервер |
ERR_FTP_CONNECT_FAILED |
4522 |
Ошибка при подключении к FTP серверу |
ERR_FTP_CHANGEDIR |
4523 |
На FTP сервере не найдена директория для выгрузки файла |
ERR_FTP_CLOSED |
4524 |
Подключение к FTP серверу закрыто |
Буферы пользовательских индикаторов |
||
ERR_BUFFERS_NO_MEMORY |
4601 |
Недостаточно памяти для распределения индикаторных буферов |
ERR_BUFFERS_WRONG_INDEX |
4602 |
Ошибочный индекс своего индикаторного буфера |
Свойства пользовательских индикаторов |
||
ERR_CUSTOM_WRONG_PROPERTY |
4603 |
Ошибочный идентификатор свойства пользовательского индикатора |
Account |
||
ERR_ACCOUNT_WRONG_PROPERTY |
4701 |
Ошибочный идентификатор свойства счета |
ERR_TRADE_WRONG_PROPERTY |
4751 |
Ошибочный идентификатор свойства торговли |
ERR_TRADE_DISABLED |
4752 |
Торговля для эксперта запрещена |
ERR_TRADE_POSITION_NOT_FOUND |
4753 |
Позиция не найдена |
ERR_TRADE_ORDER_NOT_FOUND |
4754 |
Ордер не найден |
ERR_TRADE_DEAL_NOT_FOUND |
4755 |
Сделка не найдена |
ERR_TRADE_SEND_FAILED |
4756 |
Не удалось отправить торговый запрос |
ERR_TRADE_CALC_FAILED |
4758 |
Не удалось вычислить значение прибыли или маржи |
Индикаторы |
||
ERR_INDICATOR_UNKNOWN_SYMBOL |
4801 |
Неизвестный символ |
ERR_INDICATOR_CANNOT_CREATE |
4802 |
Индикатор не может быть создан |
ERR_INDICATOR_NO_MEMORY |
4803 |
Недостаточно памяти для добавления индикатора |
ERR_INDICATOR_CANNOT_APPLY |
4804 |
Индикатор не может быть применен к другому индикатору |
ERR_INDICATOR_CANNOT_ADD |
4805 |
Ошибка при добавлении индикатора |
ERR_INDICATOR_DATA_NOT_FOUND |
4806 |
Запрошенные данные не найдены |
ERR_INDICATOR_WRONG_HANDLE |
4807 |
Ошибочный хэндл индикатора |
ERR_INDICATOR_WRONG_PARAMETERS |
4808 |
Неправильное количество параметров при создании индикатора |
ERR_INDICATOR_PARAMETERS_MISSING |
4809 |
Отсутствуют параметры при создании индикатора |
ERR_INDICATOR_CUSTOM_NAME |
4810 |
Первым параметром в массиве должно быть имя пользовательского индикатора |
ERR_INDICATOR_PARAMETER_TYPE |
4811 |
Неправильный тип параметра в массиве при создании индикатора |
ERR_INDICATOR_WRONG_INDEX |
4812 |
Ошибочный индекс запрашиваемого индикаторного буфера |
Стакан цен |
||
ERR_BOOKS_CANNOT_ADD |
4901 |
Стакан цен не может быть добавлен |
ERR_BOOKS_CANNOT_DELETE |
4902 |
Стакан цен не может быть удален |
ERR_BOOKS_CANNOT_GET |
4903 |
Данные стакана цен не могут быть получены |
ERR_BOOKS_CANNOT_SUBSCRIBE |
4904 |
Ошибка при подписке на получение новых данных стакана цен |
Файловые операции |
||
ERR_TOO_MANY_FILES |
5001 |
Не может быть открыто одновременно более 64 файлов |
ERR_WRONG_FILENAME |
5002 |
Недопустимое имя файла |
ERR_TOO_LONG_FILENAME |
5003 |
Слишком длинное имя файла |
ERR_CANNOT_OPEN_FILE |
5004 |
Ошибка открытия файла |
ERR_FILE_CACHEBUFFER_ERROR |
5005 |
Недостаточно памяти для кеша чтения |
ERR_CANNOT_DELETE_FILE |
5006 |
Ошибка удаления файла |
ERR_INVALID_FILEHANDLE |
5007 |
Файл с таким хэндлом уже был закрыт, либо не открывался вообще |
ERR_WRONG_FILEHANDLE |
5008 |
Ошибочный хэндл файла |
ERR_FILE_NOTTOWRITE |
5009 |
Файл должен быть открыт для записи |
ERR_FILE_NOTTOREAD |
5010 |
Файл должен быть открыт для чтения |
ERR_FILE_NOTBIN |
5011 |
Файл должен быть открыт как бинарный |
ERR_FILE_NOTTXT |
5012 |
Файл должен быть открыт как текстовый |
ERR_FILE_NOTTXTORCSV |
5013 |
Файл должен быть открыт как текстовый или CSV |
ERR_FILE_NOTCSV |
5014 |
Файл должен быть открыт как CSV |
ERR_FILE_READERROR |
5015 |
Ошибка чтения файла |
ERR_FILE_BINSTRINGSIZE |
5016 |
Должен быть указан размер строки, так как файл открыт как бинарный |
ERR_INCOMPATIBLE_FILE |
5017 |
Для строковых массивов должен быть текстовый файл, для остальных – бинарный |
ERR_FILE_IS_DIRECTORY |
5018 |
Это не файл, а директория |
ERR_FILE_NOT_EXIST |
5019 |
Файл не существует |
ERR_FILE_CANNOT_REWRITE |
5020 |
Файл не может быть переписан |
ERR_WRONG_DIRECTORYNAME |
5021 |
Ошибочное имя директории |
ERR_DIRECTORY_NOT_EXIST |
5022 |
Директория не существует |
ERR_FILE_ISNOT_DIRECTORY |
5023 |
Это файл, а не директория |
ERR_CANNOT_DELETE_DIRECTORY |
5024 |
Директория не может быть удалена |
ERR_CANNOT_CLEAN_DIRECTORY |
5025 |
Не удалось очистить директорию (возможно, один или несколько файлов заблокированы и операция удаления не удалась) |
ERR_FILE_WRITEERROR |
5026 |
Не удалось записать ресурс в файл |
ERR_FILE_ENDOFFILE |
5027 |
Не удалось прочитать следующую порцию данных из CSV-файла (FileReadString, FileReadNumber, FileReadDatetime, FileReadBool), так как достигнут конец файла |
Преобразование строк |
||
ERR_NO_STRING_DATE |
5030 |
В строке нет даты |
ERR_WRONG_STRING_DATE |
5031 |
В строке ошибочная дата |
ERR_WRONG_STRING_TIME |
5032 |
В строке ошибочное время |
ERR_STRING_TIME_ERROR |
5033 |
Ошибка преобразования строки в дату |
ERR_STRING_OUT_OF_MEMORY |
5034 |
Недостаточно памяти для строки |
ERR_STRING_SMALL_LEN |
5035 |
Длина строки меньше, чем ожидалось |
ERR_STRING_TOO_BIGNUMBER |
5036 |
Слишком большое число, больше, чем ULONG_MAX |
ERR_WRONG_FORMATSTRING |
5037 |
Ошибочная форматная строка |
ERR_TOO_MANY_FORMATTERS |
5038 |
Форматных спецификаторов больше, чем параметров |
ERR_TOO_MANY_PARAMETERS |
5039 |
Параметров больше, чем форматных спецификаторов |
ERR_WRONG_STRING_PARAMETER |
5040 |
Испорченный параметр типа string |
ERR_STRINGPOS_OUTOFRANGE |
5041 |
Позиция за пределами строки |
ERR_STRING_ZEROADDED |
5042 |
К концу строки добавлен 0, бесполезная операция |
ERR_STRING_UNKNOWNTYPE |
5043 |
Неизвестный тип данных при конвертации в строку |
ERR_WRONG_STRING_OBJECT |
5044 |
Испорченный объект строки |
Работа с массивами |
||
ERR_INCOMPATIBLE_ARRAYS |
5050 |
Копирование несовместимых массивов. Строковый массив может быть скопирован только в строковый, а числовой массив – в числовой |
ERR_SMALL_ASSERIES_ARRAY |
5051 |
Приемный массив объявлен как AS_SERIES, и он недостаточного размера |
ERR_SMALL_ARRAY |
5052 |
Слишком маленький массив, стартовая позиция за пределами массива |
ERR_ZEROSIZE_ARRAY |
5053 |
Массив нулевой длины |
ERR_NUMBER_ARRAYS_ONLY |
5054 |
Должен быть числовой массив |
ERR_ONEDIM_ARRAYS_ONLY |
5055 |
Должен быть одномерный массив |
ERR_SERIES_ARRAY |
5056 |
Таймсерия не может быть использована |
ERR_DOUBLE_ARRAY_ONLY |
5057 |
Должен быть массив типа double |
ERR_FLOAT_ARRAY_ONLY |
5058 |
Должен быть массив типа float |
ERR_LONG_ARRAY_ONLY |
5059 |
Должен быть массив типа long |
ERR_INT_ARRAY_ONLY |
5060 |
Должен быть массив типа int |
ERR_SHORT_ARRAY_ONLY |
5061 |
Должен быть массив типа short |
ERR_CHAR_ARRAY_ONLY |
5062 |
Должен быть массив типа char |
ERR_STRING_ARRAY_ONLY |
5063 |
Должен быть массив типа string |
Работа с OpenCL |
||
ERR_OPENCL_NOT_SUPPORTED |
5100 |
Функции OpenCL на данном компьютере не поддерживаются |
ERR_OPENCL_INTERNAL |
5101 |
Внутренняя ошибка при выполнении OpenCL |
ERR_OPENCL_INVALID_HANDLE |
5102 |
Неправильный хэндл OpenCL |
ERR_OPENCL_CONTEXT_CREATE |
5103 |
Ошибка при создании контекста OpenCL |
ERR_OPENCL_QUEUE_CREATE |
5104 |
Ошибка создания очереди выполнения в OpenCL |
ERR_OPENCL_PROGRAM_CREATE |
5105 |
Ошибка при компиляции программы OpenCL |
ERR_OPENCL_TOO_LONG_KERNEL_NAME |
5106 |
Слишком длинное имя точки входа (кернел OpenCL) |
ERR_OPENCL_KERNEL_CREATE |
5107 |
Ошибка создания кернел — точки входа OpenCL |
ERR_OPENCL_SET_KERNEL_PARAMETER |
5108 |
Ошибка при установке параметров для кернел OpenCL (точки входа в программу OpenCL) |
ERR_OPENCL_EXECUTE |
5109 |
Ошибка выполнения программы OpenCL |
ERR_OPENCL_WRONG_BUFFER_SIZE |
5110 |
Неверный размер буфера OpenCL |
ERR_OPENCL_WRONG_BUFFER_OFFSET |
5111 |
Неверное смещение в буфере OpenCL |
ERR_OPENCL_BUFFER_CREATE |
5112 |
Ошибка создания буфера OpenCL |
ERR_OPENCL_TOO_MANY_OBJECTS |
5113 |
Превышено максимальное число OpenCL объектов |
ERR_OPENCL_SELECTDEVICE |
5114 |
Ошибка выбора OpenCL устройства |
Работа с WebRequest |
||
ERR_WEBREQUEST_INVALID_ADDRESS |
5200 |
URL не прошел проверку |
ERR_WEBREQUEST_CONNECT_FAILED |
5201 |
Не удалось подключиться к указанному URL |
ERR_WEBREQUEST_TIMEOUT |
5202 |
Превышен таймаут получения данных |
ERR_WEBREQUEST_REQUEST_FAILED |
5203 |
Ошибка в результате выполнения HTTP запроса |
Пользовательские символы |
||
ERR_NOT_CUSTOM_SYMBOL |
5300 |
Должен быть указан пользовательский символ |
ERR_CUSTOM_SYMBOL_WRONG_NAME |
5301 |
Некорректное имя пользовательского символа. В имени символа можно использовать только латинские буквы без знаков препинания, пробелов и спецсимволов (допускаются «.», «_», «&» и «#»). Не рекомендуется использовать символы <, >, :, «, /,, |, ?, *. |
ERR_CUSTOM_SYMBOL_NAME_LONG |
5302 |
Слишком длинное имя для пользовательского символа. Длина имени символа не должна превышать 32 знака с учётом завершающего 0 |
ERR_CUSTOM_SYMBOL_PATH_LONG |
5303 |
Слишком длинный путь для пользовательского символа. Длина пути не более 128 знаков с учётом «Custom\», имени символа, разделителей групп и завершающего 0 |
ERR_CUSTOM_SYMBOL_EXIST |
5304 |
Пользовательский символ с таким именем уже существует |
ERR_CUSTOM_SYMBOL_ERROR |
5305 |
Ошибка при создании, удалении или изменении пользовательского символа |
ERR_CUSTOM_SYMBOL_SELECTED |
5306 |
Попытка удалить пользовательский символ, выбранный в обзоре рынка (Market Watch) |
ERR_CUSTOM_SYMBOL_PROPERTY_WRONG |
5307 |
Неправильное свойство пользовательского символа |
ERR_CUSTOM_SYMBOL_PARAMETER_ERROR |
5308 |
Ошибочный параметр при установке свойства пользовательского символа |
ERR_CUSTOM_SYMBOL_PARAMETER_LONG |
5309 |
Слишком длинный строковый параметр при установке свойства пользовательского символа |
ERR_CUSTOM_TICKS_WRONG_ORDER |
5310 |
Не упорядоченный по времени массив тиков |
Пользовательские ошибки |
||
ERR_USER_ERROR_FIRST |
65536 |
С этого кода начинаются ошибки, задаваемые пользователем |
I made some modifications and It’s working on Ubuntu 20.04 and MT5.
Download the dependencies and remove funcions that are duplicated. Be happy!!!
//+--------------------------------------------------------------+
//| DWX_ZeroMQ_Server_v2.0.2_RC8.mq4
//| @author: Darwinex Labs (www.darwinex.com)
//|
//| Copyright (c) 2017-2019, Darwinex. All rights reserved.
//|
//| Licensed under the BSD 3-Clause License, you may not use this file except
//| in compliance with the License.
//|
//| You may obtain a copy of the License at:
//| https://opensource.org/licenses/BSD-3-Clause
//+--------------------------------------------------------------+
#property copyright "Copyright 2017-2019, Darwinex Labs."
#property link "https://www.darwinex.com/"
#property version "2.0.2"
#property strict
// Aqui tem algumas constantes que são equivalentes
#include <MT4Orders.mqh> // если есть #include <Trade/Trade.mqh>, вставить эту строчку ПОСЛЕ
#include <MQL4_to_MQL5.mqh> // ТОЛЬКО для данного примера
//MT5|Expert!0
#include <mql4compat.mqh>
//+------------------------------------------------------------------+
//| InitMQL4.mqh |
//| Copyright DC2008 |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "keiji"
#property copyright "DC2008"
#property link "https://www.mql5.com"
//--- Declaration of constants
#define OP_BUY 0 //Buy
#define OP_SELL 1 //Sell
#define OP_BUYLIMIT 2 //Pending order of BUY LIMIT type
#define OP_SELLLIMIT 3 //Pending order of SELL LIMIT type
#define OP_BUYSTOP 4 //Pending order of BUY STOP type
#define OP_SELLSTOP 5 //Pending order of SELL STOP type
//---
#define MODE_OPEN 0
#define MODE_CLOSE 3
#define MODE_VOLUME 4
#define MODE_REAL_VOLUME 5
#define MODE_TRADES 0
#define MODE_HISTORY 1
#define SELECT_BY_POS 0
#define SELECT_BY_TICKET 1
//---
#define DOUBLE_VALUE 0
#define FLOAT_VALUE 1
#define LONG_VALUE INT_VALUE
//---
#define CHART_BAR 0
#define CHART_CANDLE 1
//---
#define MODE_ASCEND 0
#define MODE_DESCEND 1
//---
#define MODE_LOW 1
#define MODE_HIGH 2
#define MODE_TIME 5
#define MODE_BID 9
#define MODE_ASK 10
#define MODE_POINT 11
#define MODE_DIGITS 12
#define MODE_SPREAD 13
#define MODE_STOPLEVEL 14
#define MODE_LOTSIZE 15
#define MODE_TICKVALUE 16
#define MODE_TICKSIZE 17
#define MODE_SWAPLONG 18
#define MODE_SWAPSHORT 19
#define MODE_STARTING 20
#define MODE_EXPIRATION 21
#define MODE_TRADEALLOWED 22
#define MODE_MINLOT 23
#define MODE_LOTSTEP 24
#define MODE_MAXLOT 25
#define MODE_SWAPTYPE 26
#define MODE_PROFITCALCMODE 27
#define MODE_MARGINCALCMODE 28
#define MODE_MARGININIT 29
#define MODE_MARGINMAINTENANCE 30
#define MODE_MARGINHEDGED 31
#define MODE_MARGINREQUIRED 32
#define MODE_FREEZELEVEL 33
//---
#define EMPTY -1
// Required: MQL-ZMQ from https://github.com/dingmaotu/mql-zmq
#include <Zmq/Zmq.mqh>
extern string PROJECT_NAME = "DWX_ZeroMQ_MT4_Server";
extern string ZEROMQ_PROTOCOL = "tcp";
extern string HOSTNAME = "*";
extern int PUSH_PORT = 32768;
extern int PULL_PORT = 32769;
extern int PUB_PORT = 32770;
extern int MILLISECOND_TIMER = 1;
extern string t0 = "--- Trading Parameters ---";
extern int MagicNumber = 123456;
extern int MaximumOrders = 1;
extern double MaximumLotSize = 0.01;
extern int MaximumSlippage = 3;
extern bool DMA_MODE = true;
//extern string t1 = "--- ZeroMQ Configuration ---";
bool Publish_MarketData = false;
bool Publish_MarketRates = false;
// Dynamic array initialized at OnInit(). Can be updated by TRACK_PRICES requests from client peers
string Publish_Symbols[];
// CREATE ZeroMQ Context
Context context(PROJECT_NAME);
// CREATE ZMQ_PUSH SOCKET
Socket pushSocket(context, ZMQ_PUSH);
// CREATE ZMQ_PULL SOCKET
Socket pullSocket(context, ZMQ_PULL);
// CREATE ZMQ_PUB SOCKETMT5|Expert!0
Socket pubSocket(context, ZMQ_PUB);
// VARIABLES FOR LATER
uchar _data[];
ZmqMsg request;
/**
* Class definition for an specific instrument: the tuple (symbol,timeframe)
*/
class Instrument{
public:
//--------------------------------------------------------------
/** Instrument constructor */
Instrument(){ _symbol = ""; _name = ""; _timeframe = PERIOD_CURRENT; _last_pub_rate =0;}
//--------------------------------------------------------------
/** Getters */
string symbol() { return _symbol; }
ENUM_TIMEFRAMES timeframe() { return _timeframe; }
string name() { return _name; }
datetime getLastPublishTimestamp() { return _last_pub_rate; }
/** Setters */
void setLastPublishTimestamp(datetime tmstmp) { _last_pub_rate = tmstmp; }
//+------------------------------------------------------------------+
// Get Timeframe from text
string GetTimeframeText(ENUM_TIMEFRAMES tf){
// Standard timeframes
switch(tf){
case PERIOD_M1: return "M1";
case PERIOD_M5: return "M5";
case PERIOD_M15: return "M15";
case PERIOD_M30: return "M30";
case PERIOD_H1: return "H1";
case PERIOD_H4: return "H4";
case PERIOD_D1: return "D1";
case PERIOD_W1: return "W1";
case PERIOD_MN1: return "MN1";
default: return "UNKNOWN";
}
}
//--------------------------------------------------------------
/** Setup instrument with symbol and timeframe descriptions
* @param arg_symbol Symbol
* @param arg_timeframe Timeframe
*/
void setup(string arg_symbol, ENUM_TIMEFRAMES arg_timeframe){
_symbol = arg_symbol;
_timeframe = arg_timeframe;
_name = _symbol + "_" + GetTimeframeText(_timeframe);
_last_pub_rate = 0;
}
//--------------------------------------------------------------
/** Get last N MqlRates from this instrument (symbol-timeframe)
* @param rates Receives last 'count' rates
* @param count Number of requested rates
* @return Number of returned rates
*/
int GetRates(MqlRates& rates[], int count){
// ensures that symbol is setup
if(StringLen(_symbol) > 0){
return CopyRates(_symbol, _timeframe, 0, count, rates);
}
return 0;
}
protected:
string _name; //!< Instrument descriptive name
string _symbol; //!< Symbol
ENUM_TIMEFRAMES _timeframe; //!< Timeframe
datetime _last_pub_rate; //!< Timestamp of the last published OHLC rate. Default = 0 (1 Jan 1970)
};
// Array of instruments whose rates will be published if Publish_MarketRates = True. It is initialized at OnInit() and
// can be updated through TRACK_RATES request from client peers.
Instrument Publish_Instruments[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
//---
// // Default symbol list. Can be modified through TRACK_PRICES request from client side.
// ArrayResize(Publish_Symbols, 1);
// Publish_Symbols[0] = "EURAUD";
//
// // Default instrument list. Can be modified through TRACK_RATES request from client side.
// ArrayResize(Publish_Instruments, 1);
// Publish_Instruments[0].setup("EURAUD", PERIOD_M1);
EventSetMillisecondTimer(MILLISECOND_TIMER); // Set Millisecond Timer to get client socket input
context.setBlocky(false);
// Send responses to PULL_PORT that client is listening on.
if(!pushSocket.bind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PULL_PORT))){
Print("[PUSH] ####ERROR#### Binding MT4 Server to Socket on Port " + IntegerToString(PULL_PORT) + "..");
return(INIT_FAILED);
}
else{
Print("[PUSH] Binding MT4 Server to Socket on Port " + IntegerToString(PULL_PORT) + "..");
pushSocket.setSendHighWaterMark(1);
pushSocket.setLinger(0);
}
// Receive commands from PUSH_PORT that client is sending to.
if(!pullSocket.bind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT))){
Print("[PULL] ####ERROR#### Binding MT4 Server to Socket on Port " + IntegerToString(PUSH_PORT) + "..");
return(INIT_FAILED);
}
else{
Print("[PULL] Binding MT4 Server to Socket on Port " + IntegerToString(PUSH_PORT) + "..");
pullSocket.setReceiveHighWaterMark(1);
pullSocket.setLinger(0);
}
// Send new market data to PUB_PORT that client is subscribed to.
if(!pubSocket.bind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUB_PORT))){
Print("[PUB] ####ERROR#### Binding MT4 Server to Socket on Port " + IntegerToString(PUB_PORT) + "..");
return(INIT_FAILED);
}
else{
Print("[PUB] Binding MT4 Server to Socket on Port " + IntegerToString(PUB_PORT) + "..");
pubSocket.setSendHighWaterMark(1);
pubSocket.setLinger(0);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("[PUSH] Unbinding MT4 Server from Socket on Port " + IntegerToString(PULL_PORT) + "..");
pushSocket.unbind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PULL_PORT));
Print("[PULL] Unbinding MT4 Server from Socket on Port " + IntegerToString(PUSH_PORT) + "..");
pullSocket.unbind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUSH_PORT));
if (Publish_MarketData == true || Publish_MarketRates == true)
{
Print("[PUB] Unbinding MT4 Server from Socket on Port " + IntegerToString(PUB_PORT) + "..");
pubSocket.unbind(StringFormat("%s://%s:%d", ZEROMQ_PROTOCOL, HOSTNAME, PUB_PORT));
}
// Shutdown ZeroMQ Context
context.shutdown();
context.destroy(0);
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
/*
Use this OnTick() function to send market data to subscribed client.
*/
if(!IsStopped())
{
// Python clients can subscribe to a price feed for each tracked symbol
if(Publish_MarketData == true) {
for(int s = 0; s < ArraySize(Publish_Symbols); s++) {
string _tick = GetBidAsk(Publish_Symbols[s]);
// publish: topic=symbol msg=tick_data
ZmqMsg reply(StringFormat("%s %s", Publish_Symbols[s], _tick));
Print("Sending PRICE [" + reply.getData() + "] to PUB Socket");
if(!pubSocket.send(reply, true)){
Print("###ERROR### Sending price");
}
}
}
// Python clients can also subscribe to a rates feed for each tracked instrument
if(Publish_MarketRates == true){
for(int s = 0; s < ArraySize(Publish_Instruments); s++) {
MqlRates curr_rate[];
int count = Publish_Instruments[s].GetRates(curr_rate, 1);
// if last rate is returned and its timestamp is greater than the last published...
if(count > 0 && Publish_Instruments[s].getLastPublishTimestamp() < curr_rate[0].time){
// then send a new pub message with this new rate
string _rates = StringFormat("%u;%f;%f;%f;%f;%d;%d;%d",
curr_rate[0].time,
curr_rate[0].open,
curr_rate[0].high,
curr_rate[0].low,
curr_rate[0].close,
curr_rate[0].tick_volume,
curr_rate[0].spread,
curr_rate[0].real_volume);
ZmqMsg reply(StringFormat("%s %s", Publish_Instruments[s].name(), _rates));
Print("Sending Rates @"+TimeToStr(curr_rate[0].time) + " [" + reply.getData() + "] to PUB Socket");
if(!pubSocket.send(reply, true)){
Print("###ERROR### Sending rate");
}
// updates the timestamp
Publish_Instruments[s].setLastPublishTimestamp(curr_rate[0].time);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
/*
Use this OnTimer() function to get and respond to commands
*/
// Get client's response, but don't block.
pullSocket.recv(request, true);
if (request.size() > 0)
{
// Wait
// pullSocket.recv(request,false);
// MessageHandler() should go here.
ZmqMsg reply = MessageHandler(request);
// Send response, and block
// pushSocket.send(reply);
// Send response, but don't block
if(!pushSocket.send(reply, true)){
Print("###ERROR### Sending message");
}
}
}
//+------------------------------------------------------------------+
ZmqMsg MessageHandler(ZmqMsg &_request) {
// Output object
ZmqMsg reply;
// Message components for later.
string components[11];
if(_request.size() > 0) {
// Get data from request
ArrayResize(_data, _request.size());
_request.getData(_data);
string dataStr = CharArrayToString(_data);
// Process data
ParseZmqMessage(dataStr, components);
// Interpret data
InterpretZmqMessage(pushSocket, components);
}
else {
// NO DATA RECEIVED
}
return(reply);
}
// Interpret Zmq Message and perform actions
void InterpretZmqMessage(Socket &pSocket, string &compArray[]) {
// Message Structures:
// 1) Trading
// TRADE|ACTION|TYPE|SYMBOL|PRICE|SL|TP|COMMENT|TICKET
// e.g. TRADE|OPEN|1|EURUSD|0|50|50|R-to-MetaTrader4|12345678
// The 12345678 at the end is the ticket ID, for MODIFY and CLOSE.
// 2) Data Requests
// 2.1) RATES|SYMBOL -> Returns Current Bid/Ask
// 2.2) DATA|SYMBOL|TIMEFRAME|START_DATETIME|END_DATETIME
// NOTE: datetime has format: D'2015.01.01 00:00'
/*
compArray[0] = TRADE or RATES
If RATES -> compArray[1] = Symbol
If TRADE ->
compArray[0] = TRADE
compArray[1] = ACTION (e.g. OPEN, MODIFY, CLOSE)
compArray[2] = TYPE (e.g. OP_BUY, OP_SELL, etc - only used when ACTION=OPEN)
// ORDER TYPES:
// https://docs.mql4.com/constants/tradingconstants/orderproperties
// OP_BUY = 0
// OP_SELL = 1
// OP_BUYLIMIT = 2
// OP_SELLLIMIT = 3
// OP_BUYSTOP = 4
// OP_SELLSTOP = 5
compArray[3] = Symbol (e.g. EURUSD, etc.)
compArray[4] = Open/Close Price (ignored if ACTION = MODIFY)
compArray[5] = SL
compArray[6] = TP
compArray[7] = Trade Comment
compArray[8] = Lots
compArray[9] = Magic Number
compArray[10] = Ticket Number (MODIFY/CLOSE)
*/
int switch_action = 0;
/* 02-08-2019 10:41 CEST - HEARTBEAT */
if(compArray[0] == "HEARTBEAT")
InformPullClient(pSocket, "{'_action': 'heartbeat', '_response': 'loud and clear!'}");
/* Process Messages */
if(compArray[0] == "TRADE" && compArray[1] == "OPEN")
switch_action = 1;
if(compArray[0] == "TRADE" && compArray[1] == "MODIFY")
switch_action = 2;
if(compArray[0] == "TRADE" && compArray[1] == "CLOSE")
switch_action = 3;
if(compArray[0] == "TRADE" && compArray[1] == "CLOSE_PARTIAL")
switch_action = 4;
if(compArray[0] == "TRADE" && compArray[1] == "CLOSE_MAGIC")
switch_action = 5;
if(compArray[0] == "TRADE" && compArray[1] == "CLOSE_ALL")
switch_action = 6;
if(compArray[0] == "TRADE" && compArray[1] == "GET_OPEN_TRADES")
switch_action = 7;
if(compArray[0] == "DATA")
switch_action = 8;
/* Setup processing variables */
string zmq_ret = "";
string ret = "";
int ticket = -1;
bool ans = false;
/****************************
* PERFORM SOME CHECKS HERE *
****************************/
if (CheckOpsStatus(pSocket, switch_action) == true)
{
switch(switch_action)
{
case 1: // OPEN TRADE
zmq_ret = "{";
// Function definition:
ticket = DWX_OpenOrder(compArray[3], StringToInteger(compArray[2]), StringToDouble(compArray[8]),
StringToDouble(compArray[4]), StringToInteger(compArray[5]), StringToInteger(compArray[6]),
compArray[7], StringToInteger(compArray[9]), zmq_ret);
// Send TICKET back as JSON
InformPullClient(pSocket, zmq_ret + "}");
break;
case 2: // MODIFY SL/TP
zmq_ret = "{'_action': 'MODIFY'";
// Function definition:
ans = DWX_SetSLTP(StringToInteger(compArray[10]), StringToDouble(compArray[5]), StringToDouble(compArray[6]),
StringToInteger(compArray[9]), StringToInteger(compArray[2]), StringToDouble(compArray[4]),
compArray[3], 3, zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
case 3: // CLOSE TRADE
zmq_ret = "{";
// IMPLEMENT CLOSE TRADE LOGIC HERE
DWX_CloseOrder_Ticket(StrToInteger(compArray[10]), zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
case 4: // CLOSE PARTIAL
zmq_ret = "{";
ans = DWX_ClosePartial(StrToDouble(compArray[8]), zmq_ret, StrToInteger(compArray[10]));
InformPullClient(pSocket, zmq_ret + "}");
break;
case 5: // CLOSE MAGIC
zmq_ret = "{";
DWX_CloseOrder_Magic(StrToInteger(compArray[9]), zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
case 6: // CLOSE ALL ORDERS
zmq_ret = "{";
DWX_CloseAllOrders(zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
case 7: // GET OPEN ORDERS
zmq_ret = "{";
DWX_GetOpenOrders(zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
case 8: // DATA REQUEST
zmq_ret = "{";
DWX_GetData(compArray, zmq_ret);
InformPullClient(pSocket, zmq_ret + "}");
break;
default:
break;
}
}
}
// CLOSE ORDER (by Ticket)
void DWX_CloseOrder_Ticket(int _ticket, string &zmq_ret) {
bool found = false;
zmq_ret = zmq_ret + "'_action': 'CLOSE', '_ticket': " + IntegerToString(_ticket);
for(int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i,SELECT_BY_POS)==true && OrderTicket() == _ticket) {
found = true;
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
DWX_CloseAtMarket(-1, zmq_ret);
zmq_ret = zmq_ret + ", '_response': 'CLOSE_MARKET'";
} else {
zmq_ret = zmq_ret + ", '_response': 'CLOSE_PENDING'";
int tmpRet = OrderDelete(OrderTicket());
}
}
}
if(found == false) {
zmq_ret = zmq_ret + ", '_response': 'NOT_FOUND'";
}
else {
zmq_ret = zmq_ret + ", '_response_value': 'SUCCESS'";
}
}
// Check if operations are permitted
bool CheckOpsStatus(Socket &pSocket, int sFlag) {
if (sFlag <= 6) {
if (!IsTradeAllowed()) {
InformPullClient(pSocket, "{'_response': 'TRADING_IS_NOT_ALLOWED__ABORTED_COMMAND'}");
return(false);
}
else if (!IsExpertEnabled()) {
InformPullClient(pSocket, "{'_response': 'EA_IS_DISABLED__ABORTED_COMMAND'}");
return(false);
}
else if (IsTradeContextBusy()) {
InformPullClient(pSocket, "{'_response': 'TRADE_CONTEXT_BUSY__ABORTED_COMMAND'}");
return(false);
}
else if (!IsDllsAllowed()) {
InformPullClient(pSocket, "{'_response': 'DLLS_DISABLED__ABORTED_COMMAND'}");
return(false);
}
else if (!IsLibrariesAllowed()) {
InformPullClient(pSocket, "{'_response': 'LIBS_DISABLED__ABORTED_COMMAND'}");
return(false);
}
else if (!IsConnected()) {
InformPullClient(pSocket, "{'_response': 'NO_BROKER_CONNECTION__ABORTED_COMMAND'}");
return(false);
}
}
return(true);
}
// OPEN NEW ORDER
int DWX_OpenOrder(string _symbol, int _type, double _lots, double _price, double _SL, double _TP, string _comment, int _magic, string &zmq_ret) {
int ticket, error;
zmq_ret = zmq_ret + "'_action': 'EXECUTION'";
if(_lots > MaximumLotSize) {
zmq_ret = zmq_ret + ", " + "'_response': 'LOT_SIZE_ERROR', 'response_value': 'MAX_LOT_SIZE_EXCEEDED'";
return(-1);
}
double sl = _SL;
double tp = _TP;
// Else
if(DMA_MODE) {
sl = 0.0;
tp = 0.0;
}
if(_symbol == "NULL") {
ticket = OrderSend(Symbol(), _type, _lots, _price, MaximumSlippage, sl, tp, _comment, _magic);
} else {
ticket = OrderSend(_symbol, _type, _lots, _price, MaximumSlippage, sl, tp, _comment, _magic);
}
if(ticket < 0) {
// Failure
error = GetLastError();
zmq_ret = zmq_ret + ", " + "'_response': '" + IntegerToString(error) + "', 'response_value': '" + ErrorDescription(error) + "'";
return(-1*error);
}
int tmpRet = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
zmq_ret = zmq_ret + ", " + "'_magic': " + IntegerToString(_magic) + ", '_ticket': " + IntegerToString(OrderTicket()) + ", '_open_time': '" + TimeToStr(OrderOpenTime(),TIME_DATE|TIME_SECONDS) + "', '_open_price': " + DoubleToString(OrderOpenPrice());
if(DMA_MODE) {
int retries = 3;
while(true) {
retries--;
if(retries < 0) return(0);
if((_SL == 0 && _TP == 0) || (OrderStopLoss() == _SL && OrderTakeProfit() == _TP)) {
return(ticket);
}
if(DWX_IsTradeAllowed(30, zmq_ret) == 1) {
if(DWX_SetSLTP(ticket, _SL, _TP, _magic, _type, _price, _symbol, retries, zmq_ret)) {
return(ticket);
}
if(retries == 0) {
zmq_ret = zmq_ret + ", '_response': 'ERROR_SETTING_SL_TP'";
return(-11111);
}
}
Sleep(MILLISECOND_TIMER);
}
zmq_ret = zmq_ret + ", '_response': 'ERROR_SETTING_SL_TP'";
zmq_ret = zmq_ret + "}";
return(-1);
}
// Send zmq_ret to Python Client
zmq_ret = zmq_ret + "}";
return(ticket);
}
//+------------------------------------------------------------------+
// SET SL/TP
bool DWX_SetSLTP(int ticket, double _SL, double _TP, int _magic, int _type, double _price, string _symbol, int retries, string &zmq_ret) {
if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
{
int dir_flag = -1;
if (OrderType() == 0 || OrderType() == 2 || OrderType() == 4)
dir_flag = 1;
double vpoint = MarketInfo(OrderSymbol(), MODE_POINT);
int vdigits = (int)MarketInfo(OrderSymbol(), MODE_DIGITS);
if(OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-_SL*dir_flag*vpoint,vdigits), NormalizeDouble(OrderOpenPrice()+_TP*dir_flag*vpoint,vdigits), 0, 0)) {
zmq_ret = zmq_ret + ", '_sl': " + DoubleToString(_SL) + ", '_tp': " + DoubleToString(_TP);
return(true);
} else {
int error = GetLastError();
zmq_ret = zmq_ret + ", '_response': '" + IntegerToString(error) + "', '_response_value': '" + ErrorDescription(error) + "', '_sl_attempted': " + NormalizeDouble(OrderOpenPrice()-_SL*dir_flag*vpoint,vdigits) + ", '_tp_attempted': " + NormalizeDouble(OrderOpenPrice()+_TP*dir_flag*vpoint,vdigits);
if(retries == 0) {
RefreshRates();
DWX_CloseAtMarket(-1, zmq_ret);
// int lastOrderErrorCloseTime = TimeCurrent();
}
return(false);
}
}
// return(true);
return(false);
}
//+------------------------------------------------------------------+
// Set list of symbols to get real-time price data
void DWX_SetSymbolList(string& compArray[], string& zmq_ret) {
zmq_ret = zmq_ret + "'_action': 'TRACK_PRICES'";
// Format: TRACK_PRICES|SYMBOL_1|SYMBOL_2|...|SYMBOL_N
string result = "Tracking PRICES from";
int _num_symbols = ArraySize(compArray) - 1;
if(_num_symbols > 0){
ArrayResize(Publish_Symbols, _num_symbols);
for(int s=0; s<_num_symbols; s++){
Publish_Symbols[s] = compArray[s+1];
result += " " + Publish_Symbols[s];
}
zmq_ret = zmq_ret + ", '_data': {'symbol_count':" + IntegerToString(_num_symbols) + "}";
Publish_MarketData = true;
}
else {
Publish_MarketData = false;
ArrayResize(Publish_Symbols, 1);
zmq_ret = zmq_ret + ", '_data': {'symbol_count': 0}";
result += " NONE";
}
Print(result);
}
//+------------------------------------------------------------------+
// Get data for request datetime range
void DWX_GetData(string& compArray[], string& zmq_ret) {
// Format: DATA|SYMBOL|TIMEFRAME|START_DATETIME|END_DATETIME
double price_array[];
datetime time_array[];
// Get prices
int price_count = CopyClose(compArray[1],
TFMigrate(StringToInteger(compArray[2])),
StringToTime(compArray[3]),
StringToTime(compArray[4]),
price_array);
// Get timestamps
int time_count = CopyTime(compArray[1],
TFMigrate(StringToInteger(compArray[2])), //
StringToTime(compArray[3]), // datetime
StringToTime(compArray[4]), // datetime
time_array); // Array datetime
// int CopyTime(
// string symbol_name, // symbol name
// ENUM_TIMEFRAMES timeframe, // period
// datetime start_time, // start date and time
// datetime stop_time, // stop date and time
// datetime time_array[] // target array to copy open times
//);
zmq_ret = zmq_ret + "'_action': 'DATA'";
if (price_count > 0) {
zmq_ret = zmq_ret + ", '_data': {";
// Construct string of price|price|price|.. etc and send to PULL client.
for(int i = 0; i < price_count; i++ ) {
if(i == 0)
zmq_ret = zmq_ret + "'" + TimeToString(time_array[i]) + "': " + DoubleToString(price_array[i]);
else
zmq_ret = zmq_ret + ", '" + TimeToString(time_array[i]) + "': " + DoubleToString(price_array[i]);
}
zmq_ret = zmq_ret + "}";
}
else {
zmq_ret = zmq_ret + ", " + "'_response': 'NOT_AVAILABLE'";
}
}
//+------------------------------------------------------------------+
// Get historic for request datetime range
void DWX_GetHist(string& compArray[], string& zmq_ret) {
// Format: HIST|SYMBOL|TIMEFRAME|START_DATETIME|END_DATETIME
MqlRates rates_array[];
// Get prices
int rates_count = CopyRates(compArray[1],
TFMigrate(StringToInteger(compArray[2])),
StringToTime(compArray[3]),
StringToTime(compArray[4]), rates_array);
zmq_ret = zmq_ret + "'_action': 'HIST'";
// if data then forms response as json:
// {'_action: 'HIST',
// '_data':[{'time': 'YYYY:MM:DD,HH:MM:SS', 'open':0.0, 'high':0.0, 'low':0.0, 'close':0.0, 'tick_volume:0, 'spread':0, 'real_volume':0},
// {...},
// ...
// ]
// }
if (rates_count > 0) {
zmq_ret = zmq_ret + ", '_data': [";
// Construct string of rates and send to PULL client.
for(int i = 0; i < rates_count; i++ ) {
if(i == 0)
zmq_ret = zmq_ret + "{'time':'" + TimeToString(rates_array[i].time) + "', 'open':" + DoubleToString(rates_array[i].open) + ", 'high':" + DoubleToString(rates_array[i].high) + ", 'low':" + DoubleToString(rates_array[i].low) + ", 'close':" + DoubleToString(rates_array[i].close) + ", 'tick_volume':" + IntegerToString(rates_array[i].tick_volume) + ", 'spread':" + IntegerToString(rates_array[i].spread) + ", 'real_volume':" + IntegerToString(rates_array[i].real_volume) + "}";
else
zmq_ret = zmq_ret + ", {'time':'" + TimeToString(rates_array[i].time) + "', 'open':" + DoubleToString(rates_array[i].open) + ", 'high':" + DoubleToString(rates_array[i].high) + ", 'low':" + DoubleToString(rates_array[i].low) + ", 'close':" + DoubleToString(rates_array[i].close) + ", 'tick_volume':" + IntegerToString(rates_array[i].tick_volume) + ", 'spread':" + IntegerToString(rates_array[i].spread) + ", 'real_volume':" + IntegerToString(rates_array[i].real_volume) + "}";
}
zmq_ret = zmq_ret + "]";
}
// if NO data then forms response as json:
// {'_action: 'HIST',
// '_response': 'NOT_AVAILABLE'
// }
else {
zmq_ret = zmq_ret + ", " + "'_response': 'NOT_AVAILABLE'";
}
}
//+------------------------------------------------------------------+
// CLOSE ORDER (by Magic Number)
void DWX_CloseOrder_Magic(int _magic, string &zmq_ret) {
bool found = false;
zmq_ret = zmq_ret + "'_action': 'CLOSE_ALL_MAGIC'";
zmq_ret = zmq_ret + ", '_magic': " + IntegerToString(_magic);
zmq_ret = zmq_ret + ", '_responses': {";
for(int i=OrdersTotal()-1; i >= 0; i--) {
if (OrderSelect(i,SELECT_BY_POS)==true && OrderMagicNumber() == _magic) {
found = true;
zmq_ret = zmq_ret + IntegerToString(OrderTicket()) + ": {'_symbol':'" + OrderSymbol() + "'";
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
DWX_CloseAtMarket(-1, zmq_ret);
zmq_ret = zmq_ret + ", '_response': 'CLOSE_MARKET'";
if (i != 0)
zmq_ret = zmq_ret + "}, ";
else
zmq_ret = zmq_ret + "}";
} else {
zmq_ret = zmq_ret + ", '_response': 'CLOSE_PENDING'";
if (i != 0)
zmq_ret = zmq_ret + "}, ";
else
zmq_ret = zmq_ret + "}";
int tmpRet = OrderDelete(OrderTicket());
}
}
}
zmq_ret = zmq_ret + "}";
if(found == false) {
zmq_ret = zmq_ret + ", '_response': 'NOT_FOUND'";
}
else {
zmq_ret = zmq_ret + ", '_response_value': 'SUCCESS'";
}
}
//+------------------------------------------------------------------+
// Set list of instruments to get OHLC rates
void DWX_SetInstrumentList(string& compArray[], string& zmq_ret) {
zmq_ret = zmq_ret + "'_action': 'TRACK_RATES'";
// Format: TRACK_RATES|SYMBOL_1|TIMEFRAME_1|SYMBOL_2|TIMEFRAME_2|...|SYMBOL_N|TIMEFRAME_N
string result = "Tracking RATES from";
int _num_instruments = (ArraySize(compArray) - 1)/2;
if(_num_instruments > 0){
ArrayResize(Publish_Instruments, _num_instruments);
for(int s=0; s<_num_instruments; s++){
Publish_Instruments[s].setup(compArray[(2*s)+1], (ENUM_TIMEFRAMES)StringToInteger(compArray[(2*s)+2]));
result += " " + Publish_Instruments[s].name();
}
zmq_ret = zmq_ret + ", '_data': {'instrument_count':" + IntegerToString(_num_instruments) + "}";
Publish_MarketRates = true;
}
else {
Publish_MarketRates = false;
ArrayResize(Publish_Instruments, 1);
zmq_ret = zmq_ret + ", '_data': {'instrument_count': 0}";
result += " NONE";
}
Print(result);
}
//+------------------------------------------------------------------+
// Inform Client
void InformPullClient(Socket& pSocket, string message) {
ZmqMsg pushReply(StringFormat("%s", message));
pSocket.send(pushReply,true); // NON-BLOCKING
}
// Parse Zmq Message
void ParseZmqMessage(string& message, string& retArray[]) {
//Print("Parsing: " + message);
string sep = ";";
ushort u_sep = StringGetCharacter(sep,0);
int splits = StringSplit(message, u_sep, retArray);
/*
for(int i = 0; i < splits; i++) {
Print(IntegerToString(i) + ") " + retArray[i]);
}
*/
}
//+------------------------------------------------------------------+
// Generate string for Bid/Ask by symbol
string GetBidAsk(string symbol) {
MqlTick last_tick;
if(SymbolInfoTick(symbol,last_tick))
{
return(StringFormat("%f;%f", last_tick.bid, last_tick.ask));
}
// Default
return "";
}
//+------------------------------------------------------------------+
// CLOSE AT MARKET
bool DWX_CloseAtMarket(double size, string &zmq_ret) {
int error;
int retries = 3;
while(true) {
retries--;
if(retries < 0) return(false);
if(DWX_IsTradeAllowed(30, zmq_ret) == 1) {
if(DWX_ClosePartial(size, zmq_ret)) {
// trade successfuly closed
return(true);
} else {
error = GetLastError();
zmq_ret = zmq_ret + ", '_response': '" + IntegerToString(error) + "', '_response_value': '" + ErrorDescription(error) + "'";
}
}
}
return(false);
}
//+------------------------------------------------------------------+
// CLOSE PARTIAL SIZE
bool DWX_ClosePartial(double size, string &zmq_ret, int ticket = 0) {
RefreshRates();
double priceCP;
bool close_ret = False;
if(OrderType() != OP_BUY && OrderType() != OP_SELL) {
return(true);
}
if(OrderType() == OP_BUY) {
priceCP = DWX_GetBid(OrderSymbol());
} else {
priceCP = DWX_GetAsk(OrderSymbol());
}
// If the function is called directly, setup init() JSON here.
if(ticket != 0) {
zmq_ret = zmq_ret + "'_action': 'CLOSE', '_ticket': " + IntegerToString(ticket);
zmq_ret = zmq_ret + ", '_response': 'CLOSE_PARTIAL'";
}
int local_ticket = 0;
if (ticket != 0)
local_ticket = ticket;
else
local_ticket = OrderTicket();
if(size < 0.01 || size > OrderLots()) {
close_ret = OrderClose(local_ticket, OrderLots(), priceCP, MaximumSlippage);
zmq_ret = zmq_ret + ", '_close_price': " + DoubleToString(priceCP) + ", '_close_lots': " + DoubleToString(OrderLots());
return(close_ret);
} else {
close_ret = OrderClose(local_ticket, size, priceCP, MaximumSlippage);
zmq_ret = zmq_ret + ", '_close_price': " + DoubleToString(priceCP) + ", '_close_lots': " + DoubleToString(size);
return(close_ret);
}
}
//+------------------------------------------------------------------+
// CLOSE ALL ORDERS
void DWX_CloseAllOrders(string &zmq_ret) {
bool found = false;
zmq_ret = zmq_ret + "'_action': 'CLOSE_ALL'";
zmq_ret = zmq_ret + ", '_responses': {";
for(int i=OrdersTotal()-1; i >= 0; i--) {
if (OrderSelect(i,SELECT_BY_POS)==true) {
found = true;
zmq_ret = zmq_ret + IntegerToString(OrderTicket()) + ": {'_symbol':'" + OrderSymbol() + "', '_magic': " + IntegerToString(OrderMagicNumber());
if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
DWX_CloseAtMarket(-1, zmq_ret);
zmq_ret = zmq_ret + ", '_response': 'CLOSE_MARKET'";
if (i != 0)
zmq_ret = zmq_ret + "}, ";
else
zmq_ret = zmq_ret + "}";
} else {
zmq_ret = zmq_ret + ", '_response': 'CLOSE_PENDING'";
if (i != 0)
zmq_ret = zmq_ret + "}, ";
else
zmq_ret = zmq_ret + "}";
int tmpRet = OrderDelete(OrderTicket());
}
}
}
zmq_ret = zmq_ret + "}";
if(found == false) {
zmq_ret = zmq_ret + ", '_response': 'NOT_FOUND'";
}
else {
zmq_ret = zmq_ret + ", '_response_value': 'SUCCESS'";
}
}
//+------------------------------------------------------------------+
// GET OPEN ORDERS
void DWX_GetOpenOrders(string &zmq_ret) {
bool found = false;
zmq_ret = zmq_ret + "'_action': 'OPEN_TRADES'";
zmq_ret = zmq_ret + ", '_trades': {";
for(int i=OrdersTotal()-1; i>=0; i--) {
found = true;
if (OrderSelect(i,SELECT_BY_POS)==true) {
zmq_ret = zmq_ret + IntegerToString(OrderTicket()) + ": {";
zmq_ret = zmq_ret + "'_magic': " + IntegerToString(OrderMagicNumber()) + ", '_symbol': '" + OrderSymbol() + "', '_lots': " + DoubleToString(OrderLots()) + ", '_type': " + IntegerToString(OrderType()) + ", '_open_price': " + DoubleToString(OrderOpenPrice()) + ", '_open_time': '" + TimeToStr(OrderOpenTime(),TIME_DATE|TIME_SECONDS) + "', '_SL': " + DoubleToString(OrderStopLoss()) + ", '_TP': " + DoubleToString(OrderTakeProfit()) + ", '_pnl': " + DoubleToString(OrderProfit()) + ", '_comment': '" + OrderComment() + "'";
if (i != 0)
zmq_ret = zmq_ret + "}, ";
else
zmq_ret = zmq_ret + "}";
}
}
zmq_ret = zmq_ret + "}";
}
//+------------------------------------------------------------------+
// CHECK IF TRADE IS ALLOWED
int DWX_IsTradeAllowed(int MaxWaiting_sec, string &zmq_ret) {
if(!IsTradeAllowed()) {
int StartWaitingTime = (int)GetTickCount();
zmq_ret = zmq_ret + ", " + "'_response': 'TRADE_CONTEXT_BUSY'";
while(true) {
if(IsStopped()) {
zmq_ret = zmq_ret + ", " + "'_response_value': 'EA_STOPPED_BY_USER'";
return(-1);
}
int diff = (int)(GetTickCount() - StartWaitingTime);
if(diff > MaxWaiting_sec * 1000) {
zmq_ret = zmq_ret + ", '_response': 'WAIT_LIMIT_EXCEEDED', '_response_value': " + IntegerToString(MaxWaiting_sec);
return(-2);
}
// if the trade context has become free,
if(IsTradeAllowed()) {
zmq_ret = zmq_ret + ", '_response': 'TRADE_CONTEXT_NOW_FREE'";
RefreshRates();
return(1);
}
}
} else {
return(1);
}
return(1);
}
//+------------------------------------------------------------------+
string ErrorDescription(int error_code)
{
string error_string;
//----
switch(error_code)
{
//---- codes returned from trade server
case 0:
case 1: error_string="no error"; break;
case 2: error_string="common error"; break;
case 3: error_string="invalid trade parameters"; break;
case 4: error_string="trade server is busy"; break;
case 5: error_string="old version of the client terminal"; break;
case 6: error_string="no connection with trade server"; break;
case 7: error_string="not enough rights"; break;
case 8: error_string="too frequent requests"; break;
case 9: error_string="malfunctional trade operation (never returned error)"; break;
case 64: error_string="account disabled"; break;
case 65: error_string="invalid account"; break;
case 128: error_string="trade timeout"; break;
case 129: error_string="invalid price"; break;
case 130: error_string="invalid stops"; break;
case 131: error_string="invalid trade volume"; break;
case 132: error_string="market is closed"; break;
case 133: error_string="trade is disabled"; break;
case 134: error_string="not enough money"; break;
case 135: error_string="price changed"; break;
case 136: error_string="off quotes"; break;
case 137: error_string="broker is busy (never returned error)"; break;
case 138: error_string="requote"; break;
case 139: error_string="order is locked"; break;
case 140: error_string="long positions only allowed"; break;
case 141: error_string="too many requests"; break;
case 145: error_string="modification denied because order too close to market"; break;
case 146: error_string="trade context is busy"; break;
case 147: error_string="expirations are denied by broker"; break;
case 148: error_string="amount of open and pending orders has reached the limit"; break;
case 149: error_string="hedging is prohibited"; break;
case 150: error_string="prohibited by FIFO rules"; break;
//---- mql4 errors
case 4000: error_string="no error (never generated code)"; break;
case 4001: error_string="wrong function pointer"; break;
case 4002: error_string="array index is out of range"; break;
case 4003: error_string="no memory for function call stack"; break;
case 4004: error_string="recursive stack overflow"; break;
case 4005: error_string="not enough stack for parameter"; break;
case 4006: error_string="no memory for parameter string"; break;
case 4007: error_string="no memory for temp string"; break;
case 4008: error_string="not initialized string"; break;
case 4009: error_string="not initialized string in array"; break;
case 4010: error_string="no memory for array' string"; break;
case 4011: error_string="too long string"; break;
case 4012: error_string="remainder from zero divide"; break;
case 4013: error_string="zero divide"; break;
case 4014: error_string="unknown command"; break;
case 4015: error_string="wrong jump (never generated error)"; break;
case 4016: error_string="not initialized array"; break;
case 4017: error_string="dll calls are not allowed"; break;
case 4018: error_string="cannot load library"; break;
case 4019: error_string="cannot call function"; break;
case 4020: error_string="expert function calls are not allowed"; break;
case 4021: error_string="not enough memory for temp string returned from function"; break;
case 4022: error_string="system is busy (never generated error)"; break;
case 4050: error_string="invalid function parameters count"; break;
case 4051: error_string="invalid function parameter value"; break;
case 4052: error_string="string function internal error"; break;
case 4053: error_string="some array error"; break;
case 4054: error_string="incorrect series array using"; break;
case 4055: error_string="custom indicator error"; break;
case 4056: error_string="arrays are incompatible"; break;
case 4057: error_string="global variables processing error"; break;
case 4058: error_string="global variable not found"; break;
case 4059: error_string="function is not allowed in testing mode"; break;
case 4060: error_string="function is not confirmed"; break;
case 4061: error_string="send mail error"; break;
case 4062: error_string="string parameter expected"; break;
case 4063: error_string="integer parameter expected"; break;
case 4064: error_string="double parameter expected"; break;
case 4065: error_string="array as parameter expected"; break;
case 4066: error_string="requested history data in update state"; break;
case 4099: error_string="end of file"; break;
case 4100: error_string="some file error"; break;
case 4101: error_string="wrong file name"; break;
case 4102: error_string="too many opened files"; break;
case 4103: error_string="cannot open file"; break;
case 4104: error_string="incompatible access to a file"; break;
case 4105: error_string="no order selected"; break;
case 4106: error_string="unknown symbol"; break;
case 4107: error_string="invalid price parameter for trade function"; break;
case 4108: error_string="invalid ticket"; break;
case 4109: error_string="trade is not allowed in the expert properties"; break;
case 4110: error_string="longs are not allowed in the expert properties"; break;
case 4111: error_string="shorts are not allowed in the expert properties"; break;
case 4200: error_string="object is already exist"; break;
case 4201: error_string="unknown object property"; break;
case 4202: error_string="object is not exist"; break;
case 4203: error_string="unknown object type"; break;
case 4204: error_string="no object name"; break;
case 4205: error_string="object coordinates error"; break;
case 4206: error_string="no specified subwindow"; break;
default: error_string="unknown error";
}
//----
return(error_string);
}
double DWX_GetAsk(string symbol) {
if(symbol == "NULL") {
return(Ask);
} else {
return(SymbolInfoDouble(symbol,SYMBOL_ASK));
}
}
//+------------------------------------------------------------------+
double DWX_GetBid(string symbol) {
if(symbol == "NULL") {
return(Bid);
} else {
return(SymbolInfoDouble(symbol,SYMBOL_BID));
}
}
///////////////////// Até aqui está ok
Some times you may observe 4014 error messages in SQL Server errorlog, like below
Error: 4014, Severity:20, State: 11.
A fatal error occurred while reading the input stream from the network. The session will be terminated
To continue analyze it, we should firstly know which is the issue client servers, and we can schedule to run below script during the issue most frequent time:
;WITH RingBufferConnectivity as
( SELECT
records.record.value(‘(/Record/@id)[1]’, ‘int’) AS [RecordID],
records.record.value(‘(/Record/ConnectivityTraceRecord/RecordType)[1]’, ‘varchar(max)’) AS [RecordType],
records.record.value(‘(/Record/ConnectivityTraceRecord/RecordTime)[1]’, ‘datetime’) AS [RecordTime],
records.record.value(‘(/Record/ConnectivityTraceRecord/SniConsumerError)[1]’, ‘int’) AS [Error],
records.record.value(‘(/Record/ConnectivityTraceRecord/State)[1]’, ‘int’) AS [State],
records.record.value(‘(/Record/ConnectivityTraceRecord/Spid)[1]’, ‘int’) AS [Spid],
records.record.value(‘(/Record/ConnectivityTraceRecord/RemoteHost)[1]’, ‘varchar(max)’) AS [RemoteHost],
records.record.value(‘(/Record/ConnectivityTraceRecord/RemotePort)[1]’, ‘varchar(max)’) AS [RemotePort],
records.record.value(‘(/Record/ConnectivityTraceRecord/LocalHost)[1]’, ‘varchar(max)’) AS [LocalHost]
FROM
( SELECT CAST(record as xml) AS record_data
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type= ‘RING_BUFFER_CONNECTIVITY’
) TabA
CROSS APPLY record_data.nodes(‘//Record’) AS records (record)
)
SELECT RBC.*, m.text
FROM RingBufferConnectivity RBC
LEFT JOIN sys.messages M ON
RBC.Error = M.message_id AND M.language_id = 1033
WHERE RBC.RecordType=’Error’ and RBC.Error=4014
ORDER BY RBC.RecordTime DESC
Check the column of ‘RemoteHost’ and find one of the most frequent IP, and you will need to collect network monitor between the server and SQL Server.
See below analysis sample of network trace:
Client sent 8000 bytes data:
123.45.0.789 789.123.0.45 TDS TDS:Continuous BulkLoadBCP, Version = Undefined TDS version(0x74000004), SPID = 0, PacketID = 4, Flags=…AP…, SrcPort=54541, DstPort=52343, PayloadLen=8000, Seq=1077286218 — 1077294218, Ack=3825055476, Win=262656
The packets was large so it was divided, but server only received 1460*5=7300 bytes of data, so it lost 700 bytes of data
123.45.0.789 789.123.0.45 TDS TDS:Continuous BulkLoadBCP, Version = Undefined TDS version(0x74000004), SPID = 0, PacketID = 4, Flags=…A…., SrcPort=54541, DstPort=52343, PayloadLen=1460, Seq=1077286218 — 1077287678, Ack=3825055476, Win=262656
123.45.0.789 789.123.0.45 TCP TCP:[Continuation to #96]Flags=…A…., SrcPort=54541, DstPort=52343, PayloadLen=1460, Seq=1077287678 — 1077289138, Ack=3825055476, Win=1026 (scale factor 0x8) = 262656
123.45.0.789 789.123.0.45 TCP TCP:[Continuation to #96]Flags=…A…., SrcPort=54541, DstPort=52343, PayloadLen=1460, Seq=1077289138 — 1077290598, Ack=3825055476, Win=1026 (scale factor 0x8) = 262656
123.45.0.789 789.123.0.45 TCP TCP:[Continuation to #96]Flags=…A…., SrcPort=54541, DstPort=52343, PayloadLen=1460, Seq=1077290598 — 1077292058, Ack=3825055476, Win=1026 (scale factor 0x8) = 262656
123.45.0.789 789.123.0.45 TCP TCP:[Continuation to #96]Flags=…A…., SrcPort=54541, DstPort=52343, PayloadLen=1460, Seq=1077292058 — 1077293518, Ack=3825055476, Win=1026 (scale factor 0x8) = 262656
Then the server reset the communication:
123.45.0.789 789.123.0.45 TCP TCP:Flags=…..R.., SrcPort=52343, DstPort=54541, PayloadLen=0, Seq=3825055476, Ack=1077293518, Win=0
So generally speaking, it was when the network tried to sperate a large packets, it lost one of them, it can be caused by TCPChimney offloading or other network communication issues, you need engage your network team to continue check where was the packet lost.