Условие для торговли на пробой экстремумов предыдущего дня

 

Коллеги, никак не получается составить правильное условие для открытия ордеров.. Сейчас у меня такие условия:

int OnInit()

{

   fPreviousBid = 0;

   return(INIT_SUCCEEDED);

int start()  

{

  double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point(); // Хай предыдущего дня

  double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point(); // Лоу предыдущего дня

  double TodayHi = iHigh(Symbol(),PERIOD_D1,0);                          // Хай текущего дня

  double TodayLow = iLow(Symbol(),PERIOD_D1,0);                         // Лоу текущего дня

   if (TodayHi>fUpperLevel) CheckHiLivels = 1; // Условие для торговли

   if (TodayLow<fLowerLevel) CheckLowLivels = 1; // Условие для торговли

    bool Open_Bay = fPreviousBid > 0 && Bid > fUpperLevel && fPreviousBid <= fUpperLevel && CheckHiLivels == 1;

   bool Open_Sell = fPreviousBid > 0 && Bid < fLowerLevel && fPreviousBid >= fLowerLevel && CheckLowLivels == 1;

fPreviousBid = Bid;

 

Советник торгует на пробой экстремумов предыдущего дня. Но бывает так, что он открывает ордера, когда экстремум текущего дня превышал экстремум предыдущего. Т.е. цена зашла не с той стороны. 

Скрин с описанием прилагаю. 

 

 
завести две переменные флага - где отмечать пробит/непробит. На перемене дня сбрасывать. Да и вообще удобнее отложками это решать, чем выдумывать условия
 
Maxim Kuznetsov:
завести две переменные флага - где отмечать пробит/непробит. На перемене дня сбрасывать. Да и вообще удобнее отложками это решать, чем выдумывать условия

Вот тут есть функция от Игоря Кима, её можно использовать, а вообще такое действительно лучше решать ордерами.

Вот сцылко

 

Достаточно ввести проверку на место открытия бара относительно текущей цены


if (TodayHi>fUpperLevel && Open[0] < Close[0]) CheckHiLivels = 1; // Условие для торговли

или относительно того-же уровня

if (TodayHi>fUpperLevel && Open[0] < fUpperLevel) CheckHiLivels = 1; // Условие для торговли

 

Важно, чтобы было первое пересечение за день. Допустим, посреди дня советник прикреплен на график (после первого пересечения и перед вторым), будет вход на втором пересечении уровня. Если делась сброс флага по открытию дня, то после запуска советника придется сутки ждать вхолостую. 

Значит при пересечении идти в цикле по истории, смотреть, первое ли это пересечение. Но это не есть хорошо для советника, сильно тормознуто будет. 

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

 
Dmitry Fedoseev:

Важно, чтобы было первое пересечение за день. Допустим, посреди дня советник прикреплен на график (после первого пересечения и перед вторым), будет вход на втором пересечении уровня. Если делась сброс флага по открытию дня, то после запуска советника придется сутки ждать вхолостую. 

Значит при пересечении идти в цикле по истории, смотреть, первое ли это пересечение. Но это не есть хорошо для советника, сильно тормознуто будет. 

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

да, в том-то и дело что это был запуск советника в середине дня, поэтому я и делал условие 

double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point(); // Хай предыдущего дня

  double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point(); // Лоу предыдущего дня

  double TodayHi = iHigh(Symbol(),PERIOD_D1,0);                          // Хай текущего дня

  double TodayLow = iLow(Symbol(),PERIOD_D1,0);                         // Лоу текущего дня

   if (TodayHi>fUpperLevel) CheckHiLivels = 1; // Условие для торговли

   if (TodayLow<fLowerLevel) CheckLowLivels = 1; // Условие для торговли 

 

сравнивал хай вчерашнего дня и текущего. лоу вчерашнего и текущего дня. только всё равно и с этой проверкой ордер открылся .. 

 

Ну в таком случае проще использовать глобальные переменные терминала.

При успешном открытии позиции туда пишем цену хай/лоу "GlobalVariableSet(...)" 

Далее в условии проверяем "GlobalVariableGet(...) != хай/лоу" и если цена не равна, значит новый уровень - работаем.

 
Vitaly Muzichenko:

Ну в таком случае проще использовать глобальные переменные терминала.

При успешном открытии позиции туда пишем цену хай/лоу "GlobalVariableSet(...)" 

Далее в условии проверяем "GlobalVariableGet(...) != хай/лоу" и если цена не равна, значит новый уровень - работаем.

прежде чем открыть позицию, нужно проверить, не было ли пробитие вчерашних экстремумов сегодня и если были, то не открыть сегодня позиции в данном направлении вообще
 
Sergey Lapshov:
прежде чем открыть позицию, нужно проверить, не было ли пробитие вчерашних экстремумов сегодня и если были, то не открыть сегодня позиции в данном направлении вообще
Ну у вас все карты в руках "iLow(Symbol(), PERIOD_D1, 1)>iLow(Symbol(), PERIOD_D1, 0)" значит был пробит, а сегодняшний после открытия пишите в глобальную переменную и по ней сравнивайте сегодняшний день.
 
Sergey Lapshov:

да, в том-то и дело что это был запуск советника в середине дня, поэтому я и делал условие 

double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point(); // Хай предыдущего дня

  double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point(); // Лоу предыдущего дня

  double TodayHi = iHigh(Symbol(),PERIOD_D1,0);                          // Хай текущего дня

  double TodayLow = iLow(Symbol(),PERIOD_D1,0);                         // Лоу текущего дня

   if (TodayHi>fUpperLevel) CheckHiLivels = 1; // Условие для торговли

   if (TodayLow<fLowerLevel) CheckLowLivels = 1; // Условие для торговли 

 

сравнивал хай вчерашнего дня и текущего. лоу вчерашнего и текущего дня. только всё равно и с этой проверкой ордер открылся .. 

Ну если не нравится простое решение пробуй написать искусственный интеллект для этой задачи.
 
Советники: Cidomo_v.1
Советники: Cidomo_v.1
  • www.mql5.com
Стратегия этого советника — выставление отложенных ордеров на дневной пробой максимумов и минимумов предыдущего дня. - - Категория: статьи и техническая библиотека по автоматическому трейдингу
Причина обращения: