Помогите определить пересечение линий в UTPOW

 
   double UTPOW_0 = iCustom(NULL, 0, "UTPOW", 699999996, 1.0, 1000, 3, 12, 30, 0, 0);   // зеленая 
   double UTPOW_1 = iCustom(NULL, 0, "UTPOW", 699999996, 1.0, 1000, 3, 12, 30, 1, 0);   // красная  
   double UTPOW_0_old = iCustom(NULL, 0, "UTPOW", 699999996, 1.0, 1000, 3, 12, 30, 0, 1);  // зеленая, шаг назад
   double UTPOW_1_old = iCustom(NULL, 0, "UTPOW", 699999996, 1.0, 1000, 3, 12, 30, 1, 1);  // красная, шаг назад

    if (UTPOW_0 == UTPOW_1)  // если индикаторы совпадают, т.е. пересекаются в одной точке
      {
        if (UTPOW_0_old > UTPOW_1_old)
          { // если зеленая пересекает красную снизу вверх, то открываем бай
            NewOrder(OP_SELL,Lot);
          }
        if (UTPOW_0_old < UTPOW_1_old)
          { // если зеленая пересекает красную сверху вниз, то открываем селл
            NewOrder(OP_BUY,Lot);
          }          
      }

В итоге ордера вообще не открывает, советник не видит пересечений линий. Или данное условие не применимо?

if (UTPOW_0 == UTPOW_1)

Интересно получается, если ставлю Print на вывод, т.е. Print(UTPOW_0), в журнале странные цифры 0,-1,4,7 и пр... Но за текущий день таких параметров не было вообще, откуда они? :) Но вот если все перенести в скрипт и вывести в Alert, цифры адекватные: 20.000, 24.000 и пр. В чем проблемка?

 
Uquwnd:

В итоге ордера вообще не открывает, советник не видит пересечений линий. Или данное условие не применимо?

Интересно получается, если ставлю Print на вывод, т.е. Print(UTPOW_0), в журнале странные цифры 0,-1,4,7 и пр... Но за текущий день таких параметров не было вообще, откуда они? :) Но вот если все перенести в скрипт и вывести в Alert, цифры адекватные: 20.000, 24.000 и пр. В чем проблемка?


Сравнивать действительные значения. Так они никогда не совпадут. Пересечение проверяется по другому совсем.

А по поводу значений. Надо еще и индикатор смотреть. А то может некорректное обращение к нему идет.

 
Uquwnd:

В итоге ордера вообще не открывает, советник не видит пересечений линий. Или данное условие не применимо?

Интересно получается, если ставлю Print на вывод, т.е. Print(UTPOW_0), в журнале странные цифры 0,-1,4,7 и пр... Но за текущий день таких параметров не было вообще, откуда они? :) Но вот если все перенести в скрипт и вывести в Alert, цифры адекватные: 20.000, 24.000 и пр. В чем проблемка?

if (UTPOW_0 >= UTPOW_1 && UTPOW_0_old <= UTPOW_1_old){Sell}
if (UTPOW_0 <= UTPOW_1 && UTPOW_0_old >= UTPOW_1_old){Buy}
 

Обычно, если есть две линии х0-х1 и у0-у1, точка пересечения определяется как

if(x0<y0&&x1>y1) или наоборот if(x0>y0&&x1<y1) в зависимости в какую сторону пересечение. 

 
Vinin:


Сравнивать действительные значения. Так они никогда не совпадут. Пересечение проверяется по другому совсем.

А по поводу значений. Надо еще и индикатор смотреть. А то может некорректное обращение к нему идет.


Как это можно проверить?
 
Uquwnd:

Как это можно проверить?

Варианты проверки пересечения выше были предложены.
 
Он, наверное имел ввиду проверить работоспособность индикатора. В Терминале нажми Ctrl-D и проведи мышкой по графику, в окне данных будут показания Вашего индикатора.
 

Если там все в порядке, прогони маленький скрипт

int start()
  {
//----
 for(int i=30;i>=0;i--)
   {
   double mk=iCustom(NULL, 0, "UTPOW", 699999996, 1.0, 1000, 3, 12, 30, 0, i);
   Print(" i - ",i," ind - ",DoubleToStr(mk,8));
   }  
//----
   return(0);

и посмотри в журнале значения. 

 
Спасибо за ответы. Помогло :)
 
if (UTPOW_0 >= UTPOW_1 && UTPOW_0_old <= UTPOW_1_old){Sell}
if (UTPOW_0 <= UTPOW_1 && UTPOW_0_old >= UTPOW_1_old){Buy}
Проблемка. Такой вариант не всегда срабатывает при пересечениях. В чем может быть дело?


Например:

по GBRUSD 18.08.10 сработало только на sell в 21:00

а 19.08.10 вообще при пересечении не открыл ордера, хотя по графику оно явное.

 

При получении значения из индикатора сделай нормализацию точности

UTPOW??? = NormalizeDouble(iCustom (...), Digits);

Должно помочь при сравнении даблов.

Причина обращения: