Timer расчета времени бара

Andrey_Ch

Участник
ПАММ группа
Монет
3,571
extern bool reversTime =true; //Обратный отcчет времени бара
int chPeriod =0;
datetime emptyTime =D'1970.01.01';
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
chPeriod=ChartPeriod(ChartID());
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
if(ObjectFind(ChartID(),"timeBar")>-1)
ObjectDelete("timeBar");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTimer()
{
datetime curBar=emptyTime;
if(reversTime)
curBar=iTime(Symbol(),0,0)+(chPeriod*60);
else
curBar=iTime(Symbol(),0,0);
MqlDateTime timeStruct;
datetime tCur=TimeCurrent();
datetime razTime=emptyTime;
if(reversTime)
razTime=curBar-tCur;
else
razTime=tCur-curBar;
if(razTime==emptyTime || curBar==emptyTime)
return;
TimeToStruct(razTime,timeStruct);
string text="";
if(timeStruct.sec>61 || timeStruct.min>61 || timeStruct.hour>25)
return;
if(chPeriod<=60)
text=(string)timeStruct.min+":"+(string)timeStruct.sec;
else
text=(string)timeStruct.hour+":"+(string)timeStruct.min+":"+(string)timeStruct.sec;
LabelCreate(0,"timeBar",0,5,40,CORNER_LEFT_LOWER,text,"TimesNewRoman",10,clrWhite,0.0,ANCHOR_LEFT_UPPER,true,false,true,0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---

//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool LabelCreate(const long chart_ID=0, // ID графика
const string name="Label", // имя метки
const int sub_window=0, // номер подокна
const int x=0, // координата по оси X
const int y=0, // координата по оси Y
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки
const string text="Label", // текст
const string font="Arial", // шрифт
const int font_size=10, // размер шрифта
const color clr=clrRed, // цвет
const double angle=0.0, // наклон текста
const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
const bool back=false, // на заднем плане
const bool selection=false, // выделить для перемещений
const bool hidden=true, // скрыт в списке объектов
const long z_order=0) // приоритет на нажатие мышью
{
//--- сбросим значение ошибки
ResetLastError();
//--- создадим текстовую метку
if(ObjectFind(name)==-1)
if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))
{
Print(__FUNCTION__, ": не удалось создать текстовую метку! Код ошибки = ",getError(GetLastError()));
return(false);
}
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
//--- установим угол наклона текста
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения метки мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string getError(int cod)
{
if(cod==0)
return("0: Нет ошибки");
if(cod==1)
return("1: Нет ошибки, но результат неизвестен");
if(cod==2)
return("2: Общая ошибка");
if(cod==3)
return("3: Неправильные параметры");
if(cod==4)
return("4: Торговый сервер занят");
if(cod==5)
return("5: Старая версия клиентского терминала");
if(cod==6)
return("6: Нет связи с торговым сервером");
if(cod==7)
return("7: Недостаточно прав");
if(cod==9)
return("9: Недопустимая операция, нарушающая функционирование сервера");
if(cod==64)
return("64: Счет заблокирован");
if(cod==65)
return("65: Неправильный номер счета");
if(cod==128)
return("128: Истек срок ожидания совершения сделки");
if(cod==129)
return("129: Неправильная цена");
if(cod==130)
return("130: Неправильные стопы");
if(cod==131)
return("131: Неправильный объем");
if(cod==132)
return("132: Рынок закрыт");
if(cod==133)
return("133: Торговля запрещена");
if(cod==134)
return("134: Недостаточно денег для совершения операции");
if(cod==135)
return("135: Цена изменилась");
if(cod==136)
return("136: Нет цен");
if(cod==137)
return("137: Брокер занят");
if(cod==138)
return("138: Новые цены");
if(cod==139)
return("139: Ордер заблокирован и уже обрабатывается");
if(cod==140)
return("140: Разрешена только покупка");
if(cod==141)
return("141: Слишком много запросов");
if(cod==145)
return("145: Модификация запрещена, так как ордер слишком близок к рынку");
if(cod==146)
return("146: Подсистема торговли занята");
if(cod==147)
return("147: Использование даты истечения ордера запрещено брокером");
if(cod==148)
return("148: Количество открытых и отложенных ордеров достигло предела, установленного брокером");
if(cod==149)
return("149: Попытка открыть противоположный ордер в случае, если хеджирование запрещено");
if(cod==150)
return("150: Попытка закрыть позицию по инструменту в противоречии с правилом FIFO");
if(cod==4000)
return("4000: Нет ошибки");
if(cod==4001)
return("4001: Неправильный указатель функции");
if(cod==4002)
return("4002: Индекс массива - вне диапазона");
if(cod==4003)
return("4003: Нет памяти для стека функций");
if(cod==4004)
return("4004: Переполнение стека после рекурсивного вызова");
if(cod==4005)
return("4005: На стеке нет памяти для передачи параметров");
if(cod==4006)
return("4006: Нет памяти для строкового параметра");
if(cod==4007)
return("4007: Нет памяти для временной строки");
if(cod==4008)
return("4008: Неинициализированная строка");
if(cod==4009)
return("4009: Неинициализированная строка в массиве");
if(cod==4010)
return("4010: Нет памяти для строкового массива");
if(cod==4011)
return("4011: Слишком длинная строка");
if(cod==4012)
return("4012: Остаток от деления на ноль");
if(cod==4013)
return("4013: Деление на ноль");
if(cod==4014)
return("4014: Неизвестная команда");
if(cod==4015)
return("4015: Неправильный переход");
if(cod==4016)
return("4016: Неинициализированный массив");
if(cod==4017)
return("4017: Вызовы DLL не разрешены");
if(cod==4018)
return("4018: Невозможно загрузить библиотеку");
if(cod==4019)
return("4019: Невозможно вызвать функцию");
if(cod==4020)
return("4020: Вызовы внешних библиотечных функций не разрешены");
if(cod==4021)
return("4021: Недостаточно памяти для строки, возвращаемой из функции");
if(cod==4022)
return("4022: Система занята");
if(cod==4023)
return("4023: Критическая ошибка вызова DLL-функции");
if(cod==4024)
return("4024: Внутренняя ошибка");
if(cod==4025)
return("4025: Нет памяти");
if(cod==4026)
return("4026: Неверный указатель");
if(cod==4027)
return("4027: Слишком много параметров форматирования строки");
if(cod==4028)
return("4028: Число параметров превышает число параметров форматирования строки");
if(cod==4029)
return("4029: Неверный массив");
if(cod==4030)
return("4030: График не отвечает");
if(cod==4050)
return("4050: Неправильное количество параметров функции");
if(cod==4051)
return("4051: Недопустимое значение параметра функции");
if(cod==4052)
return("4052: Внутренняя ошибка строковой функции");
if(cod==4053)
return("4053: Ошибка массива");
if(cod==4054)
return("4054: Неправильное использование массива-таймсерии");
if(cod==4055)
return("4055: Ошибка пользовательского индикатора");
if(cod==4056)
return("4056: Массивы несовместимы");
if(cod==4057)
return("4057: Ошибка обработки глобальных переменных");
if(cod==4058)
return("4058: Глобальная переменная не обнаружена");
if(cod==4059)
return("4059: Функция не разрешена в тестовом режиме");
if(cod==4060)
return("4060: Функция не разрешена");
if(cod==4061)
return("4061: Ошибка отправки почты");
if(cod==4062)
return("4062: Ожидается параметр типа string");
if(cod==4063)
return("4063: Ожидается параметр типа integer");
if(cod==4064)
return("4064: Ожидается параметр типа double");
if(cod==4065)
return("4065: В качестве параметра ожидается массив");
if(cod==4066)
return("4066: Запрошенные исторические данные в состоянии обновления");
if(cod==4067)
return("4067: Ошибка при выполнении торговой операции");
if(cod==4068)
return("4068: Ресурс не найден");
if(cod==4069)
return("4069: Ресурс не поддерживается");
if(cod==4070)
return("4070: Дубликат ресурса");
if(cod==4071)
return("4071: Ошибка инициализации пользовательского индикатора");
if(cod==4072)
return("4072: Ошибка загрузки пользовательского индикатора");
if(cod==4073)
return("4073: Нет исторических данных");
if(cod==4074)
return("4074: Не хватает памяти для исторических данных");
if(cod==4075)
return("4075: Не хватает памяти для расчёта индикатора");
if(cod==4099)
return("4099: Конец файла");
if(cod==4100)
return("4100: Ошибка при работе с файлом");
if(cod==4101)
return("4101: Неправильное имя файла");
if(cod==4102)
return("4102: Слишком много открытых файлов");
if(cod==4103)
return("4103: Невозможно открыть файл");
if(cod==4104)
return("4104: Несовместимый режим доступа к файлу");
if(cod==4105)
return("4105: Ни один ордер не выбран");
if(cod==4106)
return("4106: Неизвестный символ");
if(cod==4107)
return("4107: Неправильный параметр цены для торговой функции");
if(cod==4108)
return("4108: Неверный номер тикета");
if(cod==4109)
return("4109: Торговля не разрешена. Необходимо включить опцию ""Разрешить советнику торговать"" в свойствах эксперта");
if(cod==4110)
return("4110: Ордера на покупку не разрешены. Необходимо проверить свойства эксперта");
if(cod==4111)
return("4111: Ордера на продажу не разрешены. Необходимо проверить свойства эксперта");
if(cod==4112)
return("4112: Автоматическая торговля с помощью экспертов/скриптов запрещена на стороне сервера");
if(cod==4200)
return("4200: Объект уже существует");
if(cod==4201)
return("4201: Запрошено неизвестное свойство объекта");
if(cod==4202)
return("4202: Объект не существует");
if(cod==4203)
return("4203: Неизвестный тип объекта");
if(cod==4204)
return("4204: Нет имени объекта");
if(cod==4205)
return("4205: Ошибка координат объекта");
if(cod==4206)
return("4206: Не найдено указанное подокно");
if(cod==4207)
return("4207: Ошибка при работе с объектом");
if(cod==4210)
return("4210: Неизвестное свойство графика");
if(cod==4211)
return("4211: График не найден");
if(cod==4212)
return("4212: Не найдено подокно графика");
if(cod==4213)
return("4213: Индикатор не найден");
if(cod==4220)
return("4220: Ошибка выбора инструмента");
if(cod==4250)
return("4250: Ошибка отправки push-уведомления");
if(cod==4251)
return("4251: Ошибка параметров push-уведомления");
if(cod==4252)
return("4252: Уведомления запрещены");
if(cod==4253)
return("4253: Слишком частые запросы отсылки push-уведомлений");
if(cod==4260)
return("4260: Не указан FTP сервер");
if(cod==4261)
return("4261: Не указан FTP логин");
if(cod==4262)
return("4262: Ошибка при подключении к FTP серверу");
if(cod==4263)
return("4263: Подключение к FTP серверу закрыто");
if(cod==4264)
return("4264: На FTP сервере не найдена директория для выгрузки файла");
if(cod==4265)
return("4265: Не найден файл в директории MQL4 Files для отправки на FTP сервер");
if(cod==4266)
return("4266: Ошибка при передаче файла на FTP сервер");
if(cod==5001)
return("5001: Слишком много открытых файлов");
if(cod==5002)
return("5002: Неверное имя файла");
if(cod==5003)
return("5003: Слишком длинное имя файла");
if(cod==5004)
return("5004: Ошибка открытия файла");
if(cod==5005)
return("5005: Ошибка размещения буфера текстового файла");
if(cod==5006)
return("5006: Ошибка удаления файла");
if(cod==5007)
return("5007: Неверный хендл файла (файл закрыт или не был открыт)");
if(cod==5008)
return("5008: Неверный хендл файла (индекс хендла отсутствует в таблице)");
if(cod==5009)
return("5009: Файл должен быть открыт с флагом FILE_WRITE");
if(cod==5010)
return("5010: Файл должен быть открыт с флагом FILE_READ");
if(cod==5011)
return("5011: Файл должен быть открыт с флагом FILE_BIN");
if(cod==5012)
return("5012: Файл должен быть открыт с флагом FILE_TXT");
if(cod==5013)
return("5013: Файл должен быть открыт с флагом FILE_TXT");
if(cod==5014)
return("5014: Файл должен быть открыт с флагом FILE_CSV");
if(cod==5015)
return("5015: Ошибка чтения файла");
if(cod==5016)
return("5016: Ошибка записи файла");
if(cod==5017)
return("5017: Размер строки должен быть указан для двоичных файлов");
if(cod==5018)
return("5018: Неверный тип файла (для строковых массивов-TXT, для всех других-BIN)");
if(cod==5019)
return("5019: Файл является директорией");
if(cod==5020)
return("5020: Файл не существует");
if(cod==5021)
return("5021: Файл не может быть перезаписан");
if(cod==5022)
return("5022: Неверное имя директории");
if(cod==5023)
return("5023: Директория не существует");
if(cod==5024)
return("5024: Указанный файл не является директорией");
if(cod==5025)
return("5025: Ошибка удаления директории");
if(cod==5026)
return("5026: Ошибка очистки директории");
if(cod==5027)
return("5027: Ошибка изменения размера массива");
if(cod==5028)
return("5028: Ошибка изменения размера строки");
if(cod==5029)
return("5029: Структура содержит строки или динамические массивы");
if(cod==5200)
return("5200: URL не прошел проверку");
if(cod==5201)
return("5201: Не удалось подключиться к указанному URL");
if(cod==5202)
return("5202: Превышен таймаут получения данных");
if(cod==5203)
return("5203: Ошибка в результате выполнения HTTP запроса");
return(IntegerToString(cod));
}
 

Max Pros

Участник
Форумчанин
Монет
1,706
Я себе тоже похожий индикатор сделал, но с тремя строками:
1-строка: когда рынок открыт, показывает время от начала и до конца текущего бара. Когда рынок закрыт, там пусто.
2-я строка: серверное время последней котировки и сколько времени прошло до текущего момента.
3-я строка: текущее время компьютера. Хотя надо бы, наверное, сделать текущее время во временной зоне сервера.
 

Проверенные Брокеры

Для всех:
1. RoboForex
2. Weltrade
3. Exness
4. Forex4you

Для граждан РФ:
1. RoboForex
2. Альфа-Форекс
3. Альпари
4. wForex

Реклама

Secret Book
Weltrade 50
VPS сервера форекс

Заработок онлайн

Верх