Не запускать советник при первом переносе на пару

 

Коллеги,

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

Сейчас условия для открытия ордеров такие:

if(Bid > HighD1+Delta*Point) Open_Bay = true;
if(Bid < LowD1-Delta*Point) Open_Sell = true;

 
// global
double fPreviousBid = 0;  // значение bid на предыдущем тике

int OnInit()
{
   fPreviousBid = 0;
   return(INIT_SUCCEEDED);
}

void OnTick()
{
   // экстремумы предыдущего дня (с зазором)
   double fUpperLevel = iHigh(Symbol(), PERIOD_D1, 1) + Delta * Point();
   double fLowerLevel = iLow(Symbol(), PERIOD_D1, 1) - Delta * Point();

   // сигнал - если текущий бид за экстремумами, а на предыдущем тике бид был внутри экстремумов
   bool bBuySignal = fPreviousBid > 0 && Bid > fUpperLevel && fPreviousBid <= fUpperLevel;
   bool bSellSignal = fPreviousBid > 0 && Bid < fLowerLevel && fPreviousBid >= fLowerLevel;

   // запоминаем текущий бид
   fPreviousBid = Bid;
   // торгуем...

}
 
Sergei Vladimirov:
спасибо! помогло! 
 
Sergei Vladimirov:

Сергей, еще такой вопрос: 

как вообще запретить торговлю, если цена на текущем дне уже касалась уровеня? 

 

вот, что я имею ввиду

вот

 

запустил советника в 8 утра, он коснулся экстремума  прошлого дня сверху вниз и вошел в селл. Но цена уже отработала этот уровень ночью. Как сделать, что бы сделки  в этом направлении  сегодня не открывались? В таких случаях лучше вставать в бай

 

вот мое условие для открытия ордера

fPreviousBid =0; 

OpenDayPrice=iOpen(Symbol(),PERIOD_H4,0); 

   bool bSellSignal = fPreviousBid > 0 && Bid < MinPrice && fPreviousBid >= MinPrice && OpenDayPrice >= MinPrice;

   fPreviousBid = Bid;


   if (TimeBarSell!=iTime(Symbol(),TimeCandle,0)&& Bid <=MinPrice && Open[0] > MinPrice && bSellSignal){

sell... 

}

 
Sergey Lapshov:

вот, что я имею ввиду

 

запустил советника в 8 утра, он коснулся экстремума  прошлого дня сверху вниз и вошел в селл. Но цена уже отработала этот уровень ночью. Как сделать, что бы сделки  в этом направлении  сегодня не открывались? В таких случаях лучше вставать в бай

 

вот мое условие для открытия ордера

fPreviousBid =0; 

OpenDayPrice=iOpen(Symbol(),PERIOD_H4,0); 

   bool bSellSignal = fPreviousBid > 0 && Bid < MinPrice && fPreviousBid >= MinPrice && OpenDayPrice >= MinPrice;

   fPreviousBid = Bid;


   if (TimeBarSell!=iTime(Symbol(),TimeCandle,0)&& Bid <=MinPrice && Open[0] > MinPrice && bSellSignal){

sell... 

}

Вот решение вашей задачи
 
Vitaly Muzichenko:
Вот решение вашей задачи
Это решение другой задачи. 
 
Dmitry Fedoseev:
Это решение другой задачи. 
не вижу там решения.. это подойдет если уде были сделки, а если их не было? как проанализировать касание уровня ценой с начала торговой сессии?
 
Sergey Lapshov:
не вижу там решения.. это подойдет если уде были сделки, а если их не было? как проанализировать касание уровня ценой с начала торговой сессии?
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает флаг торгов сегодня.                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isTradeToDay(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (TimeDay  (OrderOpenTime())==Day()
              &&  TimeMonth(OrderOpenTime())==Month()
              &&  TimeYear (OrderOpenTime())==Year()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}

Соответственно ВЫ можете узнать была ли сегодня торговля по BUY SELL

 

if(isTradeToDay(Symbol(),OP_BUY,-1)) Торговля по BUY сегодня уже была.... 

 
Vladislav Andruschenko:

Соответственно ВЫ можете узнать была ли сегодня торговля по BUY SELL

 

if(isTradeToDay(Symbol(),OP_BUY,-1)) Торговля по BUY сегодня уже была.... 

её не могло быть, потому что советник был выключен. это первый запуск с начала торговой сессии и нужно определить: было ли касание ценой заданного уровня.
 
Sergey Lapshov:
нужно определить: было ли касание ценой заданного уровня.


double уровень = 1.2000;
bool касалось = (iHigh(_Symbol, PERIOD_D1, 0) <= уровень && iLow(_Symbol, PERIOD_D1, 0) >= уровень);
Alert("касалось = ", касалось); 

.