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

 
komposter

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

да по идее всегда...
хотя можно и его попробовать нормализовать =)

и это не всегда допустимо - эксперт может торговать по нескольким парам, и поинт у них может быть разным...
 
Проблема стара, как первый компьютерный чип
это, конечно, грустно... но выкручиваться же как-то надо? Я надеюсь, Ренат что-нибудь скажет...
 
if ( orderstoploss == 0.0 || (  orderstoploss < ( bid - TrailingStop * point ) ) )


Допустим, orderstoploss = 1.29211 (5 цифр после запятой)
bid=1.29716 (тоже 5 цифр )
TrailingStop = 50
point =0.001
тогда (bid - TrailingStop * point)=1.29216>1.29211
Правда, для этого нужно, чтобы digits вдруг стало равно 5
И еще

if ( orderstoploss == 0.0 || (  orderstoploss < ( bid - TrailingStop * point ) ) )


можно безболезнено заменить на

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


проверка на отсутствие уровня стоплосса, мне кажется, не нужна при трейлинге.
Вообще-то , нужна, сам себя поправлю. Если мы выставляем стоп-лосс только при наличие профита, а в противном случае готовы пережидать до маржинкола.
Больше ничего не нашел. На какой паре у тебя не правильно работал трейлинг и не было ли при этом сильных движений?

 
Привет.
Я все привожу к целым числам для сравнения. И вообще где только можно храню и
использую приведенные значения (в массивах, переменных и пр..)
Т.е. переменные типа int могут принимать значения от -2147483648 до 2147483647.
Эта размерность вполне годится для кроссов.
Соответственно 1.2999 и 1.3000 можно привести к 12999 и 13000, а потом благополучно их сравнить,
не боясь всякой лажи с периодами.

Тут набросал для примера примерчик :)
int Normalize(double double_value, int digits) - приводит double в int  (1.2999 в 12999)
double Restore(int int_value, int digits) - приводит полученный ранее int в double (12999 в 1.2999)


вот

//+------------------------------------------------------------------+
//|                                                   ShiftPoint.mq4 |
//|                                                            Begun |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   return(0);
}
//+------------------------------------------------------------------+
int Normalize(double double_value, int digits)
{
	return (NormalizeDouble(double_value,digits)*MathPow(10,digits));
}
double Restore(int int_value, int digits)
{
	return (NormalizeDouble((int_value/MathPow(10,digits)),digits));
}
//+------------------------------------------------------------------+
int start()
{
	double	Test_Value =  1.29999999;
	int	Test_int;
	double	Test_double;

	Test_int         = Normalize(Test_Value,Digits);
	Test_double   = Restore(Test_int,Digits);
	Print("-----------------------------");
	Print("Restored value    = ",DoubleToStr(Test_double,Digits));
	Print("Shift Point Value = ",Test_int);
	Print("Real Double Value = ",DoubleToStr(Test_Value,8));
}
//+------------------------------------------------------------------+



output:
shiftpoint EURUSD,H1: Real Double Value = 1.29999999
shiftpoint EURUSD,H1: Shift Point Value = 13000
shiftpoint EURUSD,H1: Restored value = 1.3000

 
В общем, замени это
if ( orderstoploss < ( bid - TrailingStop * point )) )


на

if ( TrailingStop < ( bid -orderstoploss)/ point  )


Как вариант.

 
Спасибо всем за участие!
Rosh 17.04.05 22:29
проверка на отсутствие уровня стоплосса, мне кажется, не нужна при трейлинге
не согласен, трейлинг должен быть однозначным - если включён, значит СЛ выставлен.

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

В общем, замени это
сейчас попробую, может поможет ;) завтра расскажу...

Begun 17.04.05 22:46
Привет.
Я все привожу к целым числам для сравнения
Привет =) это, конечно, вариант... но я думал, что так извращаться не придётся.. хоть бы слово от разработчиков - всё таки им виднее..
 
Приношу извинения, не участвовал в обсуждении.

2dev:
Проблема стара, как первый компьютерный чип:

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

какая реализация арифметики у вас используется?

Стандартная на типе double (8 байт).

Кстати, мы все передаваемые цены в торговых запросах принудительно нормализуем дабы избежать ошибок.
Можно послать запрос на стоп-лосс как 1.2932461, но выставится 1.2932 .
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?
 
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?

3 человека смотрело =) пришёл Ренат и просто показал пальцем на ошибку =)))
сейчас проверю, конечно, но скорей всего дело именно в этом... я не нормализовал "bid - TrailingStop * point", а в модификации ордера участвует именно эта конструкция...
невнимательно мы как-то, господа ;)
 
В важных местах постоянно приводите числа к определенной точности через Normalize().

вы имеете в виду Normalize(), который предложил Begun?
 
В важных местах постоянно приводите числа к определенной точности через Normalize().

вы имеете в виду Normalize(), который предложил Begun?

Извиняюсь, имел в виду стандартную NormalizeDouble.