Проверка на расстояние до пивота

 

Добрый день.

Помогите разобраться с пивотом.

Есть формула: DS1 = (2*PP)-iHigh(Symbol(), PERIOD_D1, 1);

Как сделать такую проверку: если цена открытия свечи находится вблизи (выше чем пивот на 3 пункта) к уровню DS1 к примеру в пределах 5 пунктов - будет выполнена определенная функция?

Пытался так:  if(DS1+50*Point < Open[0]) {, и другие варианты (с перестановкой местами), но не срабатывает.

 
Алексей:

Добрый день.

Помогите разобраться с пивотом.

Есть формула: DS1 = (2*PP)-iHigh(Symbol(), PERIOD_D1, 1);

Как сделать такую проверку: если цена открытия свечи находится вблизи (выше чем пивот на 3 пункта) к уровню DS1 к примеру в пределах 5 пунктов - будет выполнена определенная функция?

Пытался так:  if(DS1+50*Point < Open[0]) {, и другие варианты (с перестановкой местами), но не срабатывает.


Так у вас два условия?

if ((Open[0]-Pivot==3) && (Open[0]-DS1<5 && Open[0]-DS1>-5) )

 
Aleksey Vyazmikin:

Так у вас два условия?

if ((Open[0]-Pivot==3) && (Open[0]-DS1<5 && Open[0]-DS1>-5) )


Попробовал так:

 if((Open[0]-DS1==3) && (Open[0]-DS1<5 && Open[0]-DS1>-5))

Не выходит, никак сообразить не могу.


Вот пример, есть уровень пивота (DS1) на цене 1.17030, нужная мне свеча открылась на цене 1.17059, открывается ордер, но мне нужно сделать так, чтобы этот ордер не открылся, если цена открытия ордера находится вблизи пивота на расстоянии 5 пунктов.

Файлы:
 
Алексей:

Попробовал так:

Не выходит, никак сообразить не могу.


Вот пример, есть уровень пивота (DS1) на цене 1.17030, нужная мне свеча открылась на цене 1.17059, открывается ордер, но мне нужно сделать так, чтобы этот ордер не открылся, если цена открытия ордера находится вблизи пивота на расстоянии 5 пунктов.


А вы уверены, что разница Open[0]-DLS1 может быть равна 5. Как минимум 5 надо умножить на Point()

if((Open[0]-DS1==3*Point()) && (Open[0]-DS1<5*Point() && Open[0]-DS1>-5*Point()))

 
Vitalii Ananev:

А вы уверены, что разница Open[0]-DLS1 может быть равна 5. Как минимум 5 надо умножить на Point()

if((Open[0]-DS1==3*Point()) && (Open[0]-DS1<5*Point() && Open[0]-DS1>-5*Point()))


Спасибо!

Получилось  то что нужно

if(Open[0]-DS1<4*Point())
{
}
 
Vitalii Ananev:

А вы уверены, что разница Open[0]-DLS1 может быть равна 5. Как минимум 5 надо умножить на Point()

if((Open[0]-DS1==3*Point()) && (Open[0]-DS1<5*Point() && Open[0]-DS1>-5*Point()))


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

Вот так выглядит сейчас функция проверки на пивот для продажи: 

  if(Open[0]-PP<4*Point() || Open[0]-DS1<4*Point() || Open[0]-DS2<4*Point() || Open[0]-DS1<4*Point() || Open[0]-DR1<4*Point() ||
      Open[0]-DR1<4*Point() || Open[0]-DR3<4*Point())
  {
//другие проверки
//открытие продажи
  }

Интересует проверка: Open[0]-DS1<4*Point()

Скриншот ошибочной сделки прикрепил.

Помогите понять, что делаю не так.

Файлы:
s1.png  8 kb
 
Алексей:

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

Вот так выглядит сейчас функция проверки на пивот для продажи: 

Интересует проверка: Open[0]-DS1<4*Point()

Скриншот ошибочной сделки прикрепил.

Помогите понять, что делаю не так.


А как должно быть на самом деле. По скриншоту не понятно.

Код указанный в скобках будет выполнен если хотя бы  одно из условий будет истинно

 if(Open[0]-PP<4*Point() || Open[0]-DS1<4*Point() || Open[0]-DS2<4*Point() || Open[0]-DS1<4*Point() || Open[0]-DR1<4*Point() ||
      Open[0]-DR1<4*Point() || Open[0]-DR3<4*Point())
 {
//другие проверки
//открытие продажи
  
  //код выполнится если хотя бы одно из условий будет true

 }

Проверяйте логическое условие. Для простоты разбейте условие на части.

Например так

bool log1 = Open[0]-PP<4*Point();

bool log2 = Open[0]-DS1<4*Point();

и т.д.

тогда оператор if будет выглядеть так: if (log1 || log2 ....) { } 

Я бы написал условие по другому. Например имеется некий уровень DS и надо если цена открытия свечи находится в пределах +/- 5 пунктов от этого уровня выполнить некие действия.

Тогда получается условие 1 bool log1 = Open[0]>DS-5*Point()

                            условие 2 bool log2 = Open[0]<DS+5*Point()

И все вместе if (log1 && log2) {....}

 
Vitalii Ananev:


Я бы написал условие по другому. Например имеется некий уровень DS и надо если цена открытия свечи находится в пределах +/- 5 пунктов от этого уровня выполнить некие действия.

Тогда получается условие 1 bool log1 = Open[0]>DS-5*Point()

                            условие 2 bool log2 = Open[0]<DS+5*Point()

И все вместе if (log1 && log2) {....}


В том и дело, что мне нужно не с двух сторон, а только с одной. Пришел вот к такому коду:

if((DR1-Open[0])*10000>4 && (DR2-Open[0])*10000>4 && (DR3-Open[0])*10000>4 || (DS1-Open[0])*10000>4 && (DS2-Open[0])*10000>4 &&
 (DS3-Open[0])*10000>4 || (PP-Open[0])*10000>4)
      


Но теперь, когда цена у нас между уровнем R2 и R1 ордер не открывается, а результат по условию выше (DR1-Open[0])*10000) равен -14.4.

Первый скриншот что имеется сейчас

И второй скриншот как должно быть

-----

Если я разбиваю условия на части if(log1 || log2 || log3 || log4 || log5 || log6) и с разделителем  || у меня сделка будет открываться всегда, даже если до DR2 менее 1 пункта, ведь до DR3 будет еще более 30 пунктов 

Если в условиях оставлю только: if((DR2-Open[0])*10000>4) то конечно сделка будет открыта правильно (скриншот 1)

Файлы:
1.png  9 kb
2.png  21 kb
 
Алексей:

В том и дело, что мне нужно не с двух сторон, а только с одной. Пришел вот к такому коду:


Но теперь, когда цена у нас между уровнем R2 и R1 ордер не открывается, а результат по условию выше (DR1-Open[0])*10000) равен -14.4.

Первый скриншот что имеется сейчас

И второй скриншот как должно быть

-----

Если я разбиваю условия на части if(log1 || log2 || log3 || log4 || log5 || log6) и с разделителем  || у меня сделка будет открываться всегда, даже если до DR2 менее 1 пункта, ведь до DR3 будет еще более 30 пунктов 

Если в условиях оставлю только: if((DR2-Open[0])*10000>4) то конечно сделка будет открыта правильно (скриншот 1)


Умножать на 1000 это не правильно. В случае USDJPY это работать не будет. Правильней будет (DR2-Open[0])/Point() если вам надо получить значение в пунктах. 

...

Я не знаю какую логику вы хотите в конечном счете получить. Используйте комбинацию операндов || и &&. Например (A>B || A<C) && (A>D || A<E)

|| Это не разделитель, а логический операнд который если по русски означает ИЛИ. && - Означает И. (A> B  ИЛИ  A<C) И  (A>D ИЛИ A<E)

то есть условие будет выполнятся если ((A>B = true ИЛИ A<C = true)= true)  И  ((A>D = true ИЛИ A<E = true) = true)

Алгебру логики погуглите.