Может ли цена != цена ? - страница 6

 

Вот что я называю двойной банкой с червями. (каламбур, конечно;)

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

Очевидно, что мы должны использовать какую-то пользовательскую функцию CompareDouble, если мы хотим иметь надежные системы.

 

Проблему можно игнорировать, в основном, если только не важно точное значение.

Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую Bid > trigger. Если из-за округления цена срабатывает по цене, мне все равно.

Если я хочу открыться после или около (возможно, ненормализованной) цены срабатывания, я проверяю наличие разрыва: Bid > trigger && Bid < trigger+3*pips2dbl. Рынок может легко сдвинуться на целый пункт за один тик, поэтому Bid == trigger всегда неверно, а MathAbs(bid-trigger) < Point/2 верно, но, скорее всего, не сработает.

Если равенство важно, например, я хочу передвинуть SL, но нахожусь слишком близко к рынку(уровень стопа), тогда я использую Bid - newSL > StopLelvel - Point/2.

 
WHRoeder:

Проблему можно игнорировать, в основном, если только не важно точное значение.

Если я хочу открыться выше (возможно, ненормализованной) цены срабатывания, я использую 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 для сравнения значений двойных заказов. Работал без ошибок и модифицировал заказы каждый раз. Спасибо!

void AutoAdjustTakeProfit()
{
if (Volume[0]>1 || atr2kTP == atr2kTPAdjust)return;  

       for(int b=OrdersTotal()-1;b>=0; b--)
          { 
            if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==MAGICMA)
                 if(OrderSymbol()==Symbol())
                    {          
                      if(OrderType()==OP_BUY)// buy ordeer section
                        {  
                          if((btphold-btp> Point/2) || (btphold-btp<-Point/2))  //--------------------------This is the DoubleCompare Code
                            {                                                                             
                              atr2kTPAdjust=atr2kTP; 
                              OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),btp,0,CLR_NONE);                          
                            }
                        } 
                     
                      if(OrderType()==OP_SELL) // Sell ordeer section
                        {   
                          if((stphold-stp>Point/2) || (stphold-stp <-Point/2)) //--------------------------This is the DoubleCompare Code
                            {                                                  
                               atr2kTPAdjust=atr2kTP;                      
                               OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),stp,0,CLR_NONE);
                            }
                        }
                    }
           }
}
 
  1. if (Volume[0]>1)return;
    Если вы пропустите несколько тиков в начале нового бара, ваш код не выполнится. Всегда используйте время
  2.   if((stphold-stp>Point/2) || (stphold-stp <-Point/2))
      if( MathAbs(stphold - stp) > Point/2) // Simplified
    Опять же, действительно ли вы заботитесь о равенствах? Если вы используете:
      if( MathAbs(stphold - stp) >= Point)
    , он может сработать при значении чуть меньше точки. Это все равно то же самое, что не равно.
  3. Зачем сдвигать их на пункт, сдвигайте их на пипсы и избегайте проблемы округления и ERR_TOO_FREQUENT_REQUESTS.
 

newBar работает отлично.

MathAbs радует, я думал, что он конвертирует только отрицательные значения в левой части уравнений, не знал, что он также конвертирует разность в положительное значение.

Точность Point/2 не важна для моих сигнальных целей. Я лишь хотел избежать ошибок округления, чтобы избежать некачественного кодирования.

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

Значит, увеличив сравнение TakeProfit MathAbs (stphold - stp) еще больше до >2*пипсов, я должен иметь наибольший шанс устранить ошибки округления и ошибки частоты?

Большое спасибо.

removed.

 
moneycode:

newBar работает отлично.

Ранее я обнаружил проблемы с IsNewCandle, поэтому я переключился на триггер Volume. Если обработка тиков объема может быть медленной или отсутствовать, то и свечи могут быть такими же. Так что оба варианта были плохой идеей.

Так как newBar работает нормально, я попытался определить неудачные случаи IsNewCandle, используя следующий код:

Вызов функции IsNewCandle() находится внутри start(), ПЕРЕД строкой кода newBar. (Этот тест печати не сработал, вместо этого он печатал на каждом новом баре.

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

Кстати ... это не по теме данной темы, если вы хотите продолжить обсуждение, пожалуйста, перенесите его в новую тему. Я наведу порядок позже...

 
WHRoeder:

.... Поскольку цены могут меняться только на величину, кратную пункту, пункт/2 - это как раз то, что нужно....


Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные величины, например, средние цены, Point/2 не подойдет.
 
HarriMQL4:

Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные показатели, например, средние цены, Point/2 не подойдет.


Вы обратили внимание на название этой темы?

;)

 
HarriMQL4:

Если вы сравниваете цены, хорошо. Однако если вы сравниваете двойные значения, например, средние цены, Point/2 не подойдет.
Цены удваиваются. . .