Мне нужен бар, на котором заканчивается прогон по истории. Можно предыдущий бар, а можно и предпредыдущий. Лишь бы хоть как-то узнать о приближении окончания прогона по истории котировок. Возможно-ли это?
- кто как анализирует...
- Bars
- Как узнать цены закрытия предыдущих баров?
Это мне нужно, чтобы реализовать совет Роша "Возможен-ли одновременный прогон по нескольким символам?"
А так не сгодится if(LocalTime()-zaderjka<0) ...., где задержка больше длительности одного бара?
А так не сгодится if(LocalTime()-zaderjka<0) ...., где задержка больше длительности одного бара?
хм... а как задержку определять? Например, для часиков. Как-то высчитывать или забить константу?
Для часов берешь zaderjka=3700; (т.е. больше 3600 сек)
Тогда на начале последнего бара обязательно условие выполнится.
Тогда на начале последнего бара обязательно условие выполнится.
У меня есть мысль. Задать дату, меньше даты последнего бара и сравнивать с датой текущего бара. Но как-то не очень красиво это...
Выложу весь код
//+------------------------------------------------------------------+
//| b-Account.mqh |
//| Ким Игорь В. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 19.12.2005 Библиотека функций сбора информации о счёте. |
//| |
//| Для использования добавить строки в функции start: |
//| if (prevTimeBar!=Time[0]) WriteAccountInfo(); |
//| prevTimeBar=Time[0]; |
//+------------------------------------------------------------------+
//------- Внешние параметры модуля -----------------------------------
extern string _Parameters_b_Account = "----- Параметры модуля";
extern string acOutFileName = "Account.csv";
extern int acOutGroup = 1; // 1-мес, 2-кв, 3-год
//------- Глобальные переменные модуля сбора статистики --------------
bool acFirstRun=True;
double acPrevBalance;
int acPrevMonth, acPrevQuarter, acPrevYear;
datetime zaderjka=3700;
//+------------------------------------------------------------------+
//| Сбор и запись в файл информации о торговом счёте. |
//+------------------------------------------------------------------+
void WriteAccountInfo() {
string text="";
if (acFirstRun) {
text=";Прибыль;Баланс";
WritingLineInFile(acOutFileName, text);
acPrevBalance=AccountBalance();
acPrevMonth=Month();
acPrevQuarter=Quarter();
acPrevYear=Year();
acFirstRun=False;
}
if (acOutGroup==1) {
if (acPrevMonth!=Month()) {
text=acPrevYear+"."+acPrevMonth+";"+
(AccountBalance()-acPrevBalance)+";"+
AccountBalance();
WritingLineInFile(acOutFileName, text);
acPrevBalance=AccountBalance();
}
}
if (acOutGroup==2) {
if (acPrevQuarter!=Quarter()) {
text=acPrevYear+" кв."+acPrevQuarter+";"+
(AccountBalance()-acPrevBalance)+";"+
AccountBalance();
WritingLineInFile(acOutFileName, text);
acPrevBalance=AccountBalance();
}
}
if (acOutGroup==3) {
if (acPrevYear!=Year()) {
text=acPrevYear+";"+
(AccountBalance()-acPrevBalance)+";"+
AccountBalance();
WritingLineInFile(acOutFileName, text);
acPrevBalance=AccountBalance();
}
}
acPrevMonth=Month();
acPrevQuarter=Quarter();
acPrevYear=Year();
if(LocalTime()-zaderjka<0) Print(TimeToStr(Time[0]));
}
//+------------------------------------------------------------------+
//| Возвращает номер квартала |
//+------------------------------------------------------------------+
int Quarter() {
if (Month()>0 && Month()<4) return(1);
if (Month()>3 && Month()<7) return(2);
if (Month()>6 && Month()<10) return(3);
if (Month()>9 && Month()<13) return(4);
}
//+------------------------------------------------------------------+
//| Запись строки в файл |
//+------------------------------------------------------------------+
void WritingLineInFile(string FileName, string text) {
int file_handle=FileOpen(FileName, FILE_READ|FILE_WRITE, " ");
if (file_handle>0) {
FileSeek(file_handle, 0, SEEK_END);
FileWrite(file_handle, text);
FileClose(file_handle);
}
}
//+------------------------------------------------------------------+
Проблема в том, что ента штука не пишет данные последнего периода. Может есть обходной манёвр?
а в deinit() нельзя вставить нужные действия?
а в deinit() нельзя вставить нужные действия?
Наверно, можно. Только вот прийдётся одну функцию WriteAccountInfo() разбивать на две. Одна будет в старте, а другая в деините. Хреновато, хотя тоже решение. Хочется обеспечить лёгкость внедрения такой приблуды в любой советник.
Это тоже можно отжельной функцией сделать, чтобы юзер не думал ;)
void NoDoubt()
{
if (prevTimeBar!=Time[0]) WriteAccountInfo(); |
prevTimeBar=Time[0];
}
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь