PDA

View Full Version : Советник. Ночная торговля.



Vitaliy Kingtreid
03-14-2012, 01:45 PM
Столкнулся недавно с такой проблемой. Ночью советник открывает несколько одинаковых ордеров. Ничего страшного не произошло, но причина этого непонятна. Днём тот же самый алгоритм и та же самая ситуация работает чётко. Естественно на тестере также нет проблем. Есть у меня бредовая идея о том, что если ордер открывается с задержкой, то такая ситуация может происходить. Второй вариант – это на советник влияет отсутствие тиков ночью.

Алгоритм, по которому советник открывает ордер, прост:

if (GlobalVariableGet(tiket5)<0)
{
tiket=OrderSend(Symbol(),OP_BUYSTOP,lot,NormalizeDouble(Ask+…);
GlobalVariableSet(tiket5,tiket);
}

Erni
05-20-2012, 04:10 PM
Я не силен в программировании, но по логике и небольшом опыте торговли замечал такую вещь: иногда запрос на открытие ордера еще висит в ожидании, а в блоке открытых ордеров уже он появился (скажет 1-2 секунды). Возможно это зависит от скорости интернета или обработки запросов сервера. Может я и ошибаюсь... )))))))))

MaxZ
05-20-2012, 06:15 PM
Ниже приведена замечательная картинка из учебника MQL4, которая развеет все Ваши предположения.

https://book.mql4.com/c/book/i/65.png
После того, как советник отправил торговый приказ, он ничего не сможет сделать, пока с сервера не придёт ответ (хотя не все запросы доходят до сервера и это видно также на картинке... например, торговый приказ составлен не корректно - лот неправильный или указали несуществующий символ, тогда торговый терминал отклонит запрос и передаст код ошибки), этот ответ не обработает терминал и не выдаст советнику ответ в виде: тикета или тикета и кода ошибки (при попытке открыть ордер или выставить отложенный ордер), или булевой переменной с/без ошибки (при попытке модифицировать удалить или закрыть ордер). Дальше рассуждайте Сами почему Ваши предположения не могут быть верны! :)

По поводу тиков ночью, тоже неверное предположение. В советник основную работу выполняет специальная функция start(), которая запускается по приходу нового тика. Тиков нет и советник находится в режиме ожидания, ждёт прихода нового тика (если он конечно уже обработал предыдущий тик - но чем тики реже, тем естественно это мало вероятнее). Исключение составляют скрипты. Их функция start() выполняется сразу после выполнения функции init(), которая выполняется сразу, как кинули Вы скрипт на график (такая маленькая тавтология получилась).

Я не телепат, но Мне кажется, что логическая ошибка кроется в другом фрагменте кода! И вообще, вопрос сразу возникает, для чего используются глобальные переменные (так называемые Global Variables в MQL4)?




Я не силен в программировании, но по логике и небольшом опыте торговли замечал такую вещь: иногда запрос на открытие ордера еще висит в ожидании, а в блоке открытых ордеров уже он появился (скажет 1-2 секунды). Возможно это зависит от скорости интернета или обработки запросов сервера. Может я и ошибаюсь... )))))))))

Что за блок открытых ордеров? Поясните, пожалуйста.