Глянул быстро (еще не копал) , нашел обращение к 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
Вы правы - это фундаментальная проблема, опасно сравнивать числа с плавающей запятой. В важных местах постоянно приводите числа к определенной точности через Normalize().
какая реализация арифметики у вас используется?
Стандартная на типе double (8 байт).
Кстати, мы все передаваемые цены в торговых запросах принудительно нормализуем дабы избежать ошибок. Можно послать запрос на стоп-лосс как 1.2932461, но выставится 1.2932 . Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?
3 человека смотрело =) пришёл Ренат и просто показал пальцем на ошибку =))) сейчас проверю, конечно, но скорей всего дело именно в этом... я не нормализовал "bid - TrailingStop * point", а в модификации ордера участвует именно эта конструкция... невнимательно мы как-то, господа ;)
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Глянул быстро (еще не копал) , нашел обращение к point , которое у тебя вычисляется.
Попробуй "выбросить" его и поставить тупо Point. Возможно, проблема в этом (point через МаркетИнфо можеь быть не всегда выходит такой как тебе надо?).
да по идее всегда...
хотя можно и его попробовать нормализовать =)
и это не всегда допустимо - эксперт может торговать по нескольким парам, и поинт у них может быть разным...
Допустим, orderstoploss = 1.29211 (5 цифр после запятой)
bid=1.29716 (тоже 5 цифр )
TrailingStop = 50
point =0.001
тогда (bid - TrailingStop * point)=1.29216>1.29211
Правда, для этого нужно, чтобы digits вдруг стало равно 5
И еще
можно безболезнено заменить на
проверка на отсутствие уровня стоплосса, мне кажется, не нужна при трейлинге.
Вообще-то , нужна, сам себя поправлю. Если мы выставляем стоп-лосс только при наличие профита, а в противном случае готовы пережидать до маржинкола.
Больше ничего не нашел. На какой паре у тебя не правильно работал трейлинг и не было ли при этом сильных движений?
Я все привожу к целым числам для сравнения. И вообще где только можно храню и
использую приведенные значения (в массивах, переменных и пр..)
Т.е. переменные типа int могут принимать значения от -2147483648 до 2147483647.
Эта размерность вполне годится для кроссов.
Соответственно 1.2999 и 1.3000 можно привести к 12999 и 13000, а потом благополучно их сравнить,
не боясь всякой лажи с периодами.
Тут набросал для примера примерчик :)
вот
//+------------------------------------------------------------------+ //| 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
на
Как вариант.
проверка на отсутствие уровня стоплосса, мне кажется, не нужна при трейлинге
Привет.
Я все привожу к целым числам для сравнения
2dev:
Вы правы - это фундаментальная проблема, опасно сравнивать числа с плавающей запятой.
В важных местах постоянно приводите числа к определенной точности через Normalize().
Стандартная на типе double (8 байт).
Кстати, мы все передаваемые цены в торговых запросах принудительно нормализуем дабы избежать ошибок.
Можно послать запрос на стоп-лосс как 1.2932461, но выставится 1.2932 .
Проверьте, пожалуйста, не в этом ли ошибка с попытками повторных установок стопа по той же цене?
3 человека смотрело =) пришёл Ренат и просто показал пальцем на ошибку =)))
сейчас проверю, конечно, но скорей всего дело именно в этом... я не нормализовал "bid - TrailingStop * point", а в модификации ордера участвует именно эта конструкция...
невнимательно мы как-то, господа ;)
вы имеете в виду Normalize(), который предложил Begun?
вы имеете в виду Normalize(), который предложил Begun?
Извиняюсь, имел в виду стандартную NormalizeDouble.