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

Я новичок.

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: Добрый вечер! Не умею объяснять. Начну с того, что идет речь о инструменте, а не о методе тех. анализа. Инструмент разбивается на два – для истории и для реала. С начало с этого – Scriptong пишет: На рисунках же приведено что-то странное. Если крайняя правая колонка указывает тиковый объем, то каким образом все четыре цены минутного бара оказываются разными? Скорее всего, в данных, откуда взята минутная история, не было информации о тиковом объеме. Его просто добавили для совместимости с МТ4. Но тогда на эти единички не стоит о Рисунки взяты с графика равновысоких баров по истории. 1 заложена в алгоритме синбара. В этом и проблема. Четыре цены – это значения у разложенной минутки на равновысокие бары. При этом объёма на истории равновысоких баров нет, хотя на 1 минутке он есть. На реале на равновысоких барах объём есть. Все это время, попытки разложить объём 1 минутки (история) пропорционально на равновысокие бары не удались. Т.е. брал синбар, для работы по истории. Я сделать не могу. Ну и в данный момент, кроме прочего, советники, в т.ч. штатные, перестали видеть всю «скаченную» историю (только недели 2) – тут масса вопросов. Накопленную историю с реала советники пока «видят» - или Метаквосты «стараются» или что-то опять с кодом. Т.е. попробую далее на словах (без картинок) – Scriptong пишет: Эта фраза вроде бы говорит о том, что все-таки требуется некий микс из эквиобъемных и равновысоких баров. Меня именно этот способ сначала заинтересовал, но потом вроде бы понял, что требуется другое. Теперь вновь возвращаемся назад. Видимо придется набраться тебе терпения и объяснять мне до тех пор, пока не дойдет до меня. Когда я писал про «не надо солянку» подразумевал, что надо 2 графика, а не один график – «сурогат». Еще раз – исходный 1 минутный бар размахом 20 пунктов и «условный объем» 20 единиц. А) задаем 10 пунктов р/в и 10 ед. объема, раскладываем на равновысокие по 10 пунктов и по 10 ед. объёма получим 2 совпадающих бара. Б) задаем 10 пунктов р/в и 5 ед. объема, при этом на первые 10 пунктов р/в бара приходится 5 ед. обьема, а на 2 р/в бар приходится 15 ед. обьема, раскладываем на равновысокие по 10 пунктов и по объёму на первый р/в бар 1 бар объема, на 2 р/в бар 3 бара объема. С) задаем 10 пунктов р/в и 15 ед. объема, при этом на первые 10 пунктов р/в бара приходится 12 ед. обьема (бар по объему не сформирован) и формирование бара по объему происходит на 2 р/в баре и 5 ед. объема «уйдет» на следующую минуту. Получим 2 р/в барам соответствует 1 бар по объему. Основная задача «связать» 2 графика, «без разрывов квждый», равновысоких и равнообъёмных баров. Мы имеем на баре цены, тиковый объем и время. Хотя и цены и время формирования могут быть разные, но по специфики построения (время р/в бара – по цене закрытия) будет связка по времени равновысокого бара. Остаточный объём не принципиален – он компенсирует сам себя (разность уйдет на "0" бар). Как бы линейный график времени превращаем в 2 нелинейных графика и пытаемся их согласовать.

Scriptong: Balbesik пишет: Все это время, попытки разложить объём 1 минутки (история) пропорционально на равновысокие бары не удались. Т.е. брал синбар, для работы по истории. Возьми TicksCollector. Он даст реальный тиковый объем для равновысоких баров, а не 1. Balbesik пишет: С) задаем 10 пунктов р/в и 15 ед. объема, при этом на первые 10 пунктов р/в бара приходится 12 ед. обьема (бар по объему не сформирован) и формирование бара по объему происходит на 2 р/в баре и 5 ед. объема «уйдет» на следующую минуту. Получим 2 р/в барам соответствует 1 бар по объему. Я именно так себе и представлял совмещение равновысоких и эквиобъемных графиков. И уже говорил о проблеме, которая возникнет - постоянное рассогласование по количеству баров. На графике это будет выглядеть как рассогласование по времени. Берем график равновысоких свечей с высотой 10 пунктов (М313) и эквиобъемный график с количеством тиков 100 (М314) на свечу. В одном случае получим бОльшее количество свечей, приходящееся на выбранный промежуток времени, на графике равновысоких свечей: Во втором случае бОльшее количество свечей будет на стороне эквиобъемного графика: Придумав решение этой проблемы, можно говорить о совмещении двух графиков на одном поле. До этого момента придется просто ставить разные графики один под другим, не имея проблем с разрывами в данных.

Balbesik: Добрый день, Игорь! Scriptong пишет: Возьми TicksCollector. Он даст реальный тиковый объем для равновысоких баров, а не 1. Брал для равновысоких. Я с ним справится не могу, я об этом писал раннее - с момента публикации и позднее – первая картинка – Отправлено: 17.10.14 13:20. Заголовок: http://f6.s.qip.ru/2.. Предположил, что у меня проблема памяти, а память, из-за оптимизации в советнике, на пределе. Сейчас повторно, но уже с равнообъёмными, поставил – посмотрю. Scriptong пишет: Я именно так себе и представлял совмещение равновысоких и эквиобъемных графиков. И уже говорил о проблеме, которая возникнет - постоянное рассогласование по количеству баров. На графике это будет выглядеть как рассогласование по времени. Берем график равновысоких свечей с высотой 10 пунктов (М313) и эквиобъемный график с количеством тиков 100 (М314) на свечу. В одном случае получим бОльшее количество свечей, приходящееся на выбранный промежуток времени, на графике равновысоких свечей: Рассогласование по количеству баров, на мой взгляд, это как раз хорошо. А вот по времени – да так, как бы и должно быть, но в этом и вопрос. Тут конечно масса вариантов. Четыре вопроса: 1. Модель формирования равновысокого бара. 2. В зависимости от модели равновысокого – модель формирования равнообъемного бара. 3. Проблема масштабирования. 4. Знание программирования. Я и предлагаю «на посмотреть» приведение закрытия равнообъемного бара ко времени закрытия равновысокого бара – на картинке обведено красным. Исходил из того, что например, между минутками может быть сколько угодно равновысоких баров и соответственно между равновысокими равнообьемных. А дальше проще.


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

Anatoliy: Добрый, суток. Где хранится звуковые файлы? В документации указана каталог_терминала\Sounds или его подкаталоге. А как поточнее их найти? А если их нету, то самому создать папку?!

Genry: День добрый, Анатолий! Anatoliy пишет: Где хранится звуковые файлы? В документации указана каталог_терминала\Sounds Обычно здесь: C:\Program Files (x86)\MT4\Sounds

Anatoliy: Спасибо, Genry Я нашёл! Не так сразу можно найти!!!

Scriptong: Существует универсальный способ нахождения папки данных терминала: меню "Файл" - "Открыть каталог данных". Откроется проводник с корневой папкой данных терминала. В ней будут и папка Sounds, и папка MQL4 и т. д.

skilful_coder: Привет Scriptong! Мне надо код Number of Retry Attempts for Order Execution(Количество повторных попыток для выполнения заказа). Пожалуйста помогите меня?!

Scriptong: skilful_coder пишет: Привет Scriptong! Мне надо код Number of Retry Attempts for Order Execution(Количество повторных попыток для выполнения заказа). Пожалуйста помогите меня?! Ответил здесь.

Balbesiuk: Интересно, после удаления меня, как гр. РФ, будет текст или нет? Есть такой Аксин на Лайте, мы много спорили с Александром, что такое дивергенция? А есть ли она? Еще никто мне не доказал, что это имеет место быть, в принципе! А что это такое? Если это сообщение "проскочит" может кто прояснит, как и откуда берется это рассогласование? P.S. Игорь, вопрос снят - видишь форум меня "пропустил"???.

Scriptong: Balbesiuk пишет: Есть такой Аксин на Лайте, мы много спорили с Александром, что такое дивергенция? Тут спорить не о чем. Есть понятие - "расхождение показаний индикатора и цены". В общей трактовке, если не вдаваться в точные математические формулировки, имеет достаточно однозначное определение: разнонаправленность трендовых линий, проведенных через точки локальных экстремумов. Если же копать дальше, в правила, то у дивергенции таких общепринятых правил нет. Каждый строит дивергенции по своим правилам. Balbesiuk пишет: Игорь, вопрос снят - видишь форум меня "пропустил"???. Да я уже привык к тому, что ты часто "паникуешь" Вспомнил пароль - ну и хорошо.

Balbesik: Привет, Игорь! Нм чего не вспоминал и не забывал! Это "глюк" на форуме, кстати Balbesiuk - не регистрировал, сам "вошел". Ну ладно, суть в другом - используя периодические и непериодические колебания для расчета и в качестве фильтра взяв ОBV с изменением, удалось уменьшить дивергенцию с порядка 15-18 за период, до 2-3 значений - это здорово для фильтра. Все таки интересно вернуться к "обьему". По OBV - for(i=nLimit; i>=0; i--) // слево - из истории { if(MathAbs(iHigh(NULL,PERIOD_CURRENT,i)-iLow(NULL,PERIOD_CURRENT,i))!=0) DeltaOH=NormalizeDouble(MathAbs(iHigh(NULL,PERIOD_CURRENT,i)-iOpen(NULL,PERIOD_CURRENT,i)) / MathAbs(iHigh(NULL,PERIOD_CURRENT,i)-iLow(NULL,PERIOD_CURRENT,i)),5); if(MathAbs(iHigh(NULL,PERIOD_CURRENT,i)-iLow(NULL,PERIOD_CURRENT,i))!=0) DeltaOL=NormalizeDouble(MathAbs(iLow(NULL,PERIOD_CURRENT,i)-iOpen(NULL,PERIOD_CURRENT,i)) / MathAbs(iHigh(NULL,PERIOD_CURRENT,i)-iLow(NULL,PERIOD_CURRENT,i)),5); if(iClose(NULL,PERIOD_CURRENT,i)==iHigh(NULL,PERIOD_CURRENT,i) && DeltaOH!=0)DeltaOH1=iVolume(NULL,PERIOD_CURRENT,i) * DeltaOH; DeltaOL1=MathAbs(iVolume(NULL,PERIOD_CURRENT,i) - DeltaOH1); if(iClose(NULL,PERIOD_CURRENT,i)==iLow(NULL,PERIOD_CURRENT,i) && DeltaOL!=0) DeltaOL1=iVolume(NULL,PERIOD_CURRENT,i) * DeltaOL; DeltaOH1=MathAbs(iVolume(NULL,PERIOD_CURRENT,i) - DeltaOL1); DeltaV1=MathAbs(DeltaOH1 - DeltaOL1); //if(DeltaOH > DeltaOL)DeltaV1=DeltaOH1; //if(DeltaOH < DeltaOL)DeltaV1=DeltaOL1; // - //Print(" DeltaOH1 ",DeltaOH1); //Print(" DeltaOL1 ",DeltaOL1); //Print(" DeltaV1 ",DeltaV1); //Print(" iVolume(NULL,PERIOD_CURRENT,i) ",iVolume(NULL,PERIOD_CURRENT,i)); if(i==iBars(NULL,PERIOD_CURRENT)-1) ExtOBVBuffer=DeltaV1; // стартовый обьем DeltaV1 iVolume(NULL,PERIOD_CURRENT,i) else { dCurrentPrice=GetAppliedPrice(ExtOBVAppliedPrice, i); dPreviousPrice=GetAppliedPrice(ExtOBVAppliedPrice, i+1); if(dCurrentPrice==dPreviousPrice || iVolume(NULL,PERIOD_CURRENT,i)==0) ExtOBVBuffer=ExtOBVBuffer[i+1]; else { if(dCurrentPrice<dPreviousPrice) // dCurrentPrice<dPreviousPrice // iClose(NULL,PERIOD_CURRENT,i)==iHigh(NULL,PERIOD_CURRENT,i) DeltaOH > DeltaOL ExtOBVBuffer=ExtOBVBuffer[i+1] - DeltaV1; // - //ExtOBVBuffer=dPreviousPrice+DeltaV1; else ExtOBVBuffer=ExtOBVBuffer[i+1] + DeltaV1; //ExtOBVBuffer=dPreviousPrice+DeltaV1; } и т.д. Было бы интересно вернуться к теме. P.S. Рендж бары - равновысокие.

Scriptong: Balbesik пишет: используя периодические и непериодические колебания для расчета и в качестве фильтра взяв ОBV с изменением, удалось уменьшить дивергенцию с порядка 15-18 за период, до 2-3 значений - это здорово для фильтра. О чем здесь идет речь? Что за периодические и непериодические колебания? Каковы изменения в стандартном OBV? Приведенный код неполон, т. к. не отображает сути изменений. Что понимается под периодом: интервал истории или количество баров, используемых для расчета значений индикатора? Что такое порядок дивергенций: количество дивергенции в течение какого-то времени или их величина? Таким образом, в твоих рассуждениях нет конкретики. Мне не за что зацепиться, чтобы поддержать разговор.

Balbesik: Под периодическими я принимаю «идеальную» синусоиду (ЗигЗаг) – одна амплитуда и один период. Под непериодическими я принимаю – пропорционально растет (уменьшается) амплитуда и аналогично пропорционально растет (уменьшается) период. Это все условно (давным-давно тебе я рисунки скидывал). Основная задача при построении ЗигЗага определить, по некоторому алгоритму, будет ли продолжение движения (заданной или расчетной величины) или нет. Сравнил, при прочих равных (по своему алгоритму оценку ЗигЗага), получилось, что при наличии дивергенции по OBV прогноз продолжения движения ЗигЗага хуже. Для качественного сравнения и не более, чуть изменил штатный OBV (выбор связан с отсутствием периода у OBV). Изменение минимально - в зависимости от цены Открытия просто количество тиков (на равновысоком баре) вверх это «+», вниз это «-» и на их разности построение графика OBV. На одном временном интервале, при одной величине равновысокого бара и одного и того же (Н) ЗигЗага количество рассогласований (дивергенция) уменьшилось в единицах количества случаев. Вот в последние дни (вплоть до сегодня) у меня не работает почтовый ящик на Ремблере. Что только не делал, бесполезно, пока не догадался залезть в интернет – «К сожалению, сервис Рамблер-Почта до сих пор остается недоступен из-за DDoS-атаки. Более того, это сильнейшая DDoS-атака в истории Рамблера…» Это я к чему. Я не уверен, что смогу сам сделать равнообъёмный индикатор и буду искать решение проблемы там, где ее нет по аналогии с Рамблер-Почта. Только видимо получается не равнообъёмный, а что-то типа равно кратный по обьему. Т.е. бар привязан (соответствует) к бару по цене, задана величина кол-во тиков , различие будет по цене закрытия бара. Например бар по цене 100 пунктов и в нем 40 или 60 или 120 тиков по «обьему». Задаем 50 тиков по «обьему». Если 40 на баре – цена открытия равна цене закрытия и эти 40 тиков «перенеслись» на следующий бар на котором как только добавится 10 тиков появиться «первая условная цена закрытия». Если 60 на баре – цена закрытия равно цене, когда набралось 50 тиков и 10 тиков переносится на следующий бар Если 120 на баре – цена закрытия равно цене, когда набралось 100 тиков («первая условная цена закрытия» - пропускается) т.е. цена закрытия на 2-х заданных 50 тиков. Задержка на один бар мне не принципиальна, но и не уверен, что это даст некий «плюс». Пока получается, что в частном моем случае, дивергенция это мне плохо. Плохо и что объяснить не умею. P.S. С графикой, как раньше получалось и мучиться не надо.



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