Форум » Консультации по программированию » Программное определение закрытия ордера по стопу » Ответить

Программное определение закрытия ордера по стопу

Stoletov: Интересно, можно ли программно определить, если ордер закрылся по стоп-лосс? А нужно это вот для чего. У меня советник уже пару раз открывал позицию в том же направлении (т.е. buy-buy или sell-sell) сразу после срабатывания стопа, и получался двойной убыток. Хотелось бы запретить открытие ордера в том же направлении в течение некоторого времени после срабатывания стопа. Но для этого надо определить факт такого срабатывания. Функция OrderStopLoss() как я понимаю просто определяет цену закрытия открытого ордера в случае достижения уровня стоп-лосс и пользы от этого мало. Или я ошибаюсь? Интуиция подсказывает, что надо сделать что-то типа следующего ниже блока (на примере ордера buy), но не уверен: int i=OrdersHistoryTotal()-1; if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) if(OrderStopLoss()!=OrderClosePrice() && OrderType()=0) // если цена закрытия не равна стопу и был ордер buy int ticket=OrderSend(Symbol(), 0, …… ); // то разрешаем открыть ордер buy else ..... // запрет на открытие ордера buy

Ответов - 18, стр: 1 2 All

Scriptong: skilful_coder пишет: К вам еще вопросик, посмотрите на рисунку: http://shot.qip.ru/00Esu2-5SNS8HMSU/ Код для МТ5. Пожалуйста помогите?! Не могу по двум причинам: 1. Вопрос задан в теме не того назначения. Задайте его в новой теме ветки форума "Консультации по программированию". 2. Вы не указали, в чем заключается проблема. Должны быть какие-то попытки с Вашей стороны по решению проблемы - какие-то фрагменты кода. Если Вы не владеете программированием, то "Консультации по программированию" явно не для Вас. Попытайтесь представить стратегию в ветке "Идеи для статей". Если стратегия окажется интересной, то будет написана статья по ней.

Stoletov: Scriptong пишет: Если же имеется в виду, что необходимо определить причину закрытия ордера, то это решается таким кодом: Как я понимаю теперь функцию GetOrderCloseReason нужно вызвать из основной программы и проанализировать причину закрытия, например так: if(GetOrderCloseReason(ticket)==1) // закрытие произошло по стопу. Возьму эту функцию себе на вооружение на будущее. Сейчас моя задача проще – определить, что ордер закрылся по стопу, что и делаю с вашей подачи с помощью неравенства типа OrderStopLoss()-OrderClosePrice()>=-Point/10. А до этого просто перебираю последние закрытые ордера из истории и проверяю, что они принадлежат текущей валютной паре. В принципе можно запретить повторное открытие ордера в том же направлении ( buy-buy или sell-sell) в течение заданного времени не только в случае закрытия по стопу, но и при любом закрытии. Тогда неравенство >=-Point/10 можно вообще убрать . Ведь по сути в любом случае нелогично снова открывать ордер в том же направлении через короткое время. На практике у меня бывало, когда после закрытия по стопу тут же открывался ордер в том же направлении, что почти всегда приводило к убыткам. Поэтому я и заострил внимание именно на закрытиях по стопу. Теперь встает еще задача определения оптимального временного интервала, в течение которого надо запретить повторное открытие в том же направлении. Может он равен и не 1 часу. Интуитивно ясно, что этот интервал не должен быть слишком большим, иначе могут быть упущены хорошие возможности – сделка не откроется. Может быть и так, что такого оптимального интервала просто не существует, поскольку при тестировании на разных парах или на разных периодах со сдвигом (например январь-апрель, февраль-май и т.д) могут получаться разные оптимальные значения этого интервала. О том, что бывает бессмысленно подбирать оптимальные параметры, написано в книгах , например в книге Швагера «Технический анализ». Он показывает, что только если задать параметр уж совсем несуразный , то результаты заметно ухудшаются. Так что можно не париться и задавать параметры из некоторого разумного интервала. Из своего опыта могу сказать, что у некоторых параметров существуют явно выраженные наилучшие значения, а у некоторых нет, но это уже тема отдельного разговора.

Scriptong: Stoletov пишет: Может быть и так, что такого оптимального интервала просто не существует Думаю, это ближе к истине. Обычно исхожу из следующих соображений. Те стратегии, которые мы тестируем в МТ4 (МТ5), привязаны к свечам. То есть на одной свече, чаще всего, не бывает более одного сигнала открытия (да, есть пробойные системы, которые могут давать и больше сигналов, но их в общем количестве не так уж и много). Таким образом, если на текущей свече уже была открыта сделка, то, независимо от причины ее закрытия, новая сделка не должна быть открыта. Другими словами следует говорить не о привязке к ордеру, а о привязке к торговому сигналу: обработан он или нет? Само собой, наличие ордера после сигнала является подтверждением обработки этого самого сигнала. Часто в экспертах на этапе инициализации проводится чтение истории счета с целью определения времени обработки последнего сигнала стратегии после перезагрузки программы. Это дает связанную картину работы эксперта между его включениями/выключениями.




полная версия страницы