Вопрос о функции OnTradeTransaction - страница 4

 
Mikalas:

Да это потому, что на бирже нет кухни (только комиссии), а на ФОРЕКСе миллионы последователей МММ,

может и есть 100$, но у КАЖДОГО! Огромные деньги, есть что посчитать! :) 

Не понимаю я MetaQuotes )

Для форекс-кухонь есть прекрасный терминал MT4.

Многие форекс-кухни так и не предоставляют доступ через MT5, он им нафиг ненужен. 

Неужели нельзя за столько лет, сделать терминал приближенный к биржам? 

Будет качественный терминал - будет много клиентов желающих предоставлять услуги МТ5. 

 
Serj_Che:

Не понимаю я MetaQuotes )

Для форекс-кухонь есть прекрасный терминал MT4.

Многие форекс-кухни так и не предоставляют доступ через MT5, он им нафиг ненужен. 

Неужели нельзя за столько лет, сделать терминал приближенный к биржам? 

Будет качественный терминал - будет много клиентов желающих предоставлять услуги МТ5. 

Дело не в MQ, а в брокерах.

Брокеру выгодно, чтобы клиенты совершали сделки - больше сделок - больше комиссии.

Робот будет делать только "правильные сделки", а выставляя ордера "руками" люди очень

часто ошибаются (сам не раз наступал на эти "грабли") выставил ордер не в ту сторону,

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

А брокер  и биржа получили комиссию :)

Так что для биржи, а особенно для брокера QUIK - "мать родная". 

 

 
Mikalas:

Василий, ответ будет?

Думаю, что нет.

Я победил? 

Отвечу вечером. Сейчас нет возможности.
 
C-4:

Не усложняйте. Что бы торговать на ФОРТС нет необходимости использовать асинхронность. Для начала посмотрите вот эту статью, главу 3: "Основы асинхронных операций". Там не много и самые азы, но для начала изучения хватит. Описываемый там код 100% асинхронный, тем не менее ему это не мешает работать в синхронном режиме, без получения всяких OnTradeTransaction и прочих событий. 

 Решение должно исходить из Вашей задачи. В MetaTrader 5 у Вас в каждый момент времени только одна активная позиция, вот за ней и следите. Не нужно лезть в историю ордеров. Если необходимость в истории ордеров все равно возникает, тогда нужно уточнить Вашу задачу.

Нет Василий, ты не совсем правильно понял мою цель. Я не собираюсь, пока, писать что-то или торговать на ФОРТС, я всего лишь начал познавать mql5. Я начинал читать эту статью раньше. Но прочёл не более 2х страниц и бросил. Считаю что мне это не надо, сам НТ. А вот наглядное объяснение разницы OrderSend и OrderSendAsync полезно. В общем-то я так и предполагал.

Если отбросить асинхронность подачи заявок и всё-же использовать OnTradeTransaction для отслеживания происходящего на счёте, разве это не улучшит показатели советника?

Одно дело на каждом тике проводить какую-то проверку и совсем другое если проверку проводить только если на счёте произошло какое-то изменение. Разве я не прав? Активировался отложник, имеем информацию об этом. Закрылась позиция, можем анализировать с каким результатом она закрылась. Получается всего несколько проверок за всё время от открытия до закрытия позиции. И в противовес этому проверки на каждом тике...

Вот и ещё возникает вопрос: Для определения профита позиции есть функция PositionGetDouble(POSITION_PROFIT) а чтобы определить профит закрытой сделки только OrderCalcProfit() с кучей параметров которые надо сначала вытащить из этой сделки. Или я настолько ещё не освоил mql5 что не смог найти правильное решение?

Если не затруднит...

 
AlexeyVik:

Нет Василий, ты не совсем правильно понял мою цель. Я не собираюсь, пока, писать что-то или торговать на ФОРТС, я всего лишь начал познавать mql5. Я начинал читать эту статью раньше. Но прочёл не более 2х страниц и бросил. Считаю что мне это не надо, сам НТ. А вот наглядное объяснение разницы OrderSend и OrderSendAsync полезно. В общем-то я так и предполагал.

Если отбросить асинхронность подачи заявок и всё-же использовать OnTradeTransaction для отслеживания происходящего на счёте, разве это не улучшит показатели советника?

Одно дело на каждом тике проводить какую-то проверку и совсем другое если проверку проводить только если на счёте произошло какое-то изменение. Разве я не прав? Активировался отложник, имеем информацию об этом. Закрылась позиция, можем анализировать с каким результатом она закрылась. Получается всего несколько проверок за всё время от открытия до закрытия позиции. И в противовес этому проверки на каждом тике...

Вот и ещё возникает вопрос: Для определения профита позиции есть функция PositionGetDouble(POSITION_PROFIT) а чтобы определить профит закрытой сделки только OrderCalcProfit() с кучей параметров которые надо сначала вытащить из этой сделки. Или я настолько ещё не освоил mql5 что не смог найти правильное решение?

Если не затруднит...

OrderCalcProfit не поможет.

Нужно посчитать среднюю цену всех ордеров (in) и среднюю цену всех ордеров (out),

тогда можно посчитать профит закрытой позиции.

Придётся копаться в истории. 

 
Mikalas:

OrderCalcProfit не поможет.

Нужно посчитать среднюю цену всех ордеров (in) и среднюю цену всех ордеров (out),

тогда можно посчитать профит закрытой позиции.

Придётся копаться в истории. 

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

Я решил переписать на mql5 сов с мартином. В рынке беспрерывно и следующую сделку открывает в сторону последней позиции...

Опа... вот как полезно общаться на форуме. Ведь если позиция может только перевернуться, когда активируется отложник, или закрыться по тейку, то мне не важен размер прибыли или убытка. Ну а если последнее колено будет давать минус, то тут уже ничего будет не надо... Достаточно узнать тип закрытой позиции... а это можно записать в переменную глобального уровня в обработчике OnTradeTransaction при типе транзакции TRADE_TRANSACTION_DEAL_ADD и при транзакции типа TRADE_TRANSACTION_HISTORY_ADD или при условии что PositionsTotal по символу равен нулю поставить следующий первый ордер серии... Это я для себя записал чтобы не забыть :)))



 
papaklass:

...То есть, логика Вашего алгоритма должна опираться на ИЗМЕНЕНИЕ ТОРГОВОГО ОКРУЖЕНИЯ, а не на отработку каких-либо функций или событий.

3. Частота проверки торгового окружения (на тике, на баре, по таймеру и т.д.) должна соответствовать логике Вашей ТС. То есть, как быстро требуется обработать изменение торгового окружения? Если логика Вашей ТС требует обработки изменения как можно быстрее, то Вы не уйдете от проверок на каждом тике...

А если советник мультивалютный?
 
papaklass:

1. Функция OrderSendAsync() применяется в случае, когда нужно отправить несколько приказов ЕДИНОВРЕМЕННО, своего рода, пакетная отправка. При пакетной отправке, если ждать ответов сервера на каждый приказ (использование функция OrderSend()), то  будет значительный суммарный временной лаг при отправке всего пакета. За этот временной лаг рынок может существенно измениться! Для исключения этого временного лага и была введена функция OrderSendAsync(). Вы должны это четко понимать.

Если Вам не требуется пакетная отправка приказов, то и функцию OrderSendAsync() нет смысла использовать.

2. Самое достоверное определение сработки приказа, ордера и т.д. - это отслеживание своего торгового окружения, а не отработка каких-либо функций или событий. Функция или событие может отработать, но не факт, что в результате этой отработки ИЗМЕНИТЬСЯ ВАШЕ ТОРГОВОЕ ОКРУЖЕНИЕ. Почему? Да потому, что в процессе работы функции может просто произойти ошибка. 

То есть, логика Вашего алгоритма должна опираться на ИЗМЕНЕНИЕ ТОРГОВОГО ОКРУЖЕНИЯ, а не на отработку каких-либо функций или событий.

3. Частота проверки торгового окружения (на тике, на баре, по таймеру и т.д.) должна соответствовать логике Вашей ТС. То есть, как быстро требуется обработать изменение торгового окружения? Если логика Вашей ТС требует обработки изменения как можно быстрее, то Вы не уйдете от проверок на каждом тике.

Александр, спасибо за отклик.

1. Это я понимаю ровно на столько, чтобы понять что пока мне это не надо. Пока мне достаточно функции OrderSend

2. Да, я согласен с тем что самое достоверное состояние можно определить только контролируя всё окружение на каждом тике. Но имея такой обработчик событий его игнорировать... Ну, я просто экспериментирую. Я прекрасно понимаю Ваше желание помочь мне сделать как-то надёжней, но у меня цель другая. Этот советник мне не срочно нужен и тем более не на заказ я его пишу.

3. Возможно в конечной версии советника я вернусь к проверке на каждом тике, а пока...

Вопрос-то был в другом, на сколько можно доверять обработчику событий OnTradeTransaction если в документации есть предупреждение

Кроме того, транзакции могут потеряться при доставке от сервера к терминалу.

И в каких случаях лучше не доверять, а в каких случаях надо подстраховаться чем-то.

Я очень благодарен всем, Василию, Михаилу и Вам Александр. Буду очень рад и ещё раз благодарен если вы поделитесь ещё какими-то мыслями.

 
papaklass:

Именно на этот вопрос и я, и Василий Вам отвечали.

Подумайте сами, если работу функции OnTradeTransaction() все-равно нужно перепроверять, то может быть лучше сразу проверять торговое окружение, а не после отработки OnTradeTransaction(). Хотя, это дело вкуса.

Да и в соседней ветке Renat обещал поработать с функцией и, возможно, мы в ближайших билдах получим улучшение работы этой функции.

Но тем не менее делается упор на асинхронную постановку ордеров. В этом случае понятно, что из сотни ордеров потерять одну транзакцию не мудрено. Но тем не менее Михаил, по его словам, за полгода с невероятно большим количеством ордеров не потерял ни одной транзакции. А какова вероятность потерять транзакцию если ордер ставится функцией OrderSend() и может в этом случае ничего страшного?

А если ещё и улучшение грядёт, так это ещё одна причина что стоит этим заниматься. Или я опять в чём-то не прав?

 
denkir:
А если советник мультивалютный?


papaklass:

Не понятно, что Вы хотите от меня услышать.

Аргументацию против событийной модели...
Причина обращения: