Выложил Эксперт. Помогите найти ошибку пожалуйста.

 

Привет!


Проблема вот в чём:


при обрыве связи и её восстановлении, повторно открывается ордер с текущих.

Суть эксперта в том, что он выставляет отложки по хай и лоу предыдущей свечи - бай и селл соответственно. В данном случае при 1Н, HourBegin = 8 - ориентир на 7-часовую свечу.

И если,допустим, в 9.37 сработал ордер Бай и в 10 оборвалась связь, то при восстановлении связи - открывается опять ордер Бай, с уже текущей цены. А если за день обрыв связи несколько раз или перезапуск МТ, то ордеров Бай с текущих накапливается довольно много, а это неприемлемо.

Фишка в том, что все отложки удаляются в 1:00 и остаются в работе только открытые ордера. А значит, при сбоях связи до 8:00  ордера с текущих или отложенные по ориентиру на предыдущие свечи 7:00 - не выставляются. А с момента срабатывания ордера, после 8:00,  он будет открываться заново при каждом сбое связи вплоть до 1:00 ночи.

Может неправильно MAGIC работает?

я не могу найти ошибку, помогите пожалуйста!

Файлы:
mr_001_1.rar  3 kb
 

Есть такая "волшебная" кнопочка, которая помогает быстрее решать свои проблемы с кодом:



 
WWer >>:

Есть такая "волшебная" кнопочка, которая помогает быстрее решать свои проблемы с кодом:



+1 ломать глаза неохота

 
STill_ace >>:

+1 ломать глаза неохота

Проще в архив тогда. SRC "говорит", что размер недопустимо большой.

Файлы:
mr_001.rar  3 kb
 
Plus >>:


Если я правильно въехал, то Вам необходима функция- запрет нескольких оредеров в одном бару. Попробуйте добавить в код:

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));
}

 

BARS писал(а) >>

Если я правильно въехал, то Вам необходима функция- запрет нескольких оредеров в одном бару. Попробуйте добавить в код:


А будьте так добры добавить этот код и выложить уже готовый эксперт с Вашим участком кода, а то у меня не получилось. Не работает.

Спасибо.


 
Plus писал (а) >>

...

я не могу найти ошибку, помогите пожалуйста!

Код, конечно, неудобен для чтения, но мысли есть после его просмотра.

Во-первых:

Функция 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!

Так что с Вашим экспертом?

Заработал или нет?

 
Sergo >>:

Уважаемый Plus!

Так что с Вашим экспертом?

Заработал или нет?

Не получается опять, видимо не там и не так вставляю. Пожалуйста, выложите уже готовый целый код с Вашими изменениями, желательно в архиве.

Спасибо,

с уважением,

Plus

 
Попробую. Чуть попозже.
 
Plus >>:

Не получается опять, видимо не там и не так вставляю. Пожалуйста, выложите уже готовый целый код с Вашими изменениями, желательно в архиве.

Вот, внёс изменения, о которых писал. К сожалению, тестировать нет времени.

Попробуйте, если ситуация не исправится, напишите сюда. Посмотрим ещё, повнимательнее.

Файлы:
mr_001_2.zip  3 kb
Причина обращения: