Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 412

 
Ekburg:

Вот здорова... я конечно рад, что проблема стала у Вас решаться, но моё сообщение Вы почему то не заметили, где я сказал то же самое, чуть другими словами, и сразу сказал на недочёты, кроме закрытия файла, не сразу увидел где это у Вас происходит:)

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

Тем не менее, действительно, спасибо Вам за Ваш отклик. И с Новым годом! :)

 

Здравствуйте. Столкнулся с неприятной ситуацией. Помогите разобраться.

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

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Вот код функции Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

И так, когда советнику не удается выставить стопы, то появляется сообщение, в котором выводится информация об ошибки и параметры ордера, который он пытался модифицировать. То что он пишет для меня и есть самая настоящая загадка. Как видно из рисунков ниже, постоянно пишет, что неправильный объем. Странно. Добавлю, все параметры ордера перед модификацией рассчитываются верно, это видно из сообщений. К тому же в ином случае была бы совсем другая ошибка. Тестирование программы проводилось с более высоким спредом, чем тот что на демке.

Загадкаеще одна

 
_Vladimir_:

Здравствуйте. Столкнулся с неприятной ситуацией. Помогите разобраться.

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

Вот код функции Error(int er)

И так, когда советнику не удается выставить стопы, то появляется сообщение, в котором выводится информация об ошибки и параметры ордера, который он пытался модифицировать. То что он пишет для меня и есть самая настоящая загадка. Как видно из рисунков ниже, постоянно пишет, что неправильный объем. Странно. Добавлю, все параметры ордера перед модификацией рассчитываются верно, это видно из сообщений. К тому же в ином случае была бы совсем другая ошибка. Тестирование программы проводилось с более высоким спредом, чем тот что на демке.

Относитесь аккуратно к значениям своих глобальных переменных. Могу предположить, что ord_ticket глобальная переменная, а значит, в ней может сохраняться предыдущее значение. И перед вызовом GetLastError() для отлова ошибки, нужно сбросить предыдущее показание, вызовом её же в начале кода.
 
TarasBY:
Относитесь аккуратно к значениям своих глобальных переменных. Могу предположить, что ord_ticket глобальная переменная, а значит, в ней может сохраняться предыдущее значение. И перед вызовом GetLastError() для отлова ошибки, нужно сбросить предыдущее показание, вызовом её же в начале кода.

ord_ticket объявлена на локальном уровне. Да и потом даже в случае ее объявления на глобальном уровне в первой строчке

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

ее значение обязательно измениться. Либо номер ордера, в случае успешного проведения операции, либо -1 в противном случае. Так что если ордер не открыт, то в блок установки стопов мы не попадаем

Так же замечу, функция OrderSend() всегда изменяет значение последней ошибки(согласно документации и логике), поэтому сброс предыдущего показания в данном случае не обязателен и приведет к простой потери времени. То есть ошибка 131 появляется после входа в блок установки стопов и до вывода сообщения об ошибке. В силу того, что стопы реально не устанавливаются получается функция OrderModify() является последней вызываемой функцией, которая так же как и предыдущая всегда изменяет значение последней ошибки. Только я не как не могу понять почему же 131??? Откуда? Еще раз скажу, что в тестере ни каких проблем не было.

Была мысль, что брокер мудрит, ведь именно сервер присылает терминалу, а тот в свою очередь советнику номер ошибки. От нее я быстро отказался, потому что такая штука происходит только с ордерами одного советника, у остальных советников работающих параллельно не каких ошибок в работе не наблюдается.

 
_Vladimir_:

ord_ticket объявлена на локальном уровне. Да и потом даже в случае ее объявления на глобальном уровне в первой строчке

ее значение обязательно измениться. Либо номер ордера, в случае успешного проведения операции, либо -1 в противном случае. Так что если ордер не открыт, то в блок установки стопов мы не попадаем

Так же замечу, функция OrderSend() всегда изменяет значение последней ошибки(согласно документации и логике), поэтому сброс предыдущего показания в данном случае не обязателен и приведет к простой потери времени. То есть ошибка 131 появляется после входа в блок установки стопов и до вывода сообщения об ошибке. В силу того, что стопы реально не устанавливаются получается функция OrderModify() является последней вызываемой функцией, которая так же как и предыдущая всегда изменяет значение последней ошибки. Только я не как не могу понять почему же 131??? Откуда? Еще раз скажу, что в тестере ни каких проблем не было.

Была мысль, что брокер мудрит, ведь именно сервер присылает терминалу, а тот в свою очередь советнику номер ошибки. От нее я быстро отказался, потому что такая штука происходит только с ордерами одного советника, у остальных советников работающих параллельно не каких ошибок в работе не наблюдается.


Добавлю. У параллельно работающего советника точно такой же код, отвечающий за установку стопов. Так вот у этого советника не разу не было ситуации при которой стопы к ордерам не устанавливались.

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

 
_Vladimir_:

ord_ticket объявлена на локальном уровне. Да и потом даже в случае ее объявления на глобальном уровне в первой строчке

ее значение обязательно измениться. Либо номер ордера, в случае успешного проведения операции, либо -1 в противном случае. Так что если ордер не открыт, то в блок установки стопов мы не попадаем

Так же замечу, функция OrderSend() всегда изменяет значение последней ошибки(согласно документации и логике), поэтому сброс предыдущего показания в данном случае не обязателен и приведет к простой потери времени. То есть ошибка 131 появляется после входа в блок установки стопов и до вывода сообщения об ошибке. В силу того, что стопы реально не устанавливаются получается функция OrderModify() является последней вызываемой функцией, которая так же как и предыдущая всегда изменяет значение последней ошибки. Только я не как не могу понять почему же 131??? Откуда? Еще раз скажу, что в тестере ни каких проблем не было.

Была мысль, что брокер мудрит, ведь именно сервер присылает терминалу, а тот в свою очередь советнику номер ошибки. От нее я быстро отказался, потому что такая штука происходит только с ордерами одного советника, у остальных советников работающих параллельно не каких ошибок в работе не наблюдается.

Мысль бъёт ключом! НО, как показывает опыт, то, что мы думаем (как должно быть, и то, что есть на самом деле - очень часто РАЗНЫЕ вещи. Что можно посоветовать: "Пропринтуйте всю последовательность выполнения своего кода.", - так быстрее всего отыскать ошибку (или убедиться в своей правоте). :)
 
yan720:

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

Тем не менее, действительно, спасибо Вам за Ваш отклик. И с Новым годом! :)



:D ок, и Вас с новым годом:)
 
Возвращаясь к написанному на 411 стр ... есть у кого-нибудь идея как объединить тот код и условия для входа-выхода по пересечению двух МА? или отложенные ордера единственный вариант?
 
petya33r:
Возвращаясь к написанному на 411 стр ... есть у кого-нибудь идея как объединить тот код и условия для входа-выхода по пересечению двух МА? или отложенные ордера единственный вариант?

После открытия сделки по сигналу мувингов начинайте следить за количеством ордеров или за этим ордером конкретно, если количество ордеров уменьшиться или как по второму варианту закроется конкретно этот ордер, то выясните каким образом он закрылся, если по стопу, то открывается просто противоположный орде по текущей цене, вот и всё
 
Ekburg:

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

Это-то я понимаю, но не получается написать. Советник либо торгует только по сигналам мувингов и не происходит открытие обратной позиции в случае убытка, либо просто вылетает терминал при начале тестирования. Значит я чего вообще написал что-то не обрабатываемое. Туго у меня с написанием. Нужна помощь ввиде написанного кода.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Вот кусок который как раз смотрит есть ли закрытые ордера и если OrderProfit()<0 получен убыток, то открывает противоположный. Но в связке с сигналами от мувингов не получается. Можете написать единый код чтобы и сигналы от мувингов и условие открытия противоположной позиции были?

Причина обращения: