Сообщество Экспертописателей - страница 2

 
Для стопов лучше ввести \"загрубление\" (не знаю как правильно назвать).

Если отслеживать стоп с точностью до пипса, то брокер взвоет и отрубит экспертов :)

Думаю лучше так:
   if (MathAbs(CurrentStopLoss - NewStopLoss) > (Ask - Bid)*Koef)
   {
      // Modify Stop loss
      ................
   }


Т.е. модифицируем ордер есль новый стоп отличается от старого на заданное число спредов (1 - 2)
Ваша проблема тут автоматом решается.

 
Mak, спасибо за совет. Сделаю.
Только тут проблема в другом - оно пытается установить _на_то_же_значение_... т.е. такая проверка не спасёт от ошибки, а просто уменьшит её вероятность =)
 
Только тут проблема в другом - оно пытается установить _на_то_же_значение_... т.е. такая проверка не спасёт от ошибки, а просто уменьшит её вероятность =)

Скорее всего это глюк в тексте эксперта.
У меня было похожее, как исправилось, не помню.

Но пример выше гарантирует, что при любых ошибках в скрипте
попыток установки в то же значение не будет.
 
Только тут проблема в другом - оно пытается установить _на_то_же_значение_... т.е. такая проверка не спасёт от ошибки, а просто уменьшит её вероятность =)

Скорее всего это глюк в тексте эксперта.
У меня было похожее, как исправилось, не помню.

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

Mak, там текста 1 строка =)
_TrailingStop( orderticket, 50 );



я ф-цию именно для того и написАл, чтоб подобных ошибок избежать, и проверка такая же, с разницей, что каждый пипс отрабатывается.
А если значение такое же (расстояние от цены до стопа _меньше-равно_ 50 в данном случае) трейлинг не должен срабатывать.
Более того, в большинстве случаев он и не срабатывает =))) а иногда проскакивает почему-то....

 
Может NormalizeDouble иногда по разному срабатывает?
Он что делает, отбрасывает или округляет?

Вообще плавающие типы на равенство лучше никогда не сравнивать.
Единственное исключение:
double A,B;
..........
A = .......;
.............
B = A;
...........
if (B == A) ........



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

 
Он что делает, отбрасывает или округляет?
мне тоже интересно ;)

тут я у себя уже частично исправил: вместо
if ( orderstoploss == 0.0  ........ )


сделал

if ( orderstoploss <= 0 ......... )

а дальше вроде бы нормально:

 .... orderstoploss < ( bid - TrailingStop * point )  





Ренат, я вообще на вас основные надежды возлагаю =) тут наверняка что-нибудь простое, как угол - а я просто не замечаю...

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

komposter, ты не прав :) Как говорила девочка, гнущая ложки, "вещи не такие, какими они кажутся".
Например, следующий цикл печатет 5 чисел:
for (double d = 0.1; d <= 0.5; d += 0.1) Print(d);


А сколько напечатает следующий цикл, в котором границы увеличены на 1.0?

for (double d = 1.1; d <= 1.5; d += 0.1) Print(d);



Можно было бы ждать, что будет напечатано тоже 5 чисел, но напечается всего 4 (четыре). Не правда-ли, замечательно?
Если же после цикла добавить еще одну строчку:

Print("d=" + d + " (d <= 1.5)=" + (d <= 1.5));


мы получим:

d=1.50000000 (d <= 1.5)=0



Почти как у тебя со стопом, но более фундаментально :). Проблема стара, как первый компьютерный чип:
компьютеры используют двоичную арифметику, а люди десятичную. При округлении появляются артефакты.

"Огрубление", которое предлагал Mak, поможет, если у тебя фундаментальная проблема с округлением, а не банальный баг.

Многие считают, что в финансовых расчетах MUST USE специальные библиотеки десятичной арифметики, но даже они могут содержать ошибки, иногда
приводящие к серьезным последствиям. Ксати, Renat, а какая реализация арифметики у вас используется?

 
komposter

Глянул быстро (еще не копал) , нашел обращение к point , которое у тебя вычисляется.
Попробуй "выбросить" его и поставить тупо Point. Возможно, проблема в этом (point через МаркетИнфо можеь быть не всегда выходит такой как тебе надо?).