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

Я новичок.

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: Блин! Сто раз я тебе говорил - ну не умею я объяснять! Вот разрывы - Да не приделах тут бары вообще, а эквиобъемные вообще - как зайцу пятая нога. Запутался я в этих записях, перезаписях и обращениях в твоем алгоритме - надо мне время раз тебе некогда. P.S. Покажи мне хоть один график каги, ренки, ренджи, крестики - нолеки, синтетики и проч., где есть "разрывы" - да это и есть цель этих "изголяций". Все от "разрывов" стараются уйти. Просто методом "укрупнения" (большой размах) идет потеря "чувствительности". Я уже не знаю как объяснять.

Scriptong: Balbesik пишет: Блин! Сто раз я тебе говорил - ну не умею я объяснять! Мне это известно. Раз ты сам это хорошо понимаешь, то не нервничай, когда тебя не понимает собеседник, а попытайся терпеливо объяснить другими словами, чего хотел. Ведь от признания тобой факта не умения объяснять я все равно не смогу правильно понять суть того, что ты сказал. Balbesik пишет: Вот разрывы - Да, есть гэпы между тиками (когда между соседними тиками более одного пункта). И что? Для меня это не новость. Для того чтобы убрать эти гэпы, нужно сделать то, о чем ты просишь - "график без дыр". Этим я пока заниматься не буду. Возможно, когда-то в будущем. Balbesik пишет: Покажи мне хоть один график каги, ренки, ренджи, крестики - нолеки, синтетики и проч., где есть "разрывы" - да это и есть цель этих "изголяций". Все существующие индикаторы основаны на данных минутного графика, который скрывает гэпы между тиками. Соответственно, на графиках, которые строят эти индикаторы (скрипты), нет такого количества гэпов. Мой же способ построения - на основе тиков. Он абсолютно точный, показывает реальность такой, какая она есть. Да, она не такая красивая и причесанная, но это 100%-ая реальность. Если сделать по этому методу "график без дыр", то мы получим не причесанную реальность, которую показывают имеющиеся каги, ренджи и т. д., а дополненную реальность. Итоговый график все равно будет отличаться от тех графиков, которые строят перечисленные индикаторы.

Balbesik: Scriptong пишет: Мой же способ построения - на основе тиков. Он абсолютно точный, Самое смешное, что об этом никто и не спорит. Только я тебе про черное, а ты мне про белое. Да не нужна твоя точность никому. Людям (если ты не работаешь на "кухни") нужен прогноз на основании индикаторов, сове6тников м прочих инструментах (математики - другого мы не знаем). Это не возможно сделать "на рваном пространстве". Ну не работает функция (индикатор) на "рваных" данных. Пока "Ньютоноское яблоко" падает вниз - соблюдаются законы математики. Твоя "точность" просто мешает и искажает. Да сделал я уже все (тебе бы понадобилась минут 15). Сейчас ( в течении часа) картинку (надо поймать характерную) выложу. Если кому интересно - пишите - алгоритм прямо здесь выложу. Там действительно 2*2 = 4, но как я и писал - с этими "записями- перезаписями в схеме Игоря" пришлось повозится. Пока не характерно -


Scriptong: Balbesik пишет: Только я тебе про черное, а ты мне про белое. Еще раз: все я прекрасно понял. Просто ты, почему-то, не можешь сложить у себя целостное представление о проблеме, постоянно вырезая ее кусочки. Balbesik пишет: Да сделал я уже все (тебе бы понадобилась минут 15). Опять 25. Не делается все на "раз два". Тяп-ляп - это не мой подход. Для нормальной разработки требуется несколько дней. И то после этого выплывает куча нюансов, которые не смог предусмотреть.

Balbesik: Scriptong пишет: Опять 25. Не делается все на "раз два". Тяп-ляп - это не мой подход. Для нормальной разработки требуется несколько дней. И то после этого выплывает куча нюансов, которые не смог предусмотреть. Я не мудрствовал - взял по аналогии Синбара - изменена только bool NonStandartTFChart::ConvertData(datetime time, double bid, bool doFlush) . Меня не интересуют временной и объемный график (только под равновысокий). Пока работает нормально. Но у меня есть три вопроса. Найдешь время посмотреть?

Scriptong: Balbesik пишет: Найдешь время посмотреть? Только выкладывай файлами.

Balbesik: 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: Сделал просто "искусственный Геп" Более характерно.

Scriptong: К сожалению, ты вообще не разобрался в назначении той или иной строки в коде. Самая главная ошибка - использование записи в файл внутри условий, которые корректируют структуру 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: Scriptong пишет: К сожалению, ты вообще не разобрался в назначении той или иной строки в коде. Это нормально. Я не программист, никогда меня этому не учили и поэтому и обращаюсь к профи. Scriptong пишет: Самая главная ошибка - использование записи в файл внутри условий Даже не задумывался - повторил Синбар (все вопросы туда). Scriptong пишет: которые корректируют структуру m_rates: А вот это не понял. Вроде как структура остается, а меняются только величины параметров. Интересно - Вот если размах бара менее 20 пунктов (спред) при данном решении индикатор не работает. У Компостера была та же проблема (он на ее плюнул), возможно это не зависит от программиста (а зависит от каких-то потоков передачи информации). Но если исправить мои ошибки (как-то) - это может решить задачу уменьшения размаха бара (увеличения чувствительности)?

Balbesik:

Scriptong: Balbesik пишет: Но если исправить мои ошибки (как-то) - это может решить задачу уменьшения размаха бара (увеличения чувствительности)? Чтобы исправить твои ошибки, мне самому нужно сесть и разобраться (придумать правильную архитектуру кода и ее реализацию), как переделать равновысокие бары в "графики без дыр". В ближайшее время я этим заняться не могу. Balbesik пишет: У Компостера была та же проблема (он на ее плюнул), возможно это не зависит от программиста (а зависит от каких-то потоков передачи информации). Эту проблему невозможно решить, имея только минутные данные. Нужны тики. На тот момент у komposter'а не было истории тиков.

Balbesik: Scriptong пишет: придумать правильную архитектуру кода и ее реализацию Игорь! Абсолютно «не горит» по времени, но очень интересно, если бы ты занялся этой проблемой. Не понимая взаимосвязей, чисто методом «научного втыка», кажется добился стабильной работы на маленьких размахах и при отсутствии тиковой истории, запуска графика сразу. Вынес из циклов last_fpos=(long)FileTell(m_fileHandle); , но оставил под условием IsNewBarByConvertType(time), а главное добавил last_fpos=(long)FileTell(m_fileHandle); под else, без этого не работало стабильно. Кажется при всех условиях работает – но сейчас проверяю. На мои взгляд, у меня индикатор получился «очень тяжелый», Хотя получаемый график похож на построение "график без дыр", ну или «гладкий» (по сленгу МКЛ). Буду ждать.

Scriptong: Balbesik пишет: Буду ждать. Да, пока, к сожалению, только так...

Balbesik: Scriptong пишет: Да, пока, к сожалению, только так... Да, пока, к сожалению и у меня нет решения и только так. На «быстрых» движениях идет «слет» (менее спреда), что фактически подтверждает, что решение неверно, но и подтверждает, что график валют подвержен законам математики (я бы удивился, если было бы иначе) – идет разрыв и функция (индикатор, советник и скрипт) не работают (или работают не корректно) – кстати, это касается и стандартных графиков. Видимо ты прав – конструкция алгоритма «неверна». Но вот, что мне интересно – Я утверждаю, что твое построение равновысоких баров не имеет практического значения для трейдеров и того набора инструментов (индикаторов, советников и скриптов), что присутствуют в терминале, и в т.ч. и пользовательских. Ты это, пока, опровергнуть не можешь (ну я не видел достаточного опровержения) . И поэтому интересно - разработка твоя, я утверждаю, что решение не имеет смысла и прошу доработать. Тебе некогда. А как же имидж, реклама, уважение и проч. (форум) , если говорят, что не работает, а тебе не когда (хотя к этому «игнору» я привык – «проходили»). Кроме точности отображения (которая не несет практического смысла) не доводится иное обоснование принятого построения (ну просто тебе так захотелось - в конце концов никому не обязан)? Знаешь, есть закон (классика) – достоверность входных данных более значима, чем сама система (индикатор, советник и скрипт) работающая по этим данным. Мой вышеизложенный «опус» не значит, что все надо бросить, но и не надо вводить в заблуждение разработкой ради разработки.



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