Включение один раз в день - проблема советника в тестере

 

Добрый день!


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


extern bool WaitForNewDay = false;//В этой переменной указывается, нужно ли дожидаться нового дня, чтобы начать работу

bool AllowTrade = true;//Разрешено ли советнику работать
int CurrentDay = 0;//Переменная текущего дня


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
CurrentDay = DayOfWeek(); //Присваиваем значение переменной текущего дню
if (WaitForNewDay == false) //Если нового дня дожидаться не нужно, то...
{
AllowTrade = true; //разрешить торговлю
}
else
{
AllowTrade = false; //иначе нет
}
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
if ((AllowTrade == false) && (WaitForNewDay == false)) //Если торговать нельзя
{
AllowTrade = IsNewDay(); //Спрашиваем у функции нового дня, наступил ли новый день
}

if (AllowTrade == true)
{
Print(IsNewDay());//Вместо этого Принт'а будет рабочая функция, а сейчас она выводит, наступил ли новый день
AllowTrade = false; //Отменяем разрешение на торговлю
}
//----
return(0);
}
//+------------------------------------------------------------------+

bool IsNewDay() //Функция проверки нового дня
{
if ( (DayOfWeek() != CurrentDay) || (DayOfWeek() != 6) || (DayOfWeek() != 0)) //Если день не сегодняшний, и не выходной, то...
{
CurrentDay = DayOfWeek();//Сегодняшним днем делаем день, пришедший с тиком
return(true); //Да - день действительно изменился

}
else
{
return(false);//Нет, день все тот же
}


}


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


Пожалуйста, помогите мне исправить в программе логику или синтаксис! :) Заранее спасибо!

 
denisromanenko:

Добрый день!

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


extern bool WaitForNewDay = false;//В этой переменной указывается, нужно ли дожидаться нового дня, чтобы начать работу

int start()
  {

   static datetime bt;
          datetime tm=iTime(Symbol(),PERIOD_D1,0);
   
   if(bt==tm && WaitForNewDay)return(-1);
   
/*
   Здесь Ваш код, который должен выполняться только один раз в день.
*/  

   bt=tm;
//----
   return(0);
  }
 
denisromanenko:

Добрый день!


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


А критерий какой ?

он должен включаться на открытии дня ?

или в какой то момент внутри дня ?

 

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

YuraZ, да, таким образом он включится в начале дня, дождется в этот день благополучного момента и купит-продаст. Один раз.

 
Слушай Некрона, он дело говорит.
 
denisromanenko:

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

YuraZ, да, таким образом он включится в начале дня, дождется в этот день благополучного момента и купит-продаст. Один раз.


if (LastorderTime==0) //аварийный поиск последнего ордера.
{

for (int ii=0; ii<OrdersHistoryTotal();ii++)

if (OrderSelect(ii,SELECT_BY_POS,MODE_HISTORY))
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
if (OrderOpenTime()>LastorderTime)
{LastorderTime =OrderOpenTime();}
for (ii=0; ii<OrdersTotal();ii++)
if (OrderSelect(ii,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>LastorderTime )
{LastorderTime =OrderOpenTime();}
}

..........

............

if ( iTime(Symbol(),PERIOD_D1,Delay)> LastorderTime // проверка на сл. день

{

....

OrderSend(..........)

....

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)

LastorderTime=iTime(Symbol(),PERIOD_D1,0); // установка время последнего ордера

.....

}

 
denisromanenko:

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

Неправильно понимаете. Таймфрейм можно ставить любой, а данные на проверку времени будут браться именно с дневного. Смотрите только чтоб история была по дневкам или докачивайте когда запускаете советника (актуально будет во время теста на демке или работе на реале).
 
Не подскажите, что добавить в код во 2м посте, что бы только часть кода выполнялась раз в день, а остальное обычно. Спасибо.