Форум » Консультации по программированию » Я новичок. » Ответить

Я новичок.

Anatoliy: Пишу пользовательский индикатор на основе пересечение уровни 20 и 80. Если главная линия Stochastic пересекла уровень 80 (сверху - вниз), то выводит стрелка Sell на ценовых графиках, а если главная линия Stochastic пересекла уровень 20 (снизу - верх), то стрелка Buy на ценовых графиках. #property strict #property indicator_chart_window #property indicator_buffers 2 //--- plot Buy #property indicator_type1 DRAW_ARROW #property indicator_color1 clrGreen #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Sell #property indicator_type2 DRAW_ARROW #property indicator_color2 clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters //--- indicator buffers double BuyBuffer[]; double SellBuffer[]; //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //+------------------------------------------------------------------+ //| Функция инициализации пользовательского индикатора | //+------------------------------------------------------------------+ int init() { //--- SetIndexBuffer(0,BuyBuffer); SetIndexArrow(0,233); SetIndexStyle(0,DRAW_ARROW); //--- SetIndexBuffer(1,SellBuffer); SetIndexArrow(1,234); SetIndexStyle(1,DRAW_ARROW); //--- SetIndexEmptyValue(0,80.0); SetIndexEmptyValue(1,20.0); //--- return(0); } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж //+------------------------------------------------------------------+ //| Функция пользовательского индикатора итерации | //+------------------------------------------------------------------+ int start() { //--- int i, Counted_bars; double mainStoc_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1); // бар 1 double mainStoc_2 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,2); // бар 2 Counted_bars=IndicatorCounted(); // Количество просчитанных баров i=Bars-Counted_bars-1; for(i=0;i>=0;i--) { if (mainStoc_2 > 80.0 && mainStoc_1 < 80.0) SellBuffer = Low-5*Point; else SellBuffer = 0.0; if (mainStoc_2 < 20.0 && mainStoc_1 > 20.0) BuyBuffer = High+5*Point; else BuyBuffer = 0.0; } //--- return(0); } И в результатах индикатор вообще не работает. Как его исправит?

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 All

Balbesik: Надо разбираться, надо время и знать, как построен TicksCollector . Еще посмотрел - после некоторого времени перестают корректно отображаться бары. Если закрыть терминал и открыть снова - график перестает строится. Я об этом писал и выкладывал картинки с момента публикации индикатора TicksCollector. Повторно на это обращал внимание, где-то полгода назад и сейчас. Какая-то специфика и связана она, на мои взгляд, с - input int i_maxShowTicksCount. Предположение - каким-то образом если есть превышения баров "по тикам" количества баров в терминале идет конфликт. Соответственно не работает и с закаченной историей. Возможно и ни к чему использовать всю историю в реале. Нужна очень четкая инструкция - как пользоваться TicksCollector, если используются равновысокие бары. Это просто пожелание и не более.

Scriptong: Balbesik пишет: Если закрыть терминал и открыть снова - график перестает строится. Посмотри в журнал экспертов. Возможно, выскакивает ошибка построения истории. У меня тоже такое бывает иногда. В таких случаях приходится вручную удалять файл hst с нестандартным графиком и заново создавать. Тогда работает. В чем причина этой ошибки - не могу понять. Balbesik пишет: Нужна очень четкая инструкция - как пользоваться TicksCollector Здесь написано все, что я могу сказать по этому поводу. Добавить никак не могу.

Balbesik: Добрый день, Игорь! Scriptong пишет: Посмотри в журнал экспертов. Возможно, выскакивает ошибка построения истории. Спасибо. С TicksCollector буду разбираться, жалко, что сбой имеет «случайный» характер. Мне это актуально, надо чтобы гарантированно, без сбоев, работал хотя бы неделю. График равновысоких баров, построенный по архивным данным, имеем. В тестер, скриптом от Синбара, история равновысоких баров загружается. В тестере на равновысоких барах истории имеем объем, что не реализуется Синбаром. Тестер сам по себе моделирует некие тики по барам истории. Главные вопросы – Скрипт FXTFileMaker имеет ли принципиальное отличие (движение тиков внутри бара) от скрипта Синбара? Скрипт FXTFileMaker формирует реальный порядок следования тиков внутри бара? Мне для тестирования, если скрипт FXTFileMaker не имеет дополнительных (специальных функции), достаточно и скрипта от Синбара и «голова не болит». Меня не интересует порядок движения внутри бара. Если скрипт FXTFileMaker выдает 4 цены, объем, время бара и не более, то нет проблемы.


Scriptong: Balbesik пишет: Скрипт FXTFileMaker имеет ли принципиальное отличие (движение тиков внутри бара) от скрипта Синбара? Да, имеет. Синбар использует детализацию по минутным свечам. Остальное моделирует тестер. Balbesik пишет: Скрипт FXTFileMaker формирует реальный порядок следования тиков внутри бара? Да, т. к. FXTFileMaker использует данные о реальных тиках. В итоге тестер ничего не моделирует. Balbesik пишет: Мне для тестирования, если скрипт FXTFileMaker не имеет дополнительных (специальных функции), достаточно и скрипта от Синбара и «голова не болит». Меня не интересует порядок движения внутри бара. Тогда зачем первые два вопроса? Balbesik пишет: Если скрипт FXTFileMaker выдает 4 цены, объем, время бара и не более, то нет проблемы. Нет, выдает он не только четыре цены. Генерируются все тики внутри бара, которые реально были в истории рынка.

Balbesik: Игорь! Я тебя долго "тренировал", я понять не мог "догнать" твое решение по переинициализации советника. Мне надо разобраться с TicksCollector. Наиболее логично по картинке поведения у тебя и у меня - if (i_maxShowTicksCount > Bars) { Alert(name, ": максимальное количество отображаемых тиков не может быть больше ", Bars,". Индикатор отключен."); //return false; } комментируем ретурн. В чем тут я не прав (спрашиваю, чтобы не тратить время)?. А вообще интересно на каком компе, в реале, в домашних условиях, если не олигарх и не стоит свой ВЦ, подобное в реале можно реализовать (я тебе писал, что иногда создается впечатление, что отвечает другой человек)?

Scriptong: Balbesik пишет: Я тебя долго "тренировал", я понять не мог "догнать" твое решение по переинициализации советника. Мне надо разобраться с TicksCollector. Наиболее логично по картинке поведения у тебя и у меня - if (i_maxShowTicksCount > Bars) { Alert(name, ": максимальное количество отображаемых тиков не может быть больше ", Bars,". Индикатор отключен."); //return false; } комментируем ретурн. В чем тут я не прав (спрашиваю, чтобы не тратить время)? Один тик индикатором отображается на том месте, где график отображает бар. Если на графике 200 баров, то 201-й тик индикатор не сможет отобразить, что-то будет затерто. По идее, критичного здесь ничего не должно быть. Я в этом направлении даже не пытался думать (к чему это приведет), просто заткнул дырку, которая может принести проблемы. Это обычный подход к программированию - отсекать все возможные проблемы. Если же анализировать вес каждой из этих проблем, то до самого программирования дело никогда не дойдет. Balbesik пишет: А вообще интересно на каком компе, в реале, в домашних условиях, если не олигарх и не стоит свой ВЦ, подобное в реале можно реализовать (я тебе писал, что иногда создается впечатление, что отвечает другой человек)? Комп достаточно скромный - VPS на Amazon'е. На нем запущено три терминала (для каждого из брокеров). Терминалы и индикатор оптимизированы настолько, насколько позволили мои способности. В итоге - средняя загрузка CPU не превышает 50%. Ну а дальше - ручная работа по компоновке архивов. Уходит на это дело около часа в неделю. Поэтому раз в сутки делать срез не могу себе позволить.

Balbesik: Не помогло и индикатор перестал работать. Бары не рисуются, объем становится равен 1 на каждом баре. Зксперт (журнал) посмотреть не успел. Буду думать. На Синбар возвращаться не хочется - советник лучше работает с TicksCollector

Scriptong: Balbesik пишет: Не помогло и индикатор перестал работать. Что именно не помогло?

Balbesik: Scriptong пишет: Что именно не помогло? //return false; Я же методом "научного втыка" действую. Буду искать причину. Вдруг это просто проблемы связи?

Scriptong: Balbesik пишет: Я же методом "научного втыка" действую. Это место точно не поможет в решении. Здесь, как я описывал выше, решается только проблема визуализации, не больше, не меньше.

Balbesik: Добрый день, Игорь! Нужен твой взгляд. Вроде заработало (одна дописка) - bool CalcIndicatorData() { static datetime lastBarTime = 0; if (g_ticksCnt < i_maxShowTicksCount) g_ticksCnt++; if (lastBarTime == iTime(NULL,PERIOD_CURRENT,0) && iTime(NULL,PERIOD_CURRENT,0) != 0) MoveDataToTheLeft(); else lastBarTime = iTime(NULL,PERIOD_CURRENT,0); return SaveRegularTick(); } Простая замена Time[0] при построении равновысоких баров на iTime(NULL,PERIOD_CURRENT,0) не достаточна. Введена дописка && iTime(NULL,PERIOD_CURRENT,0) != 0 Исходил из следующего – Ввел заведомо неверный период - PERIOD_D1 на равновысокий график с периодом 313 Дополнительно исключил работу, если Bid == Ask || Bid == EMPTY_VALUE || Bid == 0 и по Ask аналогично (я не знаю, что такое Bid и Ask, поэтому сделал и 0 и EMPTY_VALUE). При формировании нового 1 минутного бара (стандартного) на графике равновысоких баров эти условия срабатывали, соответственно предположил, что и Time[0] – может быть равно 0. Картинка Т.к. тик в принципе по величине изменения цены может быть любой – вполне возможно "попадание на переход" нового 1 минутного бара (стандартного) Картинка И соответственно может быть Time[0] = 0. Исключил этот вариант, второй день работает без сбоев (а это уже на что-то похоже). Но т.к. слет имеет "случайный характер по времени" надо хотя бы неделю.

Scriptong: Balbesik пишет: Вроде заработало (одна дописка) - bool CalcIndicatorData() { static datetime lastBarTime = 0; if (g_ticksCnt < i_maxShowTicksCount) g_ticksCnt++; if (lastBarTime == iTime(NULL,PERIOD_CURRENT,0) && iTime(NULL,PERIOD_CURRENT,0) != 0) MoveDataToTheLeft(); else lastBarTime = iTime(NULL,PERIOD_CURRENT,0); return SaveRegularTick(); } Очень странное изменение, т. к. iTime(NULL,PERIOD_CURRENT,0) по смыслу то же самое, что и Time[0]. Другое дело, что в последних билдах Time[0] иногда приводит к фатальной ошибке (это просто некоторая недоработка терминала; разработчики о ней знают, но пока не могут уверенно воспроизвести ошибку). Только по этой причине можно говорить, что обращение к iTime более оправдано. Второй момент: iTime(NULL,PERIOD_CURRENT,0) != 0. Просто проверка доступности данных текущего таймфрейма. В этом месте кода она точно лишняя, т. к. при инициализации имеется проверка наличия баров на графике: if (i_maxShowTicksCount > Bars) { Alert(name, ": максимальное количество отображаемых тиков не может быть больше ", Bars,". Индикатор отключен."); return false; } Если баров на графике не будет, то индикатор попросту не запустится. Balbesik пишет: Ввел заведомо неверный период - PERIOD_D1 на равновысокий график с периодом 313 Почему же он неверный? Какая разница графику - равновысокие на нем бары или нет? Balbesik пишет: Дополнительно исключил работу, если Bid == Ask || Bid == EMPTY_VALUE || Bid == 0 и по Ask аналогично Здесь не понял, о чем речь. Balbesik пишет: (я не знаю, что такое Bid и Ask, поэтому сделал и 0 и EMPTY_VALUE). Bid - текущая рыночная цена покупки, а Ask - продажи. Это азы рыночной торговли.

Balbesik: Scriptong пишет: Bid - текущая рыночная цена покупки, а Ask - продажи. Это азы рыночной торговли. Не про это. Не знаю как "правильней", например Bid !=0 или Bid !=EMPTY_VALUE (может Bid это буфер) Scriptong пишет: Почему же он неверный? Какая разница графику - равновысокие на нем бары или нет? Я формирую график с периодом 313, но время для проверки в iTime использую с Д1. Scriptong пишет: Здесь не понял, о чем речь. Сделал просто проверку может быть на равновысоком графике Bid = Ask или могут ли они быть равны 0 или EMPTY_VALUE. При появлении нового минутного бара (из минутного в данном случае формируется равновысокий). Могут. Соответственно сделал вывод, что и Time[0] может быть равен 0. Scriptong пишет: iTime(NULL,PERIOD_CURRENT,0) по смыслу то же самое, что и Time[0] Это понятно. Scriptong пишет: iTime(NULL,PERIOD_CURRENT,0) != 0 Я сделал всего лишь добавку в твой код - if (lastBarTime == Time[0]) MoveDataToTheLeft(); if (lastBarTime == Time[0] && Time[0] != 0) MoveDataToTheLeft(); что-то по коду "Просто проверка доступности данных текущего таймфрейма...", на мои взгляд, здесь это не следует. Столько времени сколько сейчас в реале работает Тикколлектор у меня никогда не работало - шел "слет". Практика подтверждает любую теорию.

Scriptong: Balbesik пишет: Сделал просто проверку может быть на равновысоком графике Bid = Ask или могут ли они быть равны 0 или EMPTY_VALUE. Bid может быть равен Ask только на счетах типа ECN. На стандартных счетах такого априори не бывает. Равенство цены 0 или бесконечно большому значению - это также нонсенс, ибо говорит о фатальной ошибке в самом терминале. Balbesik пишет: Соответственно сделал вывод, что и Time[0] может быть равен 0. Может, но это тоже ошибка терминала. Если же iTime(NULL, PERIOD_CURRENT, 0) равен нулю, то это говорит об отсутствии баров на графике. Такое может быть, когда еще не успели загрузиться данные графика. В таких случаях причину нужно выяснять через GetLastError(). Если в такой момент обратиться к Time[0], то это приведет к аварийной остановке программы по причине выхода за пределы массива (массив Time будет пустой). Balbesik пишет: шел "слет". В чем это проявлялось?

Balbesik: Scriptong пишет: В чем это проявлялось? Картинка графика - Отправлено: 18.03.15 21:06. Сейчас я на другом компе, а этот "слет", у меня, шел с самого начала публикации Тикколлектора - на другом компе (точно такие же картинки выкладывал). Думаю, что если даже вопрос терминала, то сейчас уже уверен, что дописка помогла ("слет" был на флете или на быстром движении - и то и то уже было). После остановки (закрытия) терминала повторно график запускается (значит и история корректно записывалась). Считаю, по Тикколлектору вопрос закрыт. P.S. Кстати подумал - да допустим, с точки зрения программиста, это нонсенс, но а вдруг это "личные доработочки ДЦ" , чтобы советники НЕ работали. Тем более "слет", как правило, шел на быстрых движениях, имел случайный характер и после него повторно график не запускался (нечего тиковую историю собирать и улучшать торговые системы).



полная версия страницы