22. Доработки по индикаторам. Какой вообще смысл в OnChangeSettings? В МТ5 просто перегружают индикатор с новыми настройками. В Квике тоже нужен перегруз индикатора и Init() всегда вернет нужное количество линий. Перегруз для связанного графика уже есть.
Нужны Settings.hideline, чтобы пользователь не мог изменить им параметры. Вот пример модифицированного индикатора: когда пользователь задает количество линий Settings.Count и параметры только для первой, но применяются параметры для всех остальных линий.
Код
Settings = {
Name = "Levels_TEST",
Step = 50,
Count = 10,
IsBoolean = false, -- БАГ: В настройках этот тип не меняется!
line = {}, -- БАГ: без этой строки индикатор не появляется в списке!
hideline = {}, -- В настройках не отображаются
}
Settings.line = {
{
Name = "Line1",
Type = TYPE_POINT,
Color = RGB(55, 55, 55),
Width = 2
}
}
function Init()
-- Можно вынести этот код за Init() и результат будет тот же.
LINES = Settings.Count
Settings.hideline = {} -- сброс, чтобы актуальные параметры сгенерировать
for x = 2, LINES, 1 do
Settings.hideline[x] = { -- LineERROR: здесь line[x] было (ошибка ниже)
Name = "Line" .. tostring(x),
Type = Settings.line[1].Type,
Color = Settings.line[1].Color,
Width = Settings.line[1].Width
}
end
LINES = #Settings.line + #Settings.hideline
-- А какой смысл возвращать другое значение?
-- В МТ5 тут статус Инит, который может быть ошибкой.
-- Но, количество линий? Где логика?
-- Если превысить, то добавятся линии с случайным цветом...
return LINES
end
function OnChangeSettings()
-- Юзер сменил Settings.Count ?
Init()
-- Function OnChangeSettings: LineERROR: attempt to index a nil value (field 'line')
-- ИЗМЕНЕНИЙ НЕТ! Линии не добавились и не покрасились.
-- Очередная наспех сделанная кривая функция...
end
function OnCalculate(index)
local start = O(index)
if start == nil then
return nil
end
if MINSTEP == nil then
local info = getDataSourceInfo()
MINSTEP = getSecurityInfo(info.class_code, info.sec_code).min_price_step
FIRST = (math.tointeger(LINES / 2) + 1) * Settings.Step * MINSTEP
end
local result = {}
start = start - ((math.tointeger(math.ceil(start / MINSTEP)) % Settings.Step) * MINSTEP) + FIRST
for x = 1, LINES, 1 do
table.insert(result, start - (x * Settings.Step * MINSTEP))
end
return table.unpack(result)
end
---@class roffild
---@field ISTRADINGALLOWED_SECONDS number Секунд в ожидании обезличиной сделки (по умолчанию = 3)
local roffild = {
ISTRADINGALLOWED_SECONDS = 3,
}
---`isConnected() == 1` ещё ДО ввода PIN при Двухфакторной аутентификации.
---Обход бага через `getInfoParam("LASTRECORDTIME")`.
---@param seconds? number Секунд для ожидания (по умолчанию = 3 = `ISTRADINGALLOWED_SECONDS`)
---@return boolean
function roffild.isTradingAllowed(seconds)
if isConnected() == 1 then
local lastrecordtime = getInfoParam("LASTRECORDTIME")
local servertime = getInfoParam("SERVERTIME") -- время с часовым поясом сервера (секунды локальные)
if
not (lastrecordtime == nil or lastrecordtime == "")
and not (servertime == nil or servertime == "")
then
-- convertDateOrTimeToUnix из-за ":" не работает
local fixlastrecordtime = os.sysdate()
fixlastrecordtime.hour = tonumber(string.sub(lastrecordtime, 0, -7))
fixlastrecordtime.min = tonumber(string.sub(lastrecordtime, -5, -4))
fixlastrecordtime.sec = tonumber(string.sub(lastrecordtime, -2))
if -- clearing
fixlastrecordtime.hour < 7
or (fixlastrecordtime.hour == 14 and fixlastrecordtime.min < 5)
or (fixlastrecordtime.hour == 18 and fixlastrecordtime.min >= 45)
or (fixlastrecordtime.hour == 19 and fixlastrecordtime.min < 5)
or (fixlastrecordtime.hour == 23 and fixlastrecordtime.min >= 50)
then
return false
end
local fixservertime = os.sysdate()
fixservertime.hour = tonumber(string.sub(servertime, 0, -7))
fixservertime.min = tonumber(string.sub(servertime, -5, -4))
fixservertime.sec = tonumber(string.sub(servertime, -2))
return (math.abs(os.time(fixservertime) - os.time(fixlastrecordtime)) <=
(seconds or roffild.ISTRADINGALLOWED_SECONDS))
end
end
return false
end
return roffild
Ееееееее!.. Я смог создать 100% определитель статуса глобальной торговли! Функция прошла проверки Двухфакторной аутентификации, выходного дня, смены часового пояса и clearing. Эту функцию ДОЛЖНЫ создать программисты Квика, а не заставлять искать хаки в их тв...
21. Попытался обойти баг isConnected()==1 через OnAllTrade(). Щаз! Это же кривой QLua! OnAllTrade() НЕ вызывается, если "Таблица обезличенных сделок" НЕ открыта. И если ТОЗ случайно закрыть, то OnAllTrade() НЕ вызывается. Квику пофиг даже на галку в Настройках. QLua не может даже о статусе ТОЗ сообщить.
Код
---@class roffild
---@field LAST_TIME_ANONYMIZED_DEAL qluaDateTime Время последней обезличенной сделки
---@field ISTRADINGALLOWED_SECONDS number Секунд в ожидании обезличиной сделки (по умолчанию = 3)
local roffild = {
LAST_TIME_ANONYMIZED_DEAL = os.sysdate(),
ISTRADINGALLOWED_SECONDS = 3,
}
roffild.LAST_TIME_ANONYMIZED_DEAL.hour = 0 -- для начальной разницы времени
---Функция должна вызываться в `OnAllTrade()`, когда она переопределена.
function roffild.OnAllTrade(alltrade)
---@type qluaDateTime
roffild.LAST_TIME_ANONYMIZED_DEAL = alltrade.datetime
end
function OnAllTrade(alltrade)
roffild.OnAllTrade(alltrade)
end
---`isConnected() == 1` ещё ДО ввода PIN при Двухфакторной аутентификации. Обход бага через `OnAllTrade()`. \
--- \
---**ЗАВИСИТ от интенсивности "Таблица обезличенных сделок".**
---@param seconds? number Секунд в ожидании обезличиной сделки (по умолчанию = 3 = `ISTRADINGALLOWED_SECONDS`)
---@return boolean
function roffild.isTradingAllowed(seconds)
return (isConnected() == 1
and (os.time(os.sysdate()) - os.time(roffild.LAST_TIME_ANONYMIZED_DEAL)) <= (seconds or roffild.ISTRADINGALLOWED_SECONDS))
end
Владимир, спасибо, что поделился с нами своей гопно-туалетной философией окружающего нас токсичного мира. Я больше не стану тебя отвлекать от миссии очищения этого форума. Да, обойдет бан тебя стороной в этом опасном деле...
Владимир, и много уже спустил? Если не спускать "поучения", которые тебя даже не касаются, то жизнь теряет смысл? И можно при спуске не стать "распальцованным дураком", как они? И как это распознать?
Владимир написал: Roffild, Лапуль, кода своего я здесь приводил НЕМЕРЯНО! И кода РАБОТАЮЩЕГО, без скулежа про "плохие и непродуманные API". Покопайтесь в моих сообщениях, коль неймётся. И в третий раз повторяю: "В кодах скулящих по любому вопросу неучей я ковыряться не намерен". Сколько раз повторить, чтобы дошло?
Ну, не повторяй... Я вообще не понимаю, что тролль забыл в этой теме...
Владимир написал: Roffild, Лапуль, я с раннего детства не перевариваю распальцованных дураков. Повторяю для особо одарённых: в кодах скулящих по любому вопросу неучей я ковыряться не намерен. А "гениальное решение", лапуль, надо УМЕТЬ видеть - бездарности способны разве что смотреть, как баран на новые ворота.
Нельзя увидеть, чего нет. Покажи! Или ты даже тот код не осилил? Ах, да "в кодах скулящих по любому вопросу неучей я ковыряться не намерен"... не программист ты.
Цитата настоящего программиста: "Хватит болтать! Покажи мне код!"
Владимир написал: Roffild, Тролля в зеркале поищите. Заняться мне больше нечем, кроме как в коде очередного скулящего ковыряться. А свои проблемы со скриптом я давно решил. Все до единой.
На троллинг время ты же нашел, а на код уже нет?
Эх... быстро же слился тролль... а я уже приготовился гениальное решение проблемы увидеть.
Владимир написал: Roffild, Да неплохо бы и поучить Вас программировать. Программисты спокойно работают с любым "плохим и непродуманным API", а не скулят здесь по каждому чиху, да учат, как надо его улучшать по их доморощенным представлениям.
О, тролль проснулся... ну... давай, покажи класс! Как нужно изменить код выше?
В случае двухфакторной аутентификации сначала происходит соединение с сервером (после чего isConnected начинает возвращать 1), а потом сервер инициирует запрос у терминала второго фактора, при этом терминал не знает в момент соединения (да и не должен из соображения безопасности знать), будет ли у него запрашиваться второй фактор, или же нет.
Терминал ДОЛЖЕН знать, что будет второй фактор, потому что это еще СТАДИЯ ПОДКЛЮЧЕНИЯ. Инфа о том, что будет второй фактор или нет, не является секретной, потому что второй фактор ИДЕТ ПО УМОЛЧАНИЮ. Вообщем, кто-то накосячил с статусом второго фактора, а вместо фикса получаем бред про безопасность.
QLua - часть QUIK, а не совершенно левая абстракция. Поэтому довод про безопасность Квика внутри самого Квика... Вы баги исправляйте, а не сценарии для Нолана сочиняйте.
Цитата
В качестве выхода из ситуация мы рекомендуем писать Lua-скрипт так... Правильно Вас понимаем, что Вы хотите повысить приоритет пожелания, потому что Ваш бот анализирует таблицу "Состояние счёта", а не таблицу сделок ?
Э... похоже программисты для ARQA Technologies - это как Дотеры для остальных...
Программисты работают с API, которое вы им предоставляете. Хватит учить меня программировать! Когда плохое и непродуманное API, то надо его улучшать, а не "мы рекомендуем писать Lua-скрипт так".
Код
-- Закрытие по stoploss реальных позиций.
for k, v in pairs(getTable("futures_client_holding")) do
k = nil
if v.totalnet == nil or v.totalnet == 0 then
-- continues --
else
k = initSymbol(v.sec_code)
end
if k then
open = v.avrposnprice
for k1, v1 in pairs(getDeals(1, nil, nil, v.sec_code, nil, v.trdaccid)) do
-- В futures_client_holding нет реальной цены последней сделки
open = v1.price
-- БАГ: Только вот из-за рассихрона таблиц, в Сделках цена тоже может быть НЕ ПОСЛЕДНЯЯ!
end
LASTTRANS = nil
if v.totalnet > 0 then
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "BID").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close <= (open - k.stoploss) then
log:write("buy close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
true, close - k.depth, math.abs(v.totalnet)))
end
else
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "OFFER").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close >= (open + k.stoploss) then
log:write("sell close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
false, close + k.depth, math.abs(v.totalnet)))
end
end
if waitTrans(LASTTRANS) then
goto continues
end
end
end
Как уже было описано выше, пожелание на добавление данного функционала уже было зарегистрировано от Вас.
В БагТрекере можно редактировать детали. А поскольку 15 пункт из косметического превратился, в невозможность найти актуальную цену для стоп-лося... пора бы "редактировать детали" и повысить приоритет.
Хотя бы ссылку на тему в БагТрекере указываете? А то это похоже на игру "Сломанный форум" с программистами Квика...
15. Таблица futures_client_holding не имеет цену последней сделки, да ещё обновляется раньше trades(сделки)! ппц... бот закрывает текущую сделку, но на основании ПРЕДЫДУЩЕЙ сделки. Таблица futures_client_holding должна иметь цену последней сделки. И futures_client_holding - это "Состояние счета", поэтому 15 пункт.
Цитата
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.
Anton написал: Таки я посмотрел. В PythonDLL в additional dependencies ожидалось бы увидеть notelemetry.obj, чисто для феньшую. Ну хотя бы в релизном конфиге.
PythonDLL для MQL5 - интересный проект. Пока пытался добавить makemoney.obj, пофиксил PyTorch и *Boost и др. EURUSD выбесил окончательно. Никто правок не предложил.
Биржа после Форекса более предсказуема. Но QLUA - это наспех прикрученная функциональность, а не полноценная система с продуманным API. Между сервером и QLUA нет полноценного торгового контроля.
s_mike@rambler.ru написал: Это принципиальная невозможность написать такую функцию, которая бы гарантировала правильность результата.
если вам мало приведенной выше причины, по которой это невозможно, существует ещё много причин, по которым это невозможно. В частности, проверка соединения при помощи isconnected() даёт вам информацию о наличии в данный момент времени соединения с сервером брокера, но ничего не рассказывает о доступности и статусах шлюзах к разным торговым площадкам.
Я "невозможных" задач не ставлю, потому что примерно представляю, как это реализовать. Сервер Квика уже сейчас знает, что биржа ушла на клиринг, выходные, дисконнект и т.п. - вот и пусть сообщит скрипту.
Да, и слово "гарантия" смешно к халтурному QLUA... Конечно, продукт не массовый, но от ПО для биржи с её лиардами хотелось бы большей продуманности...
Кроме этого существуют горячие клавиши, которые используются системой и не могут быть изменены, например, Alt+F4 (закрытие окна) или Ctrl+F6 (переключение между окнами).
Alt+F4 действительно нужно ловить особым способом, как и CTRL+ALT+DEL. Все остальные комбинации без проблем обрабатываются стандартным методом:
Да и Ctrl+F6 не "переключает между окнами" в Винде - это уже фантазии ваших программистов.
Цитата
Касательно пункта 10. Терминал не даст возможность торговать до подключения. Выйдет соответствующее сообщение "Not connected" в окне сообщений (См. скриншот 1).
Это после isConnected()==1, но до "Двухфакторная аутентификация прошла успешно"? 100% баг!
Цитата
Касательно пункта 15. Могли бы уточнить, для чего Вам необходимо видеть в таблице "Состояние счёта" цену Вашей последней сделки, если её можно увидеть в таблице сделок ?
То есть, вместо дополнительно столбика мне предлагаете: еще одно мало информативное окно втиснуть между 10? Гениально! У вас для расчета "Баланса" уже инфа по сделкам получается вообще-то - просто в отдельный столбец последнюю сделку закинте.
Цитата
Касательно пункта 17. Правильно понимаем, Вы хотите, чтобы при выборе шаблона на графике удалялись метки, рисунки и тд., а также все настройки с индикаторами восстанавливались с нуля ?
ДА!!! В MetaTrader так и сделали уже 20 лет назад... И в МТ5 используется формат INI для всех настроек, что позволяет точнее подобрать размеры графовых окон.
P.S. А тут программисты Квика появляются, и только "операторы из Ростелекома"???
[QUOTE=Sfinexer]Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?Есть такой баг: фильтры после снятия якоря не восстанавливаются.
17. Шаблоны для графиков только цвета меняют. Шаблон должен график очистить и все настройки с индикаторами восстановить с 0. В МТ5 это нормально сделано, а в Квик - бред какой-то.
10. Странный isConnected() получается. Сейчас глянул в лог: 9:10:39 Соединение установлено 9:10:40 Введите PIN 9:10:43 MyLua started (isConnected() == 1) 9:12:35 Двухфакторная аутентификация прошла успешно
Если бы MyLua начал торговать до PIN, то словил ошибки...
2. Якоря нет у стоп-заявок и сделок. Логика, как у обычных заявок. Связь, вроде, по инструменту. Простой копи-паст. Может еще есть таблицы с Инструментами, но нет якоря...
3. И Lua-таблицу можно по инструменту связать... Специальная колонка заполняется соответствующими данными - вот и связь.
4. Кстати, в окне "параметров индикатора" нет выбора для Lua-значений false/true и пришлось заменить на число.
5. В окне Lua-скриптов под "Остановить" добавить галку "Перезапуск после ошибки" - "Автоматический перезапуск скрипта через 30сек после завершения из-за ошибки."
7. Нужна панель с индикаторами запущенных скриптов. Зеленый квадрат с числом - количество запущенных скриптов. Красный квадрат с числом - количество остановленных скриптов. По панельки можно будет определить: упал скрипт по ошибке или пашет.
8. Из-за невозможности поставить галку "Рыночная" пробелом, пришлось искать "Смена операции клавишей Пробел". Топорно сделано. Лучше нейтральные PgUp/PgDown (правая рука) и ~ (левая рука) под это пустить. Можно в качестве дополнительной возможности - будет из чего выбрать.
9. Возвращаемое значение из OnCalculate() должно быть table. Ну, да... чё-то где-то про table.unpack() проскакивало... Но можно заставить QUIK обрабатывать оба варианта возврата, а не напоминать о костыле Lua. На примере из 1 поста я показал, что это возможно. Языки с динамическими типами заставляют все варианты обрабатывать.
10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше. А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".
11. Настройка умного заказа данных включена. Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. И getParamEx() вернет 0 или старое значение. Проблема именно с переключением галки "Запрашивать данные раз в … сек.". Я эту галку сначала снял, потому что неправильно понял описание, и долго не понимал, почему 0 возвращается.
12. Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов, вылезает за лимит и не отправляет заявку на сервер. По стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает. Пример: Депо=1000р (чтоб впритык было) VBZ1=5500 с ГО=820р Если заявить на покупку 1 VBZ1 по 5520(5500+20), то все исполнится. Если заявить на покупку 1 VBZ1 по "Рыночной"(5500+500=6000), то "Нехватка средств по лимитам клиента." == "нет денег на ГО".
13. Добавьте "Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется)." в доку sendTransaction(), а то на форуме запутались с уникальностью TRANS_ID. Еще большую неразбериху с TRANS_ID вносит запрет, что он обязателен для Lua-скрипта. Можно снять этот запрет.
10. А теперь с OnTransReply(): С сентября у Сбербанка начались проблемы с соединением. Паровозик раньше ехал стабильно, а сейчас часто стоит. Дисконнекты участились. И как в таких условиях ждать OnTransReply()? Надежнее мониторить таблицу заявок для 100% статуса. И если заявка уже принята сервером, то логично ожидать с номером 0 (означает, что до МБ не добралась) даже после дисконнекта. Такие заявки должны хранится сервером не более часа. По таким заявкам проще сделать цикл ожидания. А еще из-за особенности поточности Lua-скриптов, событийная модель - ненадежное решение. sendTransactionSync() должно решить проблему Lua-программистов, но решать заморочки с плохим соединением придется уже вам.
Эх... вспомню форумную молодость и покормлю тролля
Цитата
Владимира ;) [QUOTE]Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера.
Мне влом разделять тему на две.
Цитата
И нафига Вам isConnected? В жизни ни разу не проверял![QUOTE]Антоха? Ни единого разрыва! :D
[QUOTE]А Unicode на кой? [QUOTE]Современный стандарт IDE.
[QUOTE]Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Отличать заявки первого скрипта от второго или для дополнительной информации.
Баги QUIK 8.13: * Нет хоткея для показа Lua-скриптов. * У окна стоп-заявок нет якоря, хотя у обычных заявок он есть. * Сделки тоже без якоря. * Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. * Забавно, но "Смена операции клавишей Пробел" не позволяет пробелом ставить галку, например, "Рыночная". * Нужна панель с индикаторами (с значками) запущенных скриптов. * Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов и вылезает за лимит без отправки заявки на сервер, когда по стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает.
Код
Ошибка создания заявки. [GW][332] "Нехватка средств по лимитам клиента.".
* "Ошибку создания заявки" sendTransaction() не возвращает, как ошибку. Да, эту ошибку нельзя заблокировать! В заявках тоже пусто! Только OnTransReply() её ловит на позднем этапе. Вообще все транзакции с статусом==4 можно через sendTransaction() вернуть, а не беспокоить пользователя. Ну превысил в скрипте QTY... ну, верните ошибку скрипту! Юзер тут причем?
* Нужна sendTransactionSync() с гарантированным возвратом последнего trans_reply: - ошибка (БЕЗ ПОКАЗА ОШИБКИ ЮЗЕРУ) - заявка в очереди (PUT_IN_QUEUE) - заявка исполнена или отклонена (FILL_OR_KILL и KILL_BALANCE)
* isConnected() == nil возможно! Похоже это происходит когда QUIK при запуске сразу стартует Lua-скрипт, но функция isConnected() еще не прошла иницилизацию. Я не вижу другого объяснения, почему этот цикл иногда при старте не срабатывает:
Код
function main()
ISRUN = true
while ISRUN and isConnected() == 0 do
sleep(1000)
end
-- код
end
* Нужна галка на авто-перезапуск скрипта, потому при неожиданном разрыве некоторые функции могут вернуть nil и убить скрипт. В Lua нет try-catch. Например:
Код
local minstep = getSecurityInfo("SPBFUT", sec_code).min_price_step
* В 2021г без Unicode?! Сам Unicode по BOM определяется. И давно уже научились отличать Win-1251 от UTF-8. Сам файл можно в любой кодировки читать, а компилировать в Win-1251, если это так важно.
* Возвращаемое значение из OnCalculate() должно быть table, а сейчас такой бред:
Код
function OnCalculate(index)
-- код
return r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15],r[16],r[17],r[18],r[19],r[20],r[21],r[22],r[23]
end
А вот такой код обрабатывает оба варианта возврата:
Код
function OnCalculate(index)
local result
result = {7, 9}
return result[1], result[2], result
end
function main()
str = "R: "
for k, v in pairs({OnCalculate()}) do
if type(v) == "table" then
for k0, v0 in pairs(v) do
str = str.." tbl "..tostring(k0).."="..tostring(v0)
end
else
str = str.." "..tostring(k).."="..tostring(v)
end
end
message(str)
end
И хватит распространять миф об уникальности TRANS_ID. Он почему-то должен быть объявлен, хотя Таблица Заявок утверждает, что nil тоже норм. А уникальным он точно может не быть - просто дополнительное число для фильтрации заявок. Описание в MQL5 аналогичного параметра:
Код
Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный идентификатор при отправке торгового запроса