АвторСообщение
Anatoliy



Сообщение: 2
Зарегистрирован: 13.07.14
Репутация: 0
ссылка на сообщение  Отправлено: 21.07.14 21:22. Заголовок: Я новичок.


Пишу пользовательский индикатор на основе пересечение уровни 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);
}

И в результатах индикатор вообще не работает.
Как его исправит?



Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 All [только новые]


Balbesik



Сообщение: 195
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 17.03.15 10:24. Заголовок: Надо разбираться, на..


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

Спасибо: 0 
Профиль
Scriptong





Сообщение: 1340
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 17.03.15 18:40. Заголовок: Balbesik пишет: Есл..


Balbesik пишет:

 цитата:
Если закрыть терминал и открыть снова - график перестает строится.


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

Balbesik пишет:

 цитата:
Нужна очень четкая инструкция - как пользоваться TicksCollector


Здесь написано все, что я могу сказать по этому поводу. Добавить никак не могу.


Спасибо: 0 
Профиль
Balbesik



Сообщение: 196
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 18.03.15 09:56. Заголовок: Добрый день, Игорь! ..


Добрый день, Игорь!

Scriptong пишет:

 цитата:
Посмотри в журнал экспертов. Возможно, выскакивает ошибка построения истории.



Спасибо.
С TicksCollector буду разбираться, жалко, что сбой имеет «случайный» характер.
Мне это актуально, надо чтобы гарантированно, без сбоев, работал хотя бы неделю.

График равновысоких баров, построенный по архивным данным, имеем.
В тестер, скриптом от Синбара, история равновысоких баров загружается.
В тестере на равновысоких барах истории имеем объем, что не реализуется Синбаром.
Тестер сам по себе моделирует некие тики по барам истории.

Главные вопросы –

Скрипт FXTFileMaker имеет ли принципиальное отличие (движение тиков внутри бара) от скрипта Синбара?
Скрипт FXTFileMaker формирует реальный порядок следования тиков внутри бара?

Мне для тестирования, если скрипт FXTFileMaker не имеет дополнительных (специальных функции),
достаточно и скрипта от Синбара и «голова не болит».
Меня не интересует порядок движения внутри бара.

Если скрипт FXTFileMaker выдает 4 цены, объем, время бара и не более, то нет проблемы.


Спасибо: 0 
Профиль
Scriptong





Сообщение: 1348
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 18.03.15 19:56. Заголовок: Balbesik пишет: Скр..


Balbesik пишет:

 цитата:
Скрипт FXTFileMaker имеет ли принципиальное отличие (движение тиков внутри бара) от скрипта Синбара?


Да, имеет. Синбар использует детализацию по минутным свечам. Остальное моделирует тестер.

Balbesik пишет:

 цитата:

Скрипт FXTFileMaker формирует реальный порядок следования тиков внутри бара?


Да, т. к. FXTFileMaker использует данные о реальных тиках. В итоге тестер ничего не моделирует.

Balbesik пишет:

 цитата:

Мне для тестирования, если скрипт FXTFileMaker не имеет дополнительных (специальных функции),
достаточно и скрипта от Синбара и «голова не болит».
Меня не интересует порядок движения внутри бара.


Тогда зачем первые два вопроса?

Balbesik пишет:

 цитата:

Если скрипт FXTFileMaker выдает 4 цены, объем, время бара и не более, то нет проблемы.


Нет, выдает он не только четыре цены. Генерируются все тики внутри бара, которые реально были в истории рынка.

Спасибо: 0 
Профиль
Balbesik



Сообщение: 197
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 18.03.15 15:36. Заголовок: Игорь! Я тебя долг..


Игорь!

Я тебя долго "тренировал", я понять не мог "догнать" твое решение по переинициализации советника.
Мне надо разобраться с TicksCollector.
Наиболее логично по картинке поведения у тебя и у меня -

if (i_maxShowTicksCount > Bars)
{
Alert(name, ": максимальное количество отображаемых тиков не может быть больше ", Bars,". Индикатор отключен.");
//return false;
}
комментируем ретурн.
В чем тут я не прав (спрашиваю, чтобы не тратить время)?.

А вообще интересно на каком компе, в реале, в домашних условиях, если не олигарх и не стоит свой ВЦ,
подобное в реале можно реализовать (я тебе писал, что иногда создается впечатление, что отвечает другой человек)?





Спасибо: 0 
Профиль
Scriptong





Сообщение: 1349
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 18.03.15 20:07. Заголовок: Balbesik пишет: Я т..


Balbesik пишет:

 цитата:
Я тебя долго "тренировал", я понять не мог "догнать" твое решение по переинициализации советника.
Мне надо разобраться с TicksCollector.
Наиболее логично по картинке поведения у тебя и у меня -

if (i_maxShowTicksCount > Bars)
{
Alert(name, ": максимальное количество отображаемых тиков не может быть больше ", Bars,". Индикатор отключен.");
//return false;
}
комментируем ретурн.
В чем тут я не прав (спрашиваю, чтобы не тратить время)?


Один тик индикатором отображается на том месте, где график отображает бар. Если на графике 200 баров, то 201-й тик индикатор не сможет отобразить, что-то будет затерто. По идее, критичного здесь ничего не должно быть. Я в этом направлении даже не пытался думать (к чему это приведет), просто заткнул дырку, которая может принести проблемы. Это обычный подход к программированию - отсекать все возможные проблемы. Если же анализировать вес каждой из этих проблем, то до самого программирования дело никогда не дойдет.

Balbesik пишет:

 цитата:
А вообще интересно на каком компе, в реале, в домашних условиях, если не олигарх и не стоит свой ВЦ,
подобное в реале можно реализовать (я тебе писал, что иногда создается впечатление, что отвечает другой человек)?


Комп достаточно скромный - VPS на Amazon'е. На нем запущено три терминала (для каждого из брокеров). Терминалы и индикатор оптимизированы настолько, насколько позволили мои способности. В итоге - средняя загрузка CPU не превышает 50%.
Ну а дальше - ручная работа по компоновке архивов. Уходит на это дело около часа в неделю. Поэтому раз в сутки делать срез не могу себе позволить.

Спасибо: 0 
Профиль
Balbesik



Сообщение: 198
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 18.03.15 21:06. Заголовок: Не помогло и индикат..


Не помогло и индикатор перестал работать.



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

Спасибо: 0 
Профиль
Scriptong





Сообщение: 1354
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 18.03.15 23:06. Заголовок: Balbesik пишет: Не ..


Balbesik пишет:

 цитата:
Не помогло и индикатор перестал работать.


Что именно не помогло?

Спасибо: 0 
Профиль
Balbesik



Сообщение: 199
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 18.03.15 23:17. Заголовок: Scriptong пишет: Чт..


Scriptong пишет:

 цитата:
Что именно не помогло?




//return false;

Я же методом "научного втыка" действую.
Буду искать причину.
Вдруг это просто проблемы связи?

Спасибо: 0 
Профиль
Scriptong





Сообщение: 1358
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 18.03.15 23:32. Заголовок: Balbesik пишет: Я ж..


Balbesik пишет:

 цитата:
Я же методом "научного втыка" действую.


Это место точно не поможет в решении. Здесь, как я описывал выше, решается только проблема визуализации, не больше, не меньше.

Спасибо: 0 
Профиль
Balbesik



Сообщение: 200
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 20.03.15 09:39. Заголовок: Добрый день, Игорь! ..


Добрый день, Игорь!

Нужен твой взгляд.

Вроде заработало (одна дописка) -
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.

Исключил этот вариант, второй день работает без сбоев (а это уже на что-то похоже).
Но т.к. слет имеет "случайный характер по времени" надо хотя бы неделю.


Спасибо: 0 
Профиль
Scriptong





Сообщение: 1370
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 20.03.15 11:20. Заголовок: 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();
}


Очень странное изменение, т. к. 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 - продажи. Это азы рыночной торговли.

Спасибо: 0 
Профиль
Balbesik



Сообщение: 201
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 20.03.15 12:30. Заголовок: Scriptong пишет: Bi..


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();

что-то по коду "Просто проверка доступности данных текущего таймфрейма...",
на мои взгляд, здесь это не следует.

Столько времени сколько сейчас в реале работает Тикколлектор
у меня никогда не работало - шел "слет".

Практика подтверждает любую теорию.



Спасибо: 0 
Профиль
Scriptong





Сообщение: 1378
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 20.03.15 14:13. Заголовок: Balbesik пишет: Сде..


Balbesik пишет:

 цитата:
Сделал просто проверку может быть на равновысоком графике Bid = Ask или
могут ли они быть равны 0 или EMPTY_VALUE.


Bid может быть равен Ask только на счетах типа ECN. На стандартных счетах такого априори не бывает. Равенство цены 0 или бесконечно большому значению - это также нонсенс, ибо говорит о фатальной ошибке в самом терминале.

Balbesik пишет:

 цитата:
Соответственно сделал вывод, что и Time[0] может быть равен 0.


Может, но это тоже ошибка терминала. Если же iTime(NULL, PERIOD_CURRENT, 0) равен нулю, то это говорит об отсутствии баров на графике. Такое может быть, когда еще не успели загрузиться данные графика. В таких случаях причину нужно выяснять через GetLastError(). Если в такой момент обратиться к Time[0], то это приведет к аварийной остановке программы по причине выхода за пределы массива (массив Time будет пустой).

Balbesik пишет:

 цитата:
шел "слет".


В чем это проявлялось?

Спасибо: 0 
Профиль
Balbesik



Сообщение: 202
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 20.03.15 15:08. Заголовок: Отправлено: 18.03.15..


Scriptong пишет:

 цитата:
В чем это проявлялось?



Картинка графика - Отправлено: 18.03.15 21:06.

Сейчас я на другом компе, а этот "слет", у меня,
шел с самого начала публикации Тикколлектора - на другом компе (точно такие же картинки выкладывал).

Думаю, что если даже вопрос терминала, то сейчас уже уверен, что
дописка помогла ("слет" был на флете или на быстром движении - и то и то уже было).
После остановки (закрытия) терминала повторно график запускается (значит и история корректно записывалась).

Считаю, по Тикколлектору вопрос закрыт.

P.S.

Кстати подумал - да допустим, с точки зрения программиста, это нонсенс,
но а вдруг это "личные доработочки ДЦ" , чтобы советники НЕ работали.

Тем более "слет", как правило, шел на быстрых движениях, имел случайный характер
и после него повторно график не запускался (нечего тиковую историю собирать и
улучшать торговые системы).


Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  2 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет