Если я правильно въехал, то Вам необходима функция- запрет нескольких оредеров в одном бару. Попробуйте добавить в код:
if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUY, Magic) ==0) { //запрет неск. поз на одном баре
// Проверка условий для совершения сделки селл
if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELL, Magic) ==0) {//запрет неск. поз на одном баре
( Это перед условиями на вход)
А вот это в конце кода:
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает номер бара открытия последней позиции или -1. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий таймфрейм) |
//| op - операция ( -1 - любая позиция) |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersTotal();
if (sy=="" || sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) t=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True));
}
Код, конечно, неудобен для чтения, но мысли есть после его просмотра.
Во-первых:
Функция int CountAllOrders(int dir, int SysID) считает количество только отложенных ордеров. Вы сами говорите, что проблема начинает возникать после срабатывания ордера. В таком случае Ваша функция начнёт выдавать 0, а эксперт, соответственно, считать, что ордеров нет и нужно выставиться. Другими словами, в указанную функцию можно вставить (OrderType() == Dir1 || OrderType() == Dir2), а самой функции передавать три аргумента, где первые два, например, равны OP_SELL и OP_SELLSTOP.
Но это есть некрасивое решение. Масло масляное. Можно вызов оставить прежним, а саму функцию изменить так:
int CountAllOrders(int dir, int SysID) { int total = OrdersTotal(), i, c = 0; if (total <= 0) return (0); if (dir == OP_SELLSTOP) for (i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType() == dir || OrderType() == OP_SELL) && (OrderMagicNumber() == SysID)) c = c + 1; } if (dir == OP_BUYSTOP) for (i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType() == dir || OrderType() == OP_BUY) && (OrderMagicNumber() == SysID)) c = c + 1; } return (c); }
Во-вторых:
Переменные tBuy и tSell объявлены как double, хотя им присваивается результат выполнения функции OrderSend, который есть целое число. В дальнейшем эти переменные проверяются на "не больше нуля". Возможно, что ничего страшного. Но я бы всё-таки объявил их int. Тем более, что они участвуют в проверке условия, после которой и происходит открытие ордеров "не по Вашей заявке".
Не претендую на доскональность анализа. Но это всё, что смог разобрать в Вашей работе за приемлемое время.
Уважаемый Plus!
Так что с Вашим экспертом?
Заработал или нет?
Не получается опять, видимо не там и не так вставляю. Пожалуйста, выложите уже готовый целый код с Вашими изменениями, желательно в архиве.
Вот, внёс изменения, о которых писал. К сожалению, тестировать нет времени.
Попробуйте, если ситуация не исправится, напишите сюда. Посмотрим ещё, повнимательнее.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет!
Проблема вот в чём:
при обрыве связи и её восстановлении, повторно открывается ордер с текущих.
Суть эксперта в том, что он выставляет отложки по хай и лоу предыдущей свечи - бай и селл соответственно. В данном случае при 1Н, HourBegin = 8 - ориентир на 7-часовую свечу.
И если,допустим, в 9.37 сработал ордер Бай и в 10 оборвалась связь, то при восстановлении связи - открывается опять ордер Бай, с уже текущей цены. А если за день обрыв связи несколько раз или перезапуск МТ, то ордеров Бай с текущих накапливается довольно много, а это неприемлемо.
Фишка в том, что все отложки удаляются в 1:00 и остаются в работе только открытые ордера. А значит, при сбоях связи до 8:00 ордера с текущих или отложенные по ориентиру на предыдущие свечи 7:00 - не выставляются. А с момента срабатывания ордера, после 8:00, он будет открываться заново при каждом сбое связи вплоть до 1:00 ночи.
Может неправильно MAGIC работает?
я не могу найти ошибку, помогите пожалуйста!