К разработчикам OrderModify (error 1) - Глюки в истории или перегрев Процессора? . . . - страница 2

 
Valmars >>:

В дополнение: +1 во второй строке, пожалуй, лишняя. Просто, при переходе на 5 знак некоторое время назад, я обнаружил, что корректно работающий ранее код, стал выдавать ошибки ( в тестере №: 1, 130) и решил заложиться на все возможные причины. Сейчас, прогнав на истории, убедился, что достаточно условие:

А вот замечание относительно первой строки остаётся в силе, вот пример из тестера: при Delta=1:

А вот тот же эксперт при Delta=0:

    Дело в том, что в основе Советника лежит продвижение стопов относительно цены 1-го бара по MA MAX и MA MIN цен. Поэтому двигаючтя оба уровня (TP\SL). В случае  широкодиапазонной свечи срабатывает TP или SL и программа не ждет, когда цены вернуться назад  - т.е. "шпилька" или "шип" такому Советнику не страшны - т.к. биение цены на 0-м баре с широким диапазоном не имеет значения.  Разумеется это дает некоторое запаздывание, но зато стабильно работает. Что касается Ошибки error 1 - ваш совет очень помог. Огромное Спасибо - на промежутке истории с 2003 по середину 2009 ни одной ошибки error 1, Однако появилось 3 ошибки error 130 которых раньше не было, но на 5 лет тестирования это мелочь - откорректируем. Если Вам любопытно привожу функцию модификации позиций в прикрепленном файле.

P.S. Чтоб у вас все было и вам за это ничего не было.

Файлы:
 
Scriptong >>:

Ошибка 1 чаще всего возникает при попытке изменения стопа на такую же величину. Чтобы этого не случалось добавляйте условие:

  где NewSL - новое значение стопа

        OldSL - OrderStopLoss()


Прекрасно об этом знаю и использую - вы невнимательно прочли предыдущие публикации. Modify Error 1 - это следствие появления в котировках 5-го знака. Ошибка  modify error 1 возникает именно на тестере стратегий и именно в OrderModify(). Прекрасно корректируется (error 1 исчезает совсем) через такую операцию (Спасибо Valmars'у за полезные советы и консультацию):


SellStopLoss=NormalizeDouble((SellStopLoss-Point),Digits);//Воизбежание ошибок с 5-м знаком
SellTakeProfit=NormalizeDouble((SellTakeProfit+Point),Digits);//добавим смещение на 1 пункт.
OrderModify(OrderTicket(),OrderOpenPrice(),SellStopLoss,SellTakeProfit,0,Red); //для Короткой

BuyStopLoss=NormalizeDouble((BuyStopLoss+Point),Digits);//Воизбежание ошибок с 5-м знаком
BuyTakeProfit=NormalizeDouble((BuyTakeProfit-Point),Digits);//добавим смещение на 1 пункт.
OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopLoss,BuyTakeProfit,0,Blue); //для Длинной


Спасибо Вам за участие.


P.S. Чтоб у вас все было и вам за это ничегг не было.

 
Valmars >>:

В дополнение: +1 во второй строке, пожалуй, лишняя. Просто, при переходе на 5 знак некоторое время назад, я обнаружил, что корректно работающий ранее код, стал выдавать ошибки ( в тестере №: 1, 130) и решил заложиться на все возможные причины. Сейчас, прогнав на истории, убедился, что достаточно условие:

А вот замечание относительно первой строки остаётся в силе, вот пример из тестера: при Delta=1:

А вот тот же эксперт при Delta=0:

    Доброго времени суток! По поводу error 130 - я тут потестил Советника на старой (до 2005 года) истории и на разрывах, а также на очень вялом рынке и получил от 20 до 100 error 130 на разных инструментах (Правдо менять таймфреймы не пробовал). В общем так родилась поправка, которая напрочь убила error 130. Возможно не самое лучшее решение, но оно неплохо работает. А решение вот такое (Не самое изящное):


SellStopLoss=NormalizeDouble((StaticPriceClose+Step),Digits); //Короткий LOSS идет за ценой.
if (SellStopLoss<NormalizeDouble((ASKPrice+Spread+StopShift),Digits)) //Если стопы слишком близко к текущей цене
{SellStopLoss=NormalizeDouble((ASKPrice+Spread+StopShift),Digits);} //тогда они принудительно раздвигаются шире.

SellTakeProfit=NormalizeDouble((StaticPriceClose-(Step*2)),Digits); //Короткий PROFIT идет перед ценой.
if (SellTakeProfit>NormalizeDouble((ASKPrice-Spread-StopShift),Digits)) //Если стопы слишком близко к текущей цене
{SellTakeProfit=NormalizeDouble((ASKPrice-Spread-StopShift),Digits);}//тогда они принудительно раздвигаются шире.

BuyStopLoss=NormalizeDouble((StaticPriceClose-Step),Digits); //Длинный LOSS идет за ценой.
if (BuyStopLoss>NormalizeDouble((BIDPrice-Spread-StopShift),Digits)) //Если стопы слишком близко к текущей цене
{BuyStopLoss=NormalizeDouble((BIDPrice-Spread-StopShift),Digits);} //тогда они принудительно раздвигаются шире.

BuyTakeProfit=NormalizeDouble((StaticPriceClose+(Step*2)),Digits); //Длинный PROFIT идет перед ценой.
if (BuyTakeProfit<NormalizeDouble((BIDPrice+Spread+StopShift),Digits)) //Если стопы слишком близко к текущей цене
{BuyTakeProfit=NormalizeDouble((BIDPrice+Spread+StopShift),Digits);} //тогда они принудительно раздвигаются шире.


StaticPriceClose - цена закрытия Первого бара (Или любого другого если нужно).

Step - Сдвиг для SL\TP ордеров  (вычисляет каждый для себя - посвоему)  заранее приведенный к виду 0,0xxxx.

StopShift - Необходимый отступ от текущей цены по MarketInfo(CurrentSymbol,MODE_STOPLEVEL) заранее приведенный к виду 0,0xxxx.

CurrentSymbol \ BIDPrice \ ASKPrice  \   Digits - вроде бы и так понятно зачем.

Spread - Спред по MarketInfo(CurrentSymbol,MODE_SPREAD) заранее приведенный к виду 0,0xxxx.

Хотя всего-то и разница в 3-7 пунктов, по сравнению с вариантом без учета Спреда, но ни следа не оставляет от error 130. Хотя надо еще потестить. . .

P.S. Чтоб у вас все было и вам за это ничего не было.

 
AlexTrader0618 >>:

Приветствую всех интересующихся!

Если нет глюков в истории - то может есть в тестере стратегий. Как объяснить такое поведение?


Или такое. . . Открытие происходит по несуществующей цене? И закрытие - по той цене. которой не было. . .


Остается еще много вопросов . . . Когда известно, что Slippage=0.0. (Цена только по заявке - никаких отклонений).

Также известно, что проверка (строго больше '0' - ошибка в неправильной или пустой цене исключена) и нориализация цен (по переменной 'Digits' для каждого инструмента) проводится как надо. Каким образом ведет себя тестер - неясно . . . Жду мнений. Заранее Спасибо!

P.S. Чтоб у вас все было и вам за это ничего не было.



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

А на картинках всё правильно.

1. Учтите, что на графике вы видите цены бидовые, а бай совершается по аскам

2. Походу на картинках произошло закрытие по стопу (тралу)

3. Насчет температуры процессора - поставьте нормальное охлаждение, чтобы в тестах было не больше 50-55 градусов

 
Pegasmaster >>:

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

А на картинках всё правильно.

1. Учтите, что на графике вы видите цены бидовые, а бай совершается по аскам

2. Походу на картинках произошло закрытие по стопу (тралу)

3. Насчет температуры процессора - поставьте нормальное охлаждение, чтобы в тестах было не больше 50-55 градусов

1. Спасибо, я об этом знаю.

2. Да именно по тралу и что это меняет?

3.Легко сказать - нормальное охлаждение - для AMD X3-го это проблемма т.к. X3 серия (3 ядра) вся дико греется. А тактовый генератор работает с    температурой 80 градусов (номинальной) т.к. для Gigabyte'овских матерей это нормальная температура генератора. Вопрос остался открытым - может ли    перегрев искажать результаты тестов? 

4.Был 3 раза за год такой случай: после зависания терминала и аварийного (принудительного) закрытия - системные часы отставали на 2 часа или убегали    вперед также на  2 часа. Могло ли это быть следствием перегрева генератора или это терминал скосил системное время в винде?

За любую инфу заранее Спасибо!

P.S. Чтоб у вас все было и вам за это ничего не было.

 
AlexTrader0618 >>:

1. Спасибо, я об этом знаю.

2. Да именно по тралу и что это меняет?

3.Легко сказать - нормальное охлаждение - для AMD X3-го это проблемма т.к. X3 серия (3 ядра) вся дико греется. А тактовый генератор работает с    температурой 80 градусов (номинальной) т.к. для Gigabyte'овских матерей это нормальная температура генератора. Вопрос остался открытым - может ли    перегрев искажать результаты тестов? 

4.Был 3 раза за год такой случай: после зависания терминала и аварийного (принудительного) закрытия - системные часы отставали на 2 часа или убегали    вперед также на  2 часа. Могло ли это быть следствием перегрева генератора или это терминал скосил системное время в винде?

За любую инфу заранее Спасибо!

P.S. Чтоб у вас все было и вам за это ничего не было.

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

Очень сильно сомневаюсь, чтобы после или вовремя перегрева искажались результаты тестов. Это чисто мое мнение.

 
meta-trader2007 >>:

Это просто кривые ручки. При тралении необходимо проводить нормализацию значений цены.

Не надо. Терминал сам нормализует. Но вот менять цену на 0,01 пункта не стоит, да.

 
wise >>:

Не надо. Терминал сам нормализует. Но вот менять цену на 0,01 пункта не стоит, да.

Доброго времени суток!


     В продолжение темы:  при переходе на  с 4-х знаков на 5 и обратно только одна конструкция оказалась работоспособной на всех инструментах от 2-х до 5 знаков. Проверял на 5 валютных спотах и 5 кроссах. Здесь задается необходимая точность в виде константы - без привлечения переменной среды Digits. Возможно и с ней будет нормально (если заменить внешнюю ConstantDigits на терминальную Digits) т.к. ее сделали внешней для экпериментирования на тестере стратегий.  А по поводу


терминал сам все нормализует

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

P.S.Чтоб у вас все было и вам за это ничего не было.

Файлы:
 
AlexTrader0618 >>:

Нормализует да, но на тестере стратегий - похоже не всегда.

Через раз?! =)

Я бы исходил из того, что нормализует всегда. Но иногда проявляется какой-то другой эффект.

Следующий вариант кода (В прикрепленном файле) опускает стопы для короткой или поднимает для днинной позиции - по команде. Этот вариант кода пока работает безотказно.

P.S.Чтоб у вас все было и вам за это ничего не было.

Спасибо, я без стопов торгую. У меня синтетика. Там стопы не поставишь.

 

Глянул функцию. Слишком громозко. =(

В не последнюю очередь, из-за избытка NormalizeDouble. Ошибка с кодом 1, кстати, не фатальна. Лучше на нее наплевать, чем такой код городить, а потом где-то в нем чуток ошибиться с тяжелыми последствиями.

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