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

Я новичок.

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

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

Balbesik: Пьянь с ханыгою. Все работает. Вот рабочий блок для равновысоких - 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; } Много лишнего - я не программист, завтра скину картинки (просто они на другом компе) Но "тяжелый" индикатор!

Balbesik:


Balbesik:

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

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

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

Balbesik: Пишу для Игоря и для тех кому интересно. Вот работающий блок для равновысокого - плавно, не дискретно, как предыдущий. Пару недель гонял - не слетает. Если использовать 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; }

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

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

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

Balbesik: «Согласен, не догоняю. Объясни, чем отличается время формирования от времени открытия?» Я же писал бары внутри стандартного минутного бара. Если задали 60 секунд, а бар формировался 20 и допустим следующий бар 25 секунд, время открытия все равно через 60 секунд идет. Если берем «большой размах», но построение прошло внутри минутного бара, то опять конструкция (TimeCurrent()-Time) не работает, если минута прошла, а бар с «большим размахом» еще не сформирован, то вроде работает. Запутался я с этим временами и «плюнул» - задача не моего уровня. Цель была простая - использовать всю доступную информацию. Есть более серьезная проблемка и предполагаю вопросы взаимосвязаны. Изложу на ветке «Недискрентные рендж-бары».

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

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

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



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