Можно ли обойтись без цикла подсчета / пересчета ордеров имея оригинальные тикеты ордеров? - страница 3

 

Не пинайте сильно, но я, честное слово, не понимаю "проблему"...

Есть ордер, у него есть тикет, этот тикет передаётся сделке и позиции. Есть ещё ID. 

Мне кажется, что это уже проблема разработчиков ввести функцию, например, StateOrder(ticket) = 

STATE_ORDER_STOP(BUY/SELL)
STATE_ORDER_LIMIT(BUY/SELL)
STATE_ORDER_MARCKET(BUY/SELL)
STATE_ORDER_CLOSED (лимитник не сработал и удалён)
STATE_ORDER_HISTORY(BUY/SELL)

Или чтобы возвращалась структура о состоянии ордера/сделки/позиции по указанному тикету....

 
Igor Makanu:

при выборе по тикету, значение MODE_TRADES / MODE_HISTORY не учитывается https://docs.mql4.com/ru/trading/orderselect

То бишь труу будет всегда? Грусть, что нет запроса или поля в структуре ордера, исторический он или нет. Либо логика времени закрытия больше нуля... Доки грусть просто....

 
Vladimir Simakov:

Ты работаешь с контекстом, который был при последнем вызове OrderSelect,

Не понял, структура выбранного ордера при изменении состояния параметров ордера не изменяется? нужен повторный OrderSelect? Хе Хе ... все для людей))))

С учетом повторного селект сравнение количества исторических и маркетных ордеров актуально.... экономия не всегда хороша видимо... либо пока не до понимаю логику разрабов.
 
Igor Makanu:

разница есть, но только на операторы new и delete https://www.mql5.com/ru/forum/222141/page20#comment_13519247

но тут вопрос тогда в логике программы - если на одном тике по пару сотен тысяч раз создавать обьекты и удалять при выходе из OnTick() - с обьектами беда будет

ЗЫ:

я ж пишу, уровень у нас не тот, нам бы логики написания производительных программ пару мешков в довесок, но ввиду неимения оной - грешим на производительность .... даже не знаю, и терминала не хватает и ПК слабоваты, в общем как пословица про плохого танцора которому ...

)))

Смотри. Местный класс (я сейчас про mql5, так как глянул только что)- это тот же класс, что и в плюсах, только неявно 16 байт вначале добавлено, да и по умолчанию выравнивание на 1 байт, что аналогично #pragma pack(push,1) в плюсах. Из этих 16-ти байт - первые 4 - это хэндл класса, остальные не знаю, не щупал (да и смысла нет, так как поменять могут в любой момент, вещь абсолютно не стандартизированная), но вот для чего эти байты -вполне понятно. Одна из возможных реализаций: есть некий контейнер, в котором хранятся указатели на объекты, а хэндл класса - это информация для получения сырого указателя из него, по крайней мере шаг 0х10 там четко прослеживается. Это то, что с первого взгляда видно.

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

PS. Для модераторов и админов: ничего не ломал, все подсмотрено так:

MQLLIB_API void* Ptr(void* mPtr) { return mPtr; }

MQLLIB_API void* PtrShift(void* fPtr, __int32 fShift) { return (void*)((char*)fPtr + fShift); }

MQLLIB_API void PtrGetArray(void* fPtr, __int32 fShift, unsigned char* fArray, size_t fArrSize) {
        unsigned char* ptr = (unsigned char*)fPtr + fShift;
        memcpy(fArray, ptr, fArrSize);
}
 
Valeriy Yastremskiy:

Не понял, структура выбранного ордера при изменении состояния параметров ордера не изменяется? нужен повторный OrderSelect? Хе Хе ... все для людей))))

Ну, как бы это общая практика))) Иначе чуть меньше, чем до хрена оверхедов будет на синхронизацию параметров)))

 
Vladimir Simakov:

Ну, как бы это общая практика))) Иначе чуть меньше, чем до хрена оверхедов будет на синхронизацию параметров)))

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

 
Valeriy Yastremskiy:

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

Читай внимательно)))

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.
 
Igor Makanu:

да усложнение

есть некая "идея-фикс", что если вот взять и сохранить все окружение терминала в свой код, то получу выигрыш в производительности - получишь, но до определенного уровня усложнения кода

любая программа это алгоритм + данные, если можешь не увеличивать код алгоритма и увеличивать обьем данных хранящихся локально - это выигрыш в производительности, 

но если код алгоритма увеличивается значительно, то будет наоборот потеря производительности - процессор мало того, что будет больше инструкций в потоке выполнения программы молотить, дык ему еще придется сам исполняемый код постоянно подгружать и выгружать когда нужно будет освободить ресурсы для другого процесса , т.е. сам код тоже имеет физический размер который нужно будет прокачивать по шине, кэшу, регистрам и АЛУ процессора


вот если бы был монопольный режим владения процессором, и кэш процессора был бы бесконечный... но это из области "закрой глаз - размечтался одноглазый!"  )))

Вы опять за старое - когда нет аргументов, то сразу переходить на личности? вопрос мне интересен, читал, где не согласен вступил в обсуждение, не припомню попойки на бурдершафт, что бы выделять участников форума по личностным соображениям, сменишь аватарку, вообще будешь другой человек для меня - внимательность не мой конек - на полном серьезе 

Как это нет аргументов? Я их давно написал, и они работают. Описал, разжевал и выложил.

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

Впрочем, если вы хотите у себя так делать - делайте, но зачем оспаривать предложение избавиться от большинства циклов, предложенное не вам, и в порядке подсказки?
Отсюда и непонимание такой позиции - предлагаете человеку "забить", а потом он опять к этому сам вернётся.

Просто прочтите всё со стороны. И увидите как один предложил как сделать оптимальнее, а другой с умным видом отмёл всё и поведал, что можно не думать о производительности - мол и так всё гут. А человеку нужно знать что происходит с ордером. Вот как сделаете отслеживание всех событий всех ордеров и позиций в MetaTrader 4, да так, чтобы не терялись события, тогда и послушаем как добивались улучшения производительности. Пока, к сожалению, вижу от вас только "разработчики и так молодцы, поэтому нам можно городить как вздумается"...

 
Сергей Таболин:

Не пинайте сильно, но я, честное слово, не понимаю "проблему"...

Есть ордер, у него есть тикет, этот тикет передаётся сделке и позиции. Есть ещё ID. 

Мне кажется, что это уже проблема разработчиков ввести функцию, например, StateOrder(ticket) = 

Или чтобы возвращалась структура о состоянии ордера/сделки/позиции по указанному тикету....

 
 
Vladimir Simakov:

Читай внимательно)))

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderClosePrice(), OrderCloseTime(), OrderComment(), OrderCommission(), OrderExpiration(), OrderLots(), OrderMagicNumber(), OrderOpenPrice(), OrderOpenTime(), OrderPrint(), OrderProfit(), OrderStopLoss(), OrderSwap(), OrderSymbol(), OrderTakeProfit(), OrderTicket(), OrderType() возвращают ранее скопированные данные. Это означает, что самого ордера может уже и не быть (или же в нем изменились цена открытия, уровни Stop Loss / Take Profit или момент истечения), а данные этому ордеру можно еще получать. Для гарантированного получения свежих данных об ордере рекомендуется вызывать функцию OrderSelect() непосредственно перед обращением за ними.

Вроде о том же и написал. Копирует в окружение терминала пользователя (вопрос откуда). А прямого доступа к полям, откуда копирует, нет. Так же нет штатных полей времени изменения параметров по ходу жизни ордера, только начало и конец жизни ордера. Если бы это можно было прочитать в доках жизнь была бы легче.))))

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