Trabajo finalizado
Tarea técnica
Коллеги, добрый день!
Есть несколько задач:
1) Есть индикатор showBid (скачал здесь), но он не обновляется по тику, только по событию CHARTEVENT_CHART_CHANGE.
Нужно доделать, чтобы обновлялся по тику. Использовать как советник - не вариант, так как работает другой.
2) Вывести текущее время с секундами как объект в правый верхний угол графика (примерно такого же размера, как и showBid). Синхронизировать с локальным временем.
3) Торгую бинарными опционами у брокера GrandCapital. Когда открываю позицию в поле комментария ордера выводится дата и время его экспирации, а также доходность опциона (например: в открытом ордере - "E 11.19 10:30:23 50%", в истории - "E 11.19 10:30:23 50%[2]" ).
а) Написать функцию, которая будет вытаскивать из комментария доходность и дату-время экспирации (для использования в советнике в дальнейшем)
Я пробовал писать так:
//функция получения доходности опциона из ордера numorder - выбираю ордер по тикету
<sourcecode>
int getOptionProfit(int numorder)
{
int result=0;
string comment="";
int len=0;
bool res=OrderSelect(numorder,SELECT_BY_TICKET);
if (res)
{
comment=OrderComment();
len=StringLen(comment);
if (len==20) result=StringToInteger(StringSubstr(comment,StringLen(comment)-3,2)); //для открытого рыночного ордера
if (len==23) result=StringToInteger(StringSubstr(comment,StringLen(comment)-6,2)); //для закрытого ордера
}
Alert(result);
return(result);
}
</sourcecode>
Функция должна исполняться, когда получен тикет (открыт ордер) нового открытого ордера. Может ордер просто не успевает открыться, а функция уже исполнилась?
Эта функция возращает 0 в советнике, но если ее тестировать в процедуре OnInit, то она возвращает верное значение. Не могу понять почему так происходит.
//функция получения даты и времени экспирации опциона из ордера numorder - здесь попробовал выбрать открытый ордер по позиции, но ошибка осталась
<sourcecode>
datetime getOptionExpiration(string instr)
{
datetime ordertimestr=0;
string str="";
for (int j=0;j<OrdersTotal();j++)
{
bool res=OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
if ((res)&&(OrderSymbol()==instr))
{
string str1=StringFormat("%s",TimeToString(TimeCurrent(),TIME_DATE));
string year1=StringSubstr(str1,0,4); //вытаскиваем год
str=OrderComment();
string month1=StringSubstr(str,2,2); //вытаскиваем месяц
string day1=StringSubstr(str,5,2); //вытаскиваем день
string time1=StringSubstr(str,8,8); //вытаскиваем время
ordertimestr=StringToTime(year1+"."+month1+"."+day1+" "+time1); //дата и время экспирации открытой позиции (число)
}
}
return(ordertimestr);
}
</sourcecode>
Проблема та же, что и с предыдущим. Но возвращаемое значение этой функции я хочу в дальнейшем использовать для "отлова" момента экспирации опциона и записи действий в лог. Сейчас видимо она тоже криво работает, использую пока Sleep на срок жизни опциона.
Если есть вариант как более эффективно поймать момент экспирации - предлагайте.
б) когда открывается ордер и в комментарии появляется дата и время экспирации нужно к часам в п. 2 "пристегнуть" таймер с обратным отсчетом времени до момента экспирации (в формате секунды/минуты:секунды/часы:минуты:секунды - на выбор пользователя). Обязательно использование с выбранным ордером (по тикету)
Жду предложений.