Автор | Сообщение |
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); } И в результатах индикатор вообще не работает. Как его исправит?
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
All
[только новые]
|
|
Balbesik
|
| |
Сообщение: 272
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 02.06.15 17:45. Заголовок: Блин! Сто раз я тебе..
Блин! Сто раз я тебе говорил - ну не умею я объяснять! Вот разрывы - Да не приделах тут бары вообще, а эквиобъемные вообще - как зайцу пятая нога. Запутался я в этих записях, перезаписях и обращениях в твоем алгоритме - надо мне время раз тебе некогда. P.S. Покажи мне хоть один график каги, ренки, ренджи, крестики - нолеки, синтетики и проч., где есть "разрывы" - да это и есть цель этих "изголяций". Все от "разрывов" стараются уйти. Просто методом "укрупнения" (большой размах) идет потеря "чувствительности". Я уже не знаю как объяснять.
|
|
|
Scriptong
|
| |
Сообщение: 1574
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 02.06.15 21:37. Заголовок: Balbesik пишет: Бли..
Balbesik пишет: цитата: | Блин! Сто раз я тебе говорил - ну не умею я объяснять! |
| Мне это известно. Раз ты сам это хорошо понимаешь, то не нервничай, когда тебя не понимает собеседник, а попытайся терпеливо объяснить другими словами, чего хотел. Ведь от признания тобой факта не умения объяснять я все равно не смогу правильно понять суть того, что ты сказал. Balbesik пишет: Да, есть гэпы между тиками (когда между соседними тиками более одного пункта). И что? Для меня это не новость. Для того чтобы убрать эти гэпы, нужно сделать то, о чем ты просишь - "график без дыр". Этим я пока заниматься не буду. Возможно, когда-то в будущем. Balbesik пишет: цитата: | Покажи мне хоть один график каги, ренки, ренджи, крестики - нолеки, синтетики и проч., где есть "разрывы" - да это и есть цель этих "изголяций". |
| Все существующие индикаторы основаны на данных минутного графика, который скрывает гэпы между тиками. Соответственно, на графиках, которые строят эти индикаторы (скрипты), нет такого количества гэпов. Мой же способ построения - на основе тиков. Он абсолютно точный, показывает реальность такой, какая она есть. Да, она не такая красивая и причесанная, но это 100%-ая реальность. Если сделать по этому методу "график без дыр", то мы получим не причесанную реальность, которую показывают имеющиеся каги, ренджи и т. д., а дополненную реальность. Итоговый график все равно будет отличаться от тех графиков, которые строят перечисленные индикаторы.
|
|
|
Balbesik
|
| |
Сообщение: 273
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 03.06.15 18:30. Заголовок: Scriptong пишет: Мо..
Scriptong пишет: цитата: | Мой же способ построения - на основе тиков. Он абсолютно точный, |
| Самое смешное, что об этом никто и не спорит. Только я тебе про черное, а ты мне про белое. Да не нужна твоя точность никому. Людям (если ты не работаешь на "кухни") нужен прогноз на основании индикаторов, сове6тников м прочих инструментах (математики - другого мы не знаем). Это не возможно сделать "на рваном пространстве". Ну не работает функция (индикатор) на "рваных" данных. Пока "Ньютоноское яблоко" падает вниз - соблюдаются законы математики. Твоя "точность" просто мешает и искажает. Да сделал я уже все (тебе бы понадобилась минут 15). Сейчас ( в течении часа) картинку (надо поймать характерную) выложу. Если кому интересно - пишите - алгоритм прямо здесь выложу. Там действительно 2*2 = 4, но как я и писал - с этими "записями- перезаписями в схеме Игоря" пришлось повозится. Пока не характерно -
|
|
|
Scriptong
|
| |
Сообщение: 1579
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 04.06.15 09:26. Заголовок: Balbesik пишет: Тол..
Balbesik пишет: цитата: | Только я тебе про черное, а ты мне про белое. |
| Еще раз: все я прекрасно понял. Просто ты, почему-то, не можешь сложить у себя целостное представление о проблеме, постоянно вырезая ее кусочки. Balbesik пишет: цитата: | Да сделал я уже все (тебе бы понадобилась минут 15). |
| Опять 25. Не делается все на "раз два". Тяп-ляп - это не мой подход. Для нормальной разработки требуется несколько дней. И то после этого выплывает куча нюансов, которые не смог предусмотреть.
|
|
|
Balbesik
|
| |
Сообщение: 275
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 04.06.15 10:59. Заголовок: Scriptong пишет: Оп..
Scriptong пишет: цитата: | Опять 25. Не делается все на "раз два". Тяп-ляп - это не мой подход. Для нормальной разработки требуется несколько дней. И то после этого выплывает куча нюансов, которые не смог предусмотреть. |
| Я не мудрствовал - взял по аналогии Синбара - изменена только bool NonStandartTFChart::ConvertData(datetime time, double bid, bool doFlush) . Меня не интересуют временной и объемный график (только под равновысокий). Пока работает нормально. Но у меня есть три вопроса. Найдешь время посмотреть?
|
|
|
Scriptong
|
| |
Сообщение: 1582
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 04.06.15 12:40. Заголовок: Balbesik пишет: Най..
Balbesik пишет: цитата: | Найдешь время посмотреть? |
| Только выкладывай файлами.
|
|
|
Balbesik
|
| |
Сообщение: 276
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 04.06.15 13:39. Заголовок: Scriptong пишет: То..
Scriptong пишет: цитата: | Только выкладывай файлами. |
| click here 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++; // Формирование нового бара 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) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед m_rates.time = time; last_fpos=(long)FileTell(m_fileHandle); } 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; FileSeek(m_fileHandle, last_fpos, SEEK_SET); // SEEK_CUR SEEK_SET FileWriteStruct(m_fileHandle, m_rates); //FileFlush(m_fileHandle); // ???????????????????????????????????????? if ((int)(time - m_rates.time) < 60) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед m_rates.time = time; 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; FileSeek(m_fileHandle, last_fpos, SEEK_SET); // SEEK_CUR SEEK_SET FileWriteStruct(m_fileHandle, m_rates); //FileFlush(m_fileHandle); // ???????????????????????????????????????? if ((int)(time - m_rates.time) < 60) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед m_rates.time = time; 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); } } // Продолжение формирования бара else FileSeek(m_fileHandle, -m_ratesSize, SEEK_CUR); // Запись данных текущего бара if (FileWriteStruct(m_fileHandle, m_rates) != m_ratesSize) { Alert(WindowExpertName(), ": ошибка при записи в файл истории. Индикатор отключен."); return false; } if (doFlush) FileFlush(m_fileHandle); return true; } Недостаток - идеально работает только свыше спреда (20 пунктов и более). Оснавная моя проблема - ине вечно не хватает памяти. Вопросы 1. H_0 = m_chartProperty * m_point; - можно ли это "загнать" в инит? - меньше считать. 2. //FileFlush(m_fileHandle); - закоментировал, чтобы меньше считало - разницы нет, но есть сомнение - а правомерно ли? Ну и самое не понятное 3. 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) // Время открытия нового бара отличается от времени открытия предыдущего бара менее, чем на 1-у минуту time = m_rates.time + 60; // Сдвиг времени открытия нового бара на одну минуту вперед m_rates.time = time; last_fpos=(long)FileTell(m_fileHandle); - это масло - масленое обязательно иначе барахлит } если вынести наверх - для красоты, то не сразу появляется грфик в "Открыть автономно", если есть ранняя история то конечно есть и работает сразу. Что не так?
|
|
|
Balbesik
|
| |
Сообщение: 274
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 04.06.15 06:18. Заголовок: Сделал просто "и..
Сделал просто "искусственный Геп" Более характерно.
|
|
|
Scriptong
|
| |
Сообщение: 1583
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 04.06.15 14:43. Заголовок: К сожалению, ты вооб..
К сожалению, ты вообще не разобрался в назначении той или иной строки в коде. Самая главная ошибка - использование записи в файл внутри условий, которые корректируют структуру m_rates: цитата: | while( m_rates.close - m_rates.low > H_0) // вверх { .... FileWriteStruct(m_fileHandle, m_rates); .... } while(m_rates.high - m_rates.close > H_0) // вниз { .... FileWriteStruct(m_fileHandle, m_rates); ... } |
| Это нельзя помещать перед штатной записью: цитата: | // Запись данных текущего бара if (FileWriteStruct(m_fileHandle, m_rates) != m_ratesSize) { Alert(WindowExpertName(), ": ошибка при записи в файл истории. Индикатор отключен."); return false; } |
| Ну а по большому счету - направление мысли правильное. Просто не учитывается громадное количество нюансов. Как сделать правильно, сам не знаю, т. к. для этого нужно сесть и сделать, на что времени нет. Но так, как сделано, тоже нельзя.
|
|
|
Balbesik
|
| |
Сообщение: 277
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 05.06.15 06:30. Заголовок: Scriptong пишет: К..
Scriptong пишет: цитата: | К сожалению, ты вообще не разобрался в назначении той или иной строки в коде. |
| Это нормально. Я не программист, никогда меня этому не учили и поэтому и обращаюсь к профи. Scriptong пишет: цитата: | Самая главная ошибка - использование записи в файл внутри условий |
| Даже не задумывался - повторил Синбар (все вопросы туда). Scriptong пишет: цитата: | которые корректируют структуру m_rates: |
| А вот это не понял. Вроде как структура остается, а меняются только величины параметров. Интересно - Вот если размах бара менее 20 пунктов (спред) при данном решении индикатор не работает. У Компостера была та же проблема (он на ее плюнул), возможно это не зависит от программиста (а зависит от каких-то потоков передачи информации). Но если исправить мои ошибки (как-то) - это может решить задачу уменьшения размаха бара (увеличения чувствительности)?
|
|
|
Balbesik
|
| |
Сообщение: 278
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 05.06.15 08:47. Заголовок: Balbesik пишет: 2. ..
|
|
|
|
Scriptong
|
| |
Сообщение: 1586
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 05.06.15 18:22. Заголовок: Balbesik пишет: Но ..
Balbesik пишет: цитата: | Но если исправить мои ошибки (как-то) - это может решить задачу уменьшения размаха бара (увеличения чувствительности)? |
| Чтобы исправить твои ошибки, мне самому нужно сесть и разобраться (придумать правильную архитектуру кода и ее реализацию), как переделать равновысокие бары в "графики без дыр". В ближайшее время я этим заняться не могу. Balbesik пишет: цитата: | У Компостера была та же проблема (он на ее плюнул), возможно это не зависит от программиста (а зависит от каких-то потоков передачи информации). |
| Эту проблему невозможно решить, имея только минутные данные. Нужны тики. На тот момент у komposter'а не было истории тиков.
|
|
|
Balbesik
|
| |
Сообщение: 279
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 06.06.15 13:01. Заголовок: Scriptong пишет: пр..
Scriptong пишет: цитата: | придумать правильную архитектуру кода и ее реализацию |
| Игорь! Абсолютно «не горит» по времени, но очень интересно, если бы ты занялся этой проблемой. Не понимая взаимосвязей, чисто методом «научного втыка», кажется добился стабильной работы на маленьких размахах и при отсутствии тиковой истории, запуска графика сразу. Вынес из циклов last_fpos=(long)FileTell(m_fileHandle); , но оставил под условием IsNewBarByConvertType(time), а главное добавил last_fpos=(long)FileTell(m_fileHandle); под else, без этого не работало стабильно. Кажется при всех условиях работает – но сейчас проверяю. На мои взгляд, у меня индикатор получился «очень тяжелый», Хотя получаемый график похож на построение "график без дыр", ну или «гладкий» (по сленгу МКЛ). Буду ждать.
|
|
|
Scriptong
|
| |
Сообщение: 1588
Зарегистрирован: 03.03.13
Откуда: Украина, Днепродзержинск
Репутация:
3
|
|
Отправлено: 07.06.15 14:42. Заголовок: Balbesik пишет: Буд..
Balbesik пишет: Да, пока, к сожалению, только так...
|
|
|
Balbesik
|
| |
Сообщение: 280
Зарегистрирован: 13.03.13
Репутация:
-1
|
|
Отправлено: 08.06.15 18:55. Заголовок: Scriptong пишет: Да..
Scriptong пишет: цитата: | Да, пока, к сожалению, только так... |
| Да, пока, к сожалению и у меня нет решения и только так. На «быстрых» движениях идет «слет» (менее спреда), что фактически подтверждает, что решение неверно, но и подтверждает, что график валют подвержен законам математики (я бы удивился, если было бы иначе) – идет разрыв и функция (индикатор, советник и скрипт) не работают (или работают не корректно) – кстати, это касается и стандартных графиков. Видимо ты прав – конструкция алгоритма «неверна». Но вот, что мне интересно – Я утверждаю, что твое построение равновысоких баров не имеет практического значения для трейдеров и того набора инструментов (индикаторов, советников и скриптов), что присутствуют в терминале, и в т.ч. и пользовательских. Ты это, пока, опровергнуть не можешь (ну я не видел достаточного опровержения) . И поэтому интересно - разработка твоя, я утверждаю, что решение не имеет смысла и прошу доработать. Тебе некогда. А как же имидж, реклама, уважение и проч. (форум) , если говорят, что не работает, а тебе не когда (хотя к этому «игнору» я привык – «проходили»). Кроме точности отображения (которая не несет практического смысла) не доводится иное обоснование принятого построения (ну просто тебе так захотелось - в конце концов никому не обязан)? Знаешь, есть закон (классика) – достоверность входных данных более значима, чем сама система (индикатор, советник и скрипт) работающая по этим данным. Мой вышеизложенный «опус» не значит, что все надо бросить, но и не надо вводить в заблуждение разработкой ради разработки.
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
All
[только новые]
|
|