Мне нужен бар, на котором заканчивается прогон по истории. Можно предыдущий бар, а можно и предпредыдущий. Лишь бы хоть как-то узнать о приближении окончания прогона по истории котировок. Возможно-ли это?
- кто как анализирует...
- 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь