Что означает запись в журнале - страница 4

 
А я ведь еще OrderModify не проверял :(
И отложенные ордера :(((
 
Итак, прошло довольно много времени, несколько дней. За это время успели сработать несколько экспертов. Привожу логи (код, генерирующий эти логи - выше). Все еще жду хоть какого-то ответа от разработчиков. Хотя бы на уровне "проблему признаем, будем исправлять".

Лог 1:
Trying to buy, attempt 0 failed, error 6
Trying to buy, attempt 1 failed, error 129
Trying to buy, attempt 2 failed, error 129
Trying to buy, attempt 3 failed, error 129
Trying to buy, attempt 4 failed, error 129
Zigzag buy error: 4050
2.28000000, 0.02700000, 0.00000000
Trying to buy, attempt 0 failed, error 6
Trying to buy, attempt 1 successfull

Ордер открыт с 7-й попытки. По ходу дела поймано несколько сообщений об ошибках, не имеющих с реальностью ничего общего.

Лог 2.
7.9.2005 11:0:15, Signal: sell7.9.2005 11:0:15 Trying to sell, attempt 0
Ask: 1.24820000, StopLoss: 0.00600000, TakeProfit: 0.00000000
failed, error 6
7.9.2005 11:0:15 Trying to sell, attempt 1
Ask: 1.24820000, StopLoss: 0.00600000, TakeProfit: 0.00000000
successfull

Со второй попытки. Ошибка номер шесть, ей была посвящена целая ветка, больше ста постов. Следуя советам разработчиков, Роша и Компостера, частота ошибки была уменьшена с "через раз" до "примерно раз из пяти". Но она осталась.

Лог 3.
Attempting to close long position, ticket: 1784257
6.9.2005 12:0:13 Order with this ticket still present, trying again
6.9.2005 12:0:13 Order with this ticket still present, trying again
6.9.2005 12:0:13 Order with this ticket still present, trying again
6.9.2005 12:0:13 Order with this ticket still present, trying again
6.9.2005 12:0:13 Order with this ticket still present, trying again

Пять неудач, кода ошибки НЕ БЫЛО. Программа считала, что позиция закрыта. Я ловил тикет в цикле, если бы не ловил, проблема бы не была обнаружена.

Ну и так далее.
 
Сделай так

void CloseBuy(string strExpertName)
{
int nTicket = OrderTicket();
SaveComment("\r\n\tAttempting to close long position, ticket: " + nTicket);

int nResult = OrderClose(OrderTicket(), OrderLots(), Bid, nSlip, Aqua);

Sleep(10000);

if(nResult == -1)
{
int nError = GetLastError();
Alert(strExpertName + ", error: " + nError);
}

}


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

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

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

Повторюсь, проблема не только в том, что ошибки ВОЗНИКАЮТ, но и в том, что коды ошибок берутся с потолка, а иногда и вовсе нет кодов - возвращается код успеха операции.

Если я чего-то не понял, пожалуйста, поясни.
 
Объясняю. По условиям одного из советников, если текущая цена Ask превысила стоп-лосс отложенного ордера на продажу , производится ряд действий:
1. Высылается СМС о намерении снять такой ордер.
2. Делается попытка снять ордер
3. Анализируется результат функции OrderDelete() и если он отрицательный (ордер не снялся) , то
4. Высылается СМС о провале.

Вчера пришли 2 СМС-ки, все согласно регламенту, НО - ордер был снят в ту же секунду, согласно логам.
Значит, советник пытался получить результат операции отмены ордера на какую-то долю секунды раньше, чем получил результат. Как в анекдоте про китайцев, которые картошку сажали, и выкапывали на следующий день. На вопрос "Что, так быстро поспевает", они отвечали - "Нет, но оцень кусать хоцется" :)
 
Понятно, НО:
1. Я всю эту бучу поднял по поводу реальных ордеров. И если они себя так ведут, это надо фиксить.
2. Идея в том, чтобы МТ советники могли торговать БЕЗ цикла с задержками. Это - то, как оно, по идее, должно быть.
Задержку я поставлю, но, как говорится, "совершенно без удовольствия" :)
 
Щас сам задумался. Если я предлагаю использовать паузу между операцией модификации ордера и проверкой результатов этой операции, значит я предполагаю асинхронность работы советника. То есть, отправляется запрос на сервер с попыткой модификации ордера и не дожидаясь ответа советник чешет дальше, согласно алгоритма. По умолчанию, ему подсовывается отрицательный ответ пока не пришел ответ с сервера, если дождался ответа - ответ реальный, не дождался - ответ виртуальный.

Сам не верю, может разработчики объяснят, насколько я ошибаюсь?
 
Консенсус достигнут. Но паузу я вставил - чтобы уж совсем наверняка. По крайней мере перед проверкой наличия тикета только что успешно закрытого ордера может быть обращение к базе данных на сервере, надо дать ей время обновиться. Хоть это и неправильно :)

Несколько смущает тот факт, что на 37 постов этой ветки приходится только один от разработчиков...
 
Несколько смущает тот факт, что на 37 постов этой ветки приходится только один от разработчиков...

зачем вмешиваться в и без того продуктивное обсуждение
 
зачем вмешиваться в и без того продуктивное обсуждение

а вот и продукты =)

Провёл тестирование. Работает один советник, который открывает и закрывает позицию (поочерёдно - бай и селл). Минимальная пауза между всеми торговыми операциями - 10 сек.

Время тестирования (по Альпари): 02:00 - 09:30 (т.е. 7,5 часов)
Попыток OrderSend: 996
Удачных*: 888
Ошибок**: 108

* - под "удачной" попыткой я понимаю следующее: ордерсенд вернул № тикета, GetLastError вернул 0, открытая позиция успешно выбрана ордерселект.
** - Все ошибки №148 "trade context is busy" - то, о чём спрашивал Слава в соседней ветке - "что, если отключить проверку isTradeAllowed?". Ошибки начались в 07:16:46 и продолжают сыпаться до сих пор)

-----------------------------------------------------------------------------------------------------------------------

Попыток OrderClose: 890
Удачных*: 736
Ошибок**: 154

* - под "удачной" попыткой закрытия я понимаю следующее: ордерклоус вернул true, GetLastError вернул 0, закрытая позиция позиция успешно выбрана ордерселект в моде_хистори.
** - 152 ошибки №1 "нет ошибки", одна №6 и одна №138(реквот)


Ситуации, которую отлавливали, не случилось... Т.е. все закрытые позиции были действительно закрыты.