Мой эксперт выполняет двойную запись - страница 8

 
angevoyageur:

1) Я не думаю, что это связано с вопросом данной темы. Проблема, которую мы получаем, возникает в случае, когда запрос был успешно заполнен и позиция открыта. Но эта позиция открывается на торговом сервере, проблема, с которой мы столкнулись, это когда происходит задержка, более важная, чем обычно, и терминал MT5 получает уведомление об этой новой позиции ПОСЛЕ того, как новый тик уже обработан.

2) ... на мой взгляд, это плохой дизайн для платформы, которая позволяет явно синхронные и асинхронные торговые запросы ...

3) ... ResultRetCode синхронный, это обновление базы данных MT5 о позиции (сделке и ордере) асинхронное....

1) Не согласен, и извините за невежество, но почему вы так уверены, что позиция открывается после PositionOpen() в торговом сервере без двойной проверки ResultRetcode()?

2) Согласен на 100%.

3) Наверняка ResultRetCode() синхронный, я имею ввиду, что для проверки кода результата вы (ведущий) должны запросить сервер (ведомый) несколькими "асинхронными" сообщениями.

 
figurelli:

1) Не согласен, извините за невежество, но почему вы так уверены, что позиция открывается после PositionOpen() в торговом сервере без двойной проверки ResultRetcode()?

2) Согласен на 100%.

3) Наверняка ResultRetCode() синхронный, я имею ввиду, что для проверки кода результата вы (мастер) должны запросить сервер (слейв) несколькими "асинхронными" сообщениями.

1) Эта тема о двойной записи, поэтому мы говорим о запросе заказа, который был успешным. Я никогда не писал, что не нужно дважды проверять ResultRetCode(), я писал как раз наоборот. Но это НЕ связано с двойной записью, по определению. Разве это не очевидно?

3) Возможно это деталь(непонимание ?) , но то, что вы написали не имеет смысла. В первой части вашего предложения вы сказали, что ResultRetCode() является синхронным, во второй вы сказали, что "код результата", который является тем же самым, что и ResultRetCode(), получается асинхронно. Для получения этого значения (Retcode) между сервером и терминалом нет НИКАКОЙ связи.

CTrade.PositionOpen() по умолчанию является синхронным, то есть базовый класс использует OrderSend(). Который отправляет запрос ордера и ждет ответа от сервера. Сервер возвращает результат на терминал, и код советника продолжает работу (с возвращаемым значением true или false). Общение между ведущим и ведомым завершилось. После этого вы можете проверить ResultRetcode, который уже доступен локально.

Documentation on MQL5: Trade Functions / OrderSend
Documentation on MQL5: Trade Functions / OrderSend
  • www.mql5.com
Trade Functions / OrderSend - Documentation on MQL5
 
@figurelli: Поздравляю со вступлением в должность модератора ... .
 
Существует ли тайм-аут для открытой позиции?
 
doshur:
Существует ли тайм-аут для открытой позиции?
Здравствуйте, doshur, что именно вы имеете в виду под таймаутом?
 
Malacarne:
Здравствуйте, doshur, что именно вы имеете в виду под таймаутом?
Например, отсутствие ответа от сервера
 
angevoyageur:

1) Эта тема о двойной записи, поэтому мы говорим о запросе ордера, который был успешным. Я никогда не писал, что не нужно дважды проверять ResultRetCode(), я писал как раз наоборот. Но это НЕ связано с двойной записью, по определению. Разве это не очевидно?

3) Возможно это деталь(непонимание ?) , но то, что вы написали не имеет смысла. В первой части вашего предложения вы сказали, что ResultRetCode() является синхронным, во второй вы сказали, что "код результата", который является тем же самым, что и ResultRetCode(), получается асинхронно. Для получения этого значения (Retcode) между сервером и терминалом нет НИКАКОЙ связи.

CTrade.PositionOpen() по умолчанию является синхронным, то есть базовый класс использует OrderSend(). Который отправляет запрос ордера и ждет ответа от сервера. Сервер возвращает результат на терминал, и код советника продолжает работу (с возвращаемым значением true или false). Общение между ведущим и ведомым завершилось. После этого вы можете проверить ResultRetcode, который уже доступен локально.

Ален,

Насчет 1) я все еще не согласна, так как для меня оригинальный код
doshur не проверяет ResultRetCode() и он ищет решение для "двойной записи", и для меня мы должны решить это в его коде (как предложил Malacarne). Так что для меня это не так очевидно.

По поводу 3) Вы написали "Однако ResultRetCode синхронный, это обновление базы данных MT5 о позиции (сделке и ордере) асинхронное.", поэтому мой ответ был об этом предложении.

Влюбом случае,наша дискуссия похожа на историю о полупустом стакане воды: кто-то видит его наполовину полным, а кто-то наполовину пустым, но вопрос в том, считает ли он стакан наполовину полным, или наполовину пустым ;-)))

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

 
Ubzen:
@figurelli: Поздравляю со вступлением в должность модератора ... .
Ubzen, спасибо большое, но я все еще верю, что это просто серьезный баг mql5.com ;-))
 

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

Вы, ребята, очень полезны.

Теперь мой советник кажется более устойчивым.

 
figurelli:
...

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

Я полностью согласен с этим. Не волнуйтесь и продолжайте.