АвторСообщение
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 [только новые]


Scriptong





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


Balbesik пишет:

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


Дело в том, что подобным образом можно сказать относительно любого советника, индикатора и скрипта, которые имеются в открытом доступе или даже продаются за деньги. Ни один из них не имеет практического применения, т. к. гарантированно не приносит деньги.
Если же любую такую программу рассматривать как инструмент в руках трейдера, то все это сразу приобретает смысл. Как минимум, одному человеку в мире понадобится тот или иной инструмент. К примеру, тот же сборщик тиков с моего сайта, судя по статистике закачек, является одним из наиболее популярных инструментов. То есть даже не одному, а целой группе трейдеров это нужно. Некоторые из них даже выходили со мной на связь и интересовались этим направлением. "График без дыр", кроме тебя, пока еще никто не просил.
Относительно себя скажу так: это направление мне видится интересным, но только в будущем, т. к. на данный момент не обладаю значимой историей котировок (на сегодня это история за 1 год, а нужно хотя бы 2-3). Поэтому исследование тиков я пока отложил, до поры до времени оно мне не интересно.

Balbesik пишет:

 цитата:
А как же имидж, реклама, уважение и проч. (форум) , если говорят,
что не работает, а тебе не когда (хотя к этому «игнору» я привык – «проходили»).


Мухи - отдельно, котлеты - отдельно. Не работает что? Программа не работает? Работает. Идея не работает? Так это уже не ко мне, а к тому, кто хочет получить что-то от этой идеи, т. е. к тебе.
Когда была проблема с появлением ошибки (терминал ругался на файл истории), я ею сразу же занялся и после нескольких недель поиска решений (с твоей помощью) ошибка была исправлена. Сейчас ошибок в работе программы нет.
Ты же сейчас просишь несколько развить программу. Тебе это интересно. Но выше я указал, что мне пока тиковое направление не интересно. А вот насчет "графика без дыр" так я и вовсе не вижу в нем какой-либо перспективы, там уж точно рыбы нет.
Если и буду делать эту доработку, то, скорее всего, из чисто спортивного интереса - решить очередную программистскую задачу. Бывает такое настроение, когда, за что ни возьмись, везде сложные задачи, а эта задача относительно простая. Вот в такое время, когда мозг будет требовать решения не очень сложной задачи, возможно, и будет реализован этот "график без дыр".



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



Сообщение: 281
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 09.06.15 14:20. Заголовок: Игорь! У меня был ..


Пьянь с ханыгою.

Все работает.
Вот рабочий блок для равновысоких -

bool NonStandartTFChart::ConvertData(datetime time, double bid, bool doFlush)
{
if (!m_isActive)
return true;

H_0 = m_chartProperty * m_point; // ????????????????????????????????????????

// Обновление данных текущего бара /**/
m_rates.high = MathMax(m_rates.high, bid);
m_rates.low = MathMin(m_rates.low, bid);
m_rates.close = bid;
m_rates.tick_volume++;

//FileSeek(m_fileHandle, last_fpos, SEEK_CUR); // SEEK_CUR SEEK_SET
//FileWriteStruct(m_fileHandle, m_rates);


// Формирование нового бара
if (m_rates.time == 0 || IsNewBarByConvertType(time))
{
// ??????????? - странно как-то, если вынести наверх if (m_rates.time == 0)....
// то график сразу не появляется в "открыть автономно".

if (m_rates.time == 0)
{
m_rates.open = bid;
m_rates.close = bid;
m_rates.high = bid;
m_rates.low = bid;
m_rates.tick_volume = 1;

if ((int)(time - m_rates.time) < 60) // 60 Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту
time = m_rates.time + 60; // 60 Сдвиг времени открытия нового бара на одну минуту вперед
m_rates.time = time;

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR);
FileWriteStruct(m_fileHandle, m_rates);

last_fpos=(long)FileTell(m_fileHandle);
}
else
{

while( m_rates.close - m_rates.low > H_0) // вверх
{
m_rates.high = m_rates.low + H_0;
m_rates.close = m_rates.low + H_0;

if ((int)(time - m_rates.time) < 60) // 60 Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту
time = m_rates.time + 60; // 60 Сдвиг времени открытия нового бара на одну минуту вперед
m_rates.time = time;

FileSeek(m_fileHandle, last_fpos, SEEK_SET); // SEEK_CUR SEEK_SET
FileWriteStruct(m_fileHandle, m_rates);
//FileFlush(m_fileHandle); // ????????????????????????????????????????

m_rates.low = m_rates.low + H_0;
m_rates.open=m_rates.low;
m_rates.tick_volume = 0; // 1 0 ????????????????????????????????????????
//last_fpos=(long)FileTell(m_fileHandle);
}

while(m_rates.high - m_rates.close > H_0) // вниз
{
m_rates.low = m_rates.high - H_0;
m_rates.close = m_rates.high - H_0;

if ((int)(time - m_rates.time) < 60) // 60 Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту
time = m_rates.time + 60; // 60 Сдвиг времени открытия нового бара на одну минуту вперед
m_rates.time = time;

FileSeek(m_fileHandle, last_fpos, SEEK_SET); // SEEK_CUR SEEK_SET
FileWriteStruct(m_fileHandle, m_rates);
//FileFlush(m_fileHandle); // ????????????????????????????????????????

m_rates.high = m_rates.high - H_0;
m_rates.open = m_rates.high;
m_rates.tick_volume = 0; // 1 0 ????????????????????????????????????????
//last_fpos=(long)FileTell(m_fileHandle);
}


last_fpos=(long)FileTell(m_fileHandle);
}
}
// Продолжение формирования бара
else
{

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // SEEK_CUR SEEK_SET
last_fpos=(long)FileTell(m_fileHandle);
}

// Запись данных текущего бара
if (FileWriteStruct(m_fileHandle, m_rates) != m_ratesSize)
{
Alert(WindowExpertName(), ": ошибка при записи в файл истории. Индикатор отключен.");
return false;
}

if (doFlush)

FileFlush(m_fileHandle);



return true;
}

Много лишнего - я не программист,
завтра скину картинки (просто они на другом компе)

Но "тяжелый" индикатор!


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



Сообщение: 282
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 09.06.15 16:27. Заголовок: Вот сегодня! У меня ..




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



Сообщение: 283
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 09.06.15 16:48. Заголовок: Вот сейчас я решил !..




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





Сообщение: 1599
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация: 3
ссылка на сообщение  Отправлено: 10.06.15 14:43. Заголовок: Снова что-то странно..


Снова что-то странное. Для там FileTell? Не могу понять. Неужели сложно привести все к одному единственному FileWriteStruct, а не вызывать его четыре раза в теле одной и той же функции?

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



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


Scriptong пишет:

 цитата:
Снова что-то странное.



Ну мать твою, ну не мое зто, я тебе дам ПУРО (пульт управления ракетным огнем) и
характеристику заряда.
На 99.99% уверен, что выстрел ты не рассчитаешь не взирая на образование.



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





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


Balbesik пишет:

 цитата:
На 99.99% уверен, что выстрел ты не рассчитаешь не взирая на образование.


Я его просто не возьму. Зачем работать с тем, в чем не разбираешься? Тут два варианта: разобраться и спокойно работать, либо не трогать.

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



Сообщение: 289
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 04.07.15 07:30. Заголовок: Пишу для Игоря и для..


Пишу для Игоря и для тех кому интересно.

Вот работающий блок для равновысокого - плавно, не дискретно, как предыдущий.
Пару недель гонял - не слетает.

Если использовать IsNewBarByConvertType(time), то слет идет случайным образом.

Возможно есть элемент "обрезания" котировок, не знаю, т.к. по коду не исключено.

Переделать блок-схему не смог, да на данном этапе мне и не надо.

Все работает.

Встречный вопрос Игорю - можно ли сделать время бара (сколько секунд формировался) и как,
если строится несколько баров внутри минутного бара или это невозможно?



bool NonStandartTFChart::ConvertData(datetime time, double bid, bool doFlush)
{
if (!m_isActive)
return true;

H_0 = m_chartProperty * m_point; // ????????

// Формирование нового бара

if (m_rates.time == 0)
{
m_rates.open = bid;
m_rates.close = bid;
m_rates.high = bid;
m_rates.low = bid;
m_rates.tick_volume = 1;

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // SEEK_CUR SEEK_SET
FileWriteStruct(m_fileHandle, m_rates);
FileFlush(m_fileHandle);

m_rates.time = time;

}

// Обновление данных текущего бара /**/
m_rates.high = MathMax(m_rates.high, bid);
m_rates.low = MathMin(m_rates.low, bid);
m_rates.close = bid;
m_rates.tick_volume++;


if ((m_rates.close - m_rates.low > H_0 || m_rates.high - m_rates.close > H_0) && H_0!=0) // IsNewBarByConvertType(time)
{

while( m_rates.close - m_rates.low > H_0) // вверх
{
m_rates.high = m_rates.low + H_0;
m_rates.close = m_rates.low + H_0;

if ((int)(time - m_rates.time) < 60) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту
time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // SEEK_CUR SEEK_SET
FileWriteStruct(m_fileHandle, m_rates);
FileFlush(m_fileHandle);

m_rates.time = time;

m_rates.low = m_rates.low + H_0;
m_rates.open=m_rates.low;
m_rates.tick_volume = 1; // 1 0 ????????????????????????????????????????

}

while(m_rates.high - m_rates.close > H_0) // вниз
{
m_rates.low = m_rates.high - H_0;
m_rates.close = m_rates.high - H_0;

if ((int)(time - m_rates.time) < 60) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту
time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // SEEK_CUR SEEK_SET
FileWriteStruct(m_fileHandle, m_rates);
FileFlush(m_fileHandle);

m_rates.time = time;

m_rates.high = m_rates.high - H_0;
m_rates.open = m_rates.high;
m_rates.tick_volume = 1; // 1 0 ????????????????????????????????????????

}

}
// Продолжение формирования бара
else
{

FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // SEEK_CUR SEEK_SET
//last_fpos=(long)FileTell(m_fileHandle);
}

// Запись данных текущего бара
if (FileWriteStruct(m_fileHandle, m_rates) != m_ratesSize)
{
Alert(WindowExpertName(), ": ошибка при записи в файл истории. Индикатор отключен.");
return false;
}

if (doFlush)
FileFlush(m_fileHandle);

return true;
}


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





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


Balbesik пишет:

 цитата:
Встречный вопрос Игорю - можно ли сделать время бара (сколько секунд формировался) и как,
если строится несколько баров внутри минутного бара или это невозможно?


Если речь идет о гэпе, то как можно охарактеризовать время формирования бара? Это ведь один момент, бесконечно малый.
Если же речь просто о быстром изменении котировок без гэпа (большего, чем высота рендж-бара), то несколько баров равновысокого графика будут принадлежать одной минуте. МТ4 этого "не любит". Поэтому и приходится сдвигать время каждого нового бара на 1 минуту. Меньший сдвиг организовать невозможно из-за ограничений МТ4.

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



Сообщение: 294
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 07.07.15 20:27. Заголовок: Scriptong пишет: Ес..


Scriptong пишет:

 цитата:
Если речь идет о гэпе, то как можно охарактеризовать время формирования бара? Это ведь один момент, бесконечно малый.
Если же речь просто о быстром изменении котировок без гэпа (большего, чем высота рендж-бара), то несколько баров равновысокого графика будут принадлежать одной минуте. МТ4 этого "не любит". Поэтому и приходится сдвигать время каждого нового бара на 1 минуту. Меньший сдвиг организовать невозможно из-за ограничений МТ4.



Да нет конечно, ты опять не понял (а может быть это правильно) -
просто Игорь ты "не догоняешь"
Простои вопрос реши - время бара? (не время открытия (закрытия)).
Время формирования, в не закрытия или закрытия.

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





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


Balbesik пишет:

 цитата:
Да нет конечно, ты опять не понял (а может быть это правильно) -
просто Игорь ты "не догоняешь"
Простои вопрос реши - время бара? (не время открытия (закрытия)).
Время формирования, в не закрытия или закрытия.


Согласен, не догоняю. Объясни, чем отличается время формирования от времени открытия?

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



Сообщение: 297
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 07.07.15 22:07. Заголовок: Я не понял по пьяне...


«Согласен, не догоняю. Объясни, чем отличается время формирования от времени открытия?»


Я же писал бары внутри стандартного минутного бара.

Если задали 60 секунд, а бар формировался 20 и допустим следующий бар 25 секунд,
время открытия все равно через 60 секунд идет.

Если берем «большой размах», но построение прошло внутри минутного бара,
то опять конструкция (TimeCurrent()-Time) не работает,
если минута прошла, а бар с «большим размахом» еще не сформирован, то вроде работает.

Запутался я с этим временами и «плюнул» - задача не моего уровня.

Цель была простая - использовать всю доступную информацию.

Есть более серьезная проблемка и предполагаю вопросы взаимосвязаны.
Изложу на ветке «Недискрентные рендж-бары».


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



Сообщение: 298
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 07.07.15 22:18. Заголовок: B..


Кстати запись - FileFlush(m_fileHandle); не нужна.
можно закомментировать - вроде не влияет.

Лишняя нагрузка на комп.

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



Сообщение: 299
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 10.07.15 09:12. Заголовок: Ответил "на стар..


Ответил "на старое" место сообщений, а они "не светятся".

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



Сообщение: 301
Зарегистрирован: 13.03.13
Репутация: -1
ссылка на сообщение  Отправлено: 13.07.15 18:10. Заголовок: Со свей стороны пос..


Со свей стороны посмотрел - если есть решение , то я "баллеринв".
Посмотрим на спеца!
Просто - это не мое.
Уверен, что спец не решит -
Ну нет а массве места, если, тольео за счет спреда!
Вроде можно решить.
Жду профи.
Ну , мне так кажеться - я решу задачку.
А интересно решение ПРОФИ.

Спасибо: 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
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет