Ну и дела.....а тестер то врёт!! - страница 2

 
Обязательно поставьте последний билд 200 ("торговый терминал MetaTrader 4"), проверьте графики котировок (М15, М5 и М1), чтобы не было расхождений, и проверьте снова.

Лучше всего опубликовать код эксперта, чтобы остальные тоже могли проверить.
 
оке...чуть позже всё будет...
 
Хм, возможно тестер в 200 билде и правда слегка поехал. Впервые за всё время начал получать ошибку: invalid ticket for OrderClose function на команде
OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);

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

    if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==false) {
      Print("OrderSelect, ошибка (",err,"): ",ErrorDescription(err));
      break;
    }

проходит без сообщений об ошибке, претензий у OrderClose к OrderTicket() быть не должно.

Это было несколько дней назад. Сегодня же я получил сообщение

OrderSend failed with error #4107, invalid price parameter for trade function
invalid price 1.30944998 for OrderSend function


Конечно я могу сам нормализовать Ask и Bid, но раз они предоставляются разработчиками, таких сюрпризов быть не должно бы, ИМХО.
P.S. Второй эффект возможно имел место и в прежних билдах, что-то такое помнится вроде.
P.P.S.Прошу прощения, соообщение-то про OrderSend. Но проблема в том, что ордеры не закрываются. Сейчас разберусь и отредактирую пост

 
Предыдущий пост отредактирован. Второй эффект есть, он возникает в
Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Blue);


Ордера не закрывались по причине того, что я не дописал обработку ордеров. Я ассоциировал это с первым эффектом из прошлого поста раньше, чем проверил код и впав в состояние аффекта бросился писать на форум :).
На всякий случай уточню: Оба описанных в предыдущем посте эффекта имеют место. Первый я получил на билде 200, второй встречался и ранее.

 
А тиковая история чья?
По всей видимости не самого терминала, так как все наши сгенерированные тики нормализованные. А тут вылезла цена 1.30944998, которая которая никак не может быть корректной. И эта цена не может быть близким округлением, так как различается на целых 2 пункта в восьмом знаке.

Об этом уже писали - такая ошибка бывает при использовании чужой самостоятельно сгенерированной истории, где не используется нормализация.
 
А тиковая история чья?
По всей видимости не самого терминала, так как все наши сгенерированные тики нормализованные. А тут вылезла цена 1.30944998, которая которая никак не может быть корректной. И эта цена не может быть близким округлением, так как различается на целых 2 пункта в восьмом знаке.

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

Да, похоже причина второго эффекта именно в этом. Но первый остаётся, и он более неприятен, потому что накапливаются незакрытые ордера и картина тестирования искажается.
 
Вспомнил ещё деталь. После появления первой проблемы я сразу вставил перед OrderClose() команду Print(OrderTicket()); . Результат был таким: печать есть когда всё нормально и отсутствует при ошибке. Что странно, поскольку она стоит перед командой, о которой говорится с сообщении об ошибке.
 
Вопрос снят. Вероятнее всего первый эффект происходил из-за моей ошибки. Удалось разыскать кусок кода, который скорее всего использовался в том эксперте - там в OrderClose не OrderTicket(), а моя переменная - то есть теоретически возможен просчёт. Искать я его не буду, тот код своё отыграл.
 
OrderSend failed with error #4107, invalid price parameter for trade function
invalid price 1.30944998 for OrderSend function

С такой ошибкой я периодически встречался в разных билдах. Это абсолютно точно, т.к. в советниках специально занимался нормализацией всего, чего только можно. Как правило, в следующем билде эта ошибка не возникала. Котировки у меня одни и те же уже давно от Альпари. Правда опять же давно я с этим уже не сталкивался.
Но вот сейчас столкнулся с непонятной для меня ситуацией. Провел серию экспериментов, ничего не выяснил. Творческая мысль иссякла и теперь не знаю, что и думать. Поэтому и описываю ситуацию здесь, в надежде на разъяснения. Теперь сама ситуация. Сделал скрипт для вывода в файл *.scv значений хаев и лоу по определённому признаку. И всё никак не мог понять, почему размер у файла маленький, т.е. записей мало. Т.е. не просто мало, а существенно меньше, чем должно быть.
Серия экспериментов привела к приведённому ниже коду:
int start()
{
  string s="";
  for(int shift=0; shift<500; shift++)
  {
    s=s+DoubleToStr(shift,0)+"  ";
    Print(shift,"  ",TimeToStr(Time[shift],3));
  }
  Comment(s);
  return(0);
}


Т.е. выкинул из скрипта всё и вместо комады записи в файл вставил команду "Принт". Запускаем скрипт и смотрим. В коммент выводится всё прекрасно - с нулевого индекса. А вот в журнал (вкладка эксперты) выводятся строки далеко не с нулевого индекса. Много раз подряд "кидал" скрипт на чарт. Каждый раз первое значение индекса shift в первой строке разное - 257, 262,307... Если вместо shift<500 поставить shift<100, вывод начинается с shift=6. Почему бы это?

Второй момент. Запустил тестер в визуал-режиме. С интересом наблюдал, как линии Аск и Бид дрыгаются вместе с ценой, но независимо друг от друга. Т.е. значение спреда у нас теперь - величина переменная. Расстояние между этими линиями то больше, то меньше.

 
С выводом в файл разобрался. Всё записывается нормально. Но с командой "принт" выше описанная ситуация присутствует.
Причина обращения: