Обновление платформы MetaTrader 4 build 670: виртуальный хостинг, web-запросы и работа с сигналами из MQL-программ - страница 41

 
_Konstantin_:
Это я знаю, а какими функциями MQL4 можно еще вытащить список ордеров и истории ордеров не обращаясь при этом к серверу?

Ни одна из функций, работающая со списком ордеров, не осуществляет запрос данных с сервера. Поэтому суть вопроса неясна - для чего еще какие-то функции?
 
Несколько раз сталкивался с проблемой невозможности нормального закрытия МТ4.
Файл -> Выход , он зависает секунд на 10-15, а затем возвращается в исходное состояние.
Кликанье мышкой на "Х" в правом верхнем углу тоже не помогает.
Если же убить процесс через Диспетчер Задач то вся информация в открытых окнах будет потеряна.
 
Scriptong:


С какой целью на каждом тике необходимо производить несколько расчетов списка ордеров? Вполне достаточно ограничиться одним расчетом на тик. Более того, для оптимизации и тестирования можно сделать алгоритмическую вилку, сократив потребности до минимума. 

В том то и дело, что я как раз и не хочу делать по несколько раз на одном тике эти процедуры т.к. получится слишком накладно.

Напиши про алгоритмическую вилку поподробнее, или ссылку скинь если не сложно.

 
Scriptong:

Ни одна из функций, работающая со списком ордеров, не осуществляет запрос данных с сервера. Поэтому суть вопроса неясна - для чего еще какие-то функции?
Я похоже что то упустил в программировании MQL4, напишите функции MQL4 которые работают со списком ордеров, что бы эти функции не имели обращения к серверу за историей ордеров.
 
Scriptong:

Ни одна из функций, работающая со списком ордеров, не осуществляет запрос данных с сервера. Поэтому суть вопроса неясна - для чего еще какие-то функции?

Значит история сделок хранится на компьютере клиента? И где же?
 
_Konstantin_:
Я похоже что то упустил в программировании MQL4, напишите функции MQL4 которые работают со списком ордеров, что бы эти функции не имели обращения к серверу за историей ордеров.

Все, которые перечислены здесь, кроме: OrderClose, OrderCloseBy, OrderSend, OrderDelete, OrderModify, OrderSend.
 
_Konstantin_:

В том то и дело, что я как раз и не хочу делать по несколько раз на одном тике эти процедуры т.к. получится слишком накладно.

Имеем два массива:

1. ordersStatePrev - предыдущее состояние ордеров.

2. orderStateCurrent - текущее состояние ордеров.

Пришел тик. Совершаем:

1. Обновление массива текущего состояния ордеров.

2. Сравнение текущего и предыдущего состояний.

3. Выполнение  действий в результате выявленных закрытий/открытий ордеров.

4.  ordersStatePrev = orderStateCurrent.

При правильном подходе к архитектуре программы действия 1 - 4 совершаются только 1 раз на один тик. 

 

 Напиши про алгоритмическую вилку поподробнее, или ссылку скинь если не сложно.

Здесь также ничего нового (to Admin: НЕ РАБОТАЕТ ВСТАВКА КОДА):

if (!IsTesting() && !IsOptimization())

{

   // действия, которые нужно совершать только онлайн. В тестере или оптимизаторе нет других программ и трейдера 

 
evillive:

Значит история сделок хранится на компьютере клиента? И где же?


В оперативной памяти, которая занята процессом MT4. Не файлах, если Вы об этом.

МТ4, независимо от того, нужна трейдеру/программе информация по ордерам или нет, получает эти данные с сервера на каждом тике соответствующего символа. То есть эта информация всегда есть и всегда актуальна (при наличии связи). Эксперт/индикатор запрашивает ее у терминала, а терминал отдает то, что у него уже есть. Лишний запрос на сервер здесь не требуется.

 
Scriptong:

Имеем два массива:

1. ordersStatePrev - предыдущее состояние ордеров.

2. orderStateCurrent - текущее состояние ордеров.

Пришел тик. Совершаем:

1. Обновление массива текущего состояния ордеров.

2. Сравнение текущего и предыдущего состояний.

3. Выполнение  действий в результате выявленных закрытий/открытий ордеров.

4.  ordersStatePrev = orderStateCurrent.

При правильном подходе к архитектуре программы действия 1 - 4 совершаются только 1 раз на один тик. 

 

Здесь также ничего нового (to Admin: НЕ РАБОТАЕТ ВСТАВКА КОДА):

if (!IsTesting() && !IsOptimization())

{

   // действия, которые нужно совершать только онлайн. В тестере или оптимизаторе нет других программ и трейдера 

На счет информации хранимой в терминале и запрашиваемой на сервере на каждом тике не знал, спасибо за инфу, буду учитывать в дальнейшем. Считал, что данную информацию программа сама запрашивает на сервере по запросу соответствующими функциями MQL4. Хотя еще остались подозрения на этот счет, нужно будет замерить скорость запроса.

На счет учета ордеров. У меня все то же самое только не с массивами, а со списком (класс CList), отличие от массивного учета в том, что в случае необходимости (появился новый ордер, либо удалился ордер и т.д.) для массива снова нужно освободить память (старый массив), распределить по новой память для нового массива. Для списка (появился новый ордер, либо удалился ордер и т.д.) удалять список не требуется - удаляется либо добавляется элемент списка, не зависимо где он находится (местоположение по отношению к другим элементам списка), т.к. список является связным списком указателей на элементы. Единственное чем список хуже массива - нет адресного доступа, в списке к любому элементу списка доступ осуществляется через последовательный перебор по порядку элементов списка (с начала или конца). Но для учета ордеров это не актуально, т.к. открывать несколько тысяч ордеров ни кто не будет :)

Вопрос возник по поводу события, которое происходит до начала следующего тика, т.е.:

1. Проверили состояние списка на начале тика

2. До окончания тика происходят различные вычисления, в это время происходит закрытие ордера по S/L и (или) T/P, идут дальнейшие вычисления. А т.к. вычисления происходят на основе списка ордеров, то происходит обращение к фактически не существующему элементу списка и получаем ошибку неправильного указателя.

3. На следующем тике происходит п.1 и все нормализуется.

Логика программы в принципе не нарушается, однако раздражает красная ошибочка invalid pointer CList...

Вот из-за этого и возник мой вопрос. Единственный выход пока вижу в отслеживании состояния цены по отношению к уровням S/L и (или) T/P и в случае прохода уровня делать принудительно операцию из п.1

 
_Konstantin_:

2. До окончания тика происходят различные вычисления, в это время происходит закрытие ордера по S/L и (или) T/P, идут дальнейшие вычисления. А т.к. вычисления происходят на основе списка ордеров, то происходит обращение к фактически не существующему элементу списка и получаем ошибку неправильного указателя.

Почему указатель то неправильный? Список должен содержать информацию, независимо от того, в каком состоянии ордер. Другое дело, что при выборе ордера, на который указывает элемент списка (нужно хранить, как минимум, тикет ордера), окажется, что такой ордер уже закрыт. В этом случае, конечно, нужно обновить список ордеров (означает, что советник за время вычислений пропустил один или несколько тиков) и повторить расчет (если итог вычислений зависит от списка открытых ордеров). При этом следует учитывать:

1. Подобная ситуация может возникнуть только при работе онлайн. В тестере или оптимизаторе следующий тик не придет, пока обрабатывается текущий тик. А значит в тестере не возникнет ситуация, когда вычисления за один тик будут произведены более одного раза.

2. Закрытие ордеров по профиту/стопу/рынку это не настолько частая операция, чтобы она повторялась почти на каждом тике. По сравнению с количеством тиков такие события едва составят долю в 10% (и то, если это HFT-торговля, а при обычной спокойной торговле это десятые доли процента). Таким образом, уменьшение производительности терминала Вы вряд ли заметите.

Причина обращения: