Вот что я называю двойной банкой с червями. (каламбур, конечно;)
Похоже, что из нескольких предложенных пользовательских функций ни одна не достигла консенсуса. Кто-нибудь может поделиться, какую функцию CompareDouble он использует в качестве повседневной?
Очевидно, что мы должны использовать какую-то пользовательскую функцию CompareDouble, если мы хотим иметь надежные системы.
Проблему можно игнорировать, в основном, если только не важно точное значение.
Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую Bid > trigger. Если из-за округления цена срабатывает по цене, мне все равно.
Если я хочу открыться после или около (возможно, ненормализованной) цены срабатывания, я проверяю наличие разрыва: Bid > trigger && Bid < trigger+3*pips2dbl. Рынок может легко сдвинуться на целый пункт за один тик, поэтому Bid == trigger всегда неверно, а MathAbs(bid-trigger) < Point/2 верно, но, скорее всего, не сработает.
Если равенство важно, например, я хочу передвинуть SL, но нахожусь слишком близко к рынку(уровень стопа), тогда я использую Bid - newSL > StopLelvel - Point/2.
Проблему можно игнорировать, в основном, если только не важно точное значение.
Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую Bid > trigger. Если из-за округления цена сработает по цене, меня это не волнует.
Если я хочу открыться после или около (возможно, ненормализованной) цены срабатывания, я проверяю наличие разрыва: Bid > trigger && Bid < trigger+3*pips2dbl. Рынок может легко сдвинуться на целый пункт за один тик, поэтому Bid == trigger всегда неверно, а MathAbs(bid-trigger) < Point/2 верно, но, скорее всего, не сработает.
Если равенство важно, например, я хочу переместить SL, но нахожусь слишком близко к рынку (уровень стопа), тогда я использую Bid - newSL > StopLelvel - Point/2.
Спасибо. Вот это я бы назвал декоктированным потоком...
На самом деле то, что вы упомянули, очень близко к моему приложению: Я устанавливаю, отличается ли новый TakeProfit (по стандартам брокера или MQL4) от первоначального TakeProfit, уже установленного и отправленного. Я сравниваю два значения индикатора и два значения TakeProfit до вызова OrderModify.
if (Volume[0]>1)return;
for(int b=OrdersTotal()-1;b>=0; b--)
{
if(atr2kTP == atr2kTPAdjust|| btphold==btp)) return;//-----------This is where I am comparing them, and where the function would go.if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICMA)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_BUY)
atr2kTPAdjust=atr2kTP;
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);
}
for(int s=OrdersTotal()-1;s>=0; s--)
{
if(atr2kTP == atr2kTPAdjust|| stphold==stp) return;
if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICMA)
if(OrderSymbol()==Symbol())
if(OrderType()==OP_SELL)
atr2kTPAdjust=atr2kTP;
OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
}
}
Это был мой окончательный код OrderMod, использующий фильтр Point/2 для сравнения значений двойных заказов. Работал без ошибок и модифицировал заказы каждый раз. Спасибо!
MathAbs радует, я думал, что он конвертирует только отрицательные значения в левой части уравнений, не знал, что он также конвертирует разность в положительное значение.
Точность Point/2 не важна для моих сигнальных целей. Я лишь хотел избежать ошибок округления, чтобы избежать некачественного кодирования.
Я бы предпочел пресекать частотные ошибки так же, как и ошибки округления. Поэтому я хочу использовать наиболее безошибочные стабильные вычисления, в отличие от наиболее точного кода вычислений.
Значит, увеличив сравнение TakeProfit MathAbs (stphold - stp) еще больше до >2*пипсов, я должен иметь наибольший шанс устранить ошибки округления и ошибки частоты?
Ранее я обнаружил проблемы с IsNewCandle, поэтому я переключился на триггер Volume. Если обработка тиков объема может быть медленной или отсутствовать, то и свечи могут быть такими же. Так что оба варианта были плохой идеей.
Так как newBar работает нормально, я попытался определить неудачные случаи IsNewCandle, используя следующий код:
Вызов функции IsNewCandle() находится внутри start(), ПЕРЕД строкой кода newBar. (Этот тест печати не сработал, вместо этого он печатал на каждом новом баре.
На мой взгляд, это плохая идея - помещать проверку нового бара в функцию, функция используется для того, чтобы сделать код многократно используемым... попробуйте вызвать IsNewCandle() дважды во время одного и того же первого тика нового бара и посмотрите, какие ответы вы получите....
Кстати ... это не по теме данной темы, если вы хотите продолжить обсуждение, пожалуйста, перенесите его в новую тему. Я наведу порядок позже...
Вот что я называю двойной банкой с червями. (каламбур, конечно;)
Похоже, что из нескольких предложенных пользовательских функций ни одна не достигла консенсуса. Кто-нибудь может поделиться, какую функцию CompareDouble он использует в качестве повседневной?
Очевидно, что мы должны использовать какую-то пользовательскую функцию CompareDouble, если мы хотим иметь надежные системы.
Проблему можно игнорировать, в основном, если только не важно точное значение.
Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую Bid > trigger. Если из-за округления цена срабатывает по цене, мне все равно.
Если я хочу открыться после или около (возможно, ненормализованной) цены срабатывания, я проверяю наличие разрыва: Bid > trigger && Bid < trigger+3*pips2dbl. Рынок может легко сдвинуться на целый пункт за один тик, поэтому Bid == trigger всегда неверно, а MathAbs(bid-trigger) < Point/2 верно, но, скорее всего, не сработает.
Если равенство важно, например, я хочу передвинуть SL, но нахожусь слишком близко к рынку(уровень стопа), тогда я использую Bid - newSL > StopLelvel - Point/2.
Проблему можно игнорировать, в основном, если только не важно точное значение.
Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую Bid > trigger. Если из-за округления цена сработает по цене, меня это не волнует.
Если я хочу открыться после или около (возможно, ненормализованной) цены срабатывания, я проверяю наличие разрыва: Bid > trigger && Bid < trigger+3*pips2dbl. Рынок может легко сдвинуться на целый пункт за один тик, поэтому Bid == trigger всегда неверно, а MathAbs(bid-trigger) < Point/2 верно, но, скорее всего, не сработает.
Если равенство важно, например, я хочу переместить SL, но нахожусь слишком близко к рынку (уровень стопа), тогда я использую Bid - newSL > StopLelvel - Point/2.
Спасибо. Вот это я бы назвал декоктированным потоком...
На самом деле то, что вы упомянули, очень близко к моему приложению: Я устанавливаю, отличается ли новый TakeProfit (по стандартам брокера или MQL4) от первоначального TakeProfit, уже установленного и отправленного. Я сравниваю два значения индикатора и два значения TakeProfit до вызова OrderModify.
Это был мой окончательный код OrderMod, использующий фильтр Point/2 для сравнения значений двойных заказов. Работал без ошибок и модифицировал заказы каждый раз. Спасибо!
newBar работает отлично.
MathAbs радует, я думал, что он конвертирует только отрицательные значения в левой части уравнений, не знал, что он также конвертирует разность в положительное значение.
Точность Point/2 не важна для моих сигнальных целей. Я лишь хотел избежать ошибок округления, чтобы избежать некачественного кодирования.
Я бы предпочел пресекать частотные ошибки так же, как и ошибки округления. Поэтому я хочу использовать наиболее безошибочные стабильные вычисления, в отличие от наиболее точного кода вычислений.
Значит, увеличив сравнение TakeProfit MathAbs (stphold - stp) еще больше до >2*пипсов, я должен иметь наибольший шанс устранить ошибки округления и ошибки частоты?
Большое спасибо.
newBar работает отлично.
Ранее я обнаружил проблемы с IsNewCandle, поэтому я переключился на триггер Volume. Если обработка тиков объема может быть медленной или отсутствовать, то и свечи могут быть такими же. Так что оба варианта были плохой идеей.
Так как newBar работает нормально, я попытался определить неудачные случаи IsNewCandle, используя следующий код:
Вызов функции IsNewCandle() находится внутри start(), ПЕРЕД строкой кода newBar. (Этот тест печати не сработал, вместо этого он печатал на каждом новом баре.
На мой взгляд, это плохая идея - помещать проверку нового бара в функцию, функция используется для того, чтобы сделать код многократно используемым... попробуйте вызвать IsNewCandle() дважды во время одного и того же первого тика нового бара и посмотрите, какие ответы вы получите....
Кстати ... это не по теме данной темы, если вы хотите продолжить обсуждение, пожалуйста, перенесите его в новую тему. Я наведу порядок позже...
.... Поскольку цены могут меняться только на величину, кратную пункту, пункт/2 - это как раз то, что нужно....
Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные величины, например, средние цены, Point/2 не подойдет.
Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные показатели, например, средние цены, Point/2 не подойдет.
Вы обратили внимание на название этой темы?
;)
Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные значения, например, средние цены, Point/2 не подойдет.