public void Execute(IContext ctx, ISecurity sec)
{
//"сжимаем" до дневок-то есть получаем дневные данные
ISecurity dailySec = sec.CompressTo(1440);
//если мало баров-выходим, чтобы не было ошибки
if (dailySec.Bars.Count < 1) return;
//номер бара предыдущего дня
int prevDateBarNum = 0;
double dailyHigh;
double dailyLow;
DateTime curDate;
for (int i = 0; i < sec.Bars.Count; i++)
{
//дата текущего бара
curDate=sec.Bars[i].Date.Date;
//получаем номер дневного бара текущего дня
while (prevDateBarNum<dailySec.Bars.Count&&
dailySec.Bars[prevDateBarNum].Date.Date < curDate)
prevDateBarNum++;
//тут возникает проблема: поскольку мы выставляем ордера на закрытии,
//то на последнем баре дня нужно выставить заявку уже с
//учетом хая текущего дневного бара.
if (((i + 1) < sec.Bars.Count && sec.Bars[i + 1].Date.Date == curDate)
|| prevDateBarNum == dailySec.Bars.Count)
{
//все нормально-у нас не последний бар текущего дня
prevDateBarNum--;
}
if (prevDateBarNum < 0)
{
prevDateBarNum = 0;
continue;
}
//номер дневного бара предыдущего дня
dailyHigh = dailySec.HighPrices[prevDateBarNum];
dailyLow = dailySec.LowPrices[prevDateBarNum];
//условие того, что сегодня открывалось не более одной позиции
if (sec.Positions.LastPositionActive == null ||
sec.Positions.LastPositionActive.EntryBar.Date.Date != curDate ||
sec.Positions.LastPositionClosed == null
|| sec.Positions.LastPositionClosed.EntryBar.Date.Date != curDate)
{
bool sell;
bool buy;
if(sec.Positions.LastPositionActive==null)
{
//если мы еще ни разу не делали сделок, то ставим двойную.
//предполагаем, что обе заявки в течение одного бара
//выполниться не смогут!
buy=true;
sell=true;
}
else
{
buy=sec.Positions.LastPositionActive.IsShort;
sell=sec.Positions.LastPositionActive.IsLong;
}
if (buy)
sec.Positions.BuyIfGreater(i + 1, 1, dailyHigh, "Long");
if(sell)
sec.Positions.SellIfLess(i+1,1,dailyLow,"Short");
}
}
}