
Liv
Пользователи ST test (off)-
Постов
147 -
Зарегистрирован
-
Посещение
Весь контент Liv
-
Я очень этому рад! Желаю удачи и дальнейших успехов! Буду помогать, как смогу!
-
Такой индикатор уже давно написан (не мной) и он достаточно прикольный. см. приложение.... а что касается "можно ли отобразить вертикальный отрезок в необходимом месте экрана, с координатами в пикселах (а не время/цена)?", то именно такой объект создать нельзя - нет такого в MT4. Это же не графический редактор, а график движения цен и здесь всё на это завязано. поэтому вряд ли стоит что-то ещё придумывать.... ma_color.zip
-
У переменной MA1 всегда будет + (плюс), т.к. это Moving Average, т.е. Средняя Скользящая цены, а цена никогда не будет отрицательной (во был бы прикол - тебе платят за то, что ты покупаешь товар! ) На сколько я понял, имеется желание сделать индикатор направления движения СС (вверх или вниз). Об этом позднее мы будем говорить.... увы, сейчас сильно занят - как раз то время, когда день весь год кормит....
-
Вы не очень внимательно читали мои посты.... Функция start() вызывается при каждом тике. И только для того, что не было лишних пересчётов уже расчитанных баров и используется функция IndicatorCounted() и всё остальное.... Для вашего примера это всё не требуется и всё просто: MQL#property indicator_chart_window extern int Период=14; extern color Цвет=Red; extern int КоордX=50; extern int КоордY=50; int init() { ObjectCreate("MA1" ,OBJ_LABEL,0,0,0); ObjectSet ("MA1" ,OBJPROP_XDISTANCE,КоордX); ObjectSet ("MA1" ,OBJPROP_YDISTANCE,КоордY); ObjectSetText("MA1" ,"0" ,12,"Arial" ,Цвет); return(0); } int deinit() { ObjectDelete ("MA1" ); return(0); } int start() { double MA1 = iMA (NULL,0,Период,0,MODE_SMA,PRICE_CLOSE,0); string MA_1=DoubleToStr(MA1,4); ObjectSetText("MA1" ,MA_1,12,"Arial" ,Цвет); } Данный пример никакой информационной ценности не несёт, но как пример использования объекта очень поучителен и я рад, всё-таки, что нашёлся хотя бы один неравнодушный к моим урокам. Кстати, для того, чтобы ваш код имел расцветку нужно использовать BB-код: [MQL] ...... здесь код программы ...... [/MQL]
-
Ээээ.... мда... Переменной значение присваевается с помощью знака равно (=). Вот так: int МояПеременная=0; Если вы хотели что-то другое узнать, то нужно говрить конкретнее.....
-
Ну, кто из учеников решит это простой пример? :)
-
Привет! Простейший вариант - использование коментария: MQLComment("Текщая цена: " + Bid); Данная инструкция выведет строчку с ценой в левый верхний угол, во вторую строку. Для вывода многострочного коментария нужно разделять строки символом перевода строки "\n". Более сложный вариант - использование объекта OBJ_TEXT: MQLObjectCreate("name1" ,OBJ_TEXT,0,iTime(NULL,0,0),Ask);ObjectSetText("name1" ,"Привет!" ,12,"Arial" ,Red); Данный пример выводит слово "Привет" красным цветом в районе текущей цены. Примерно так же выводится с помощью инструкции OBJ_LABEL, только здесь координаты задаются в виде точек-пикселей, которые отчситываются от верхнего правого угла. И наконец, инструкция OBJ_ARROW позволяет вывести один символ в нужной точке окна. Это может быть один из определённых символов MT4 или один из симоволов набора шрифта Windings.
-
Индикатор Сидуса построен на нескольких скользящих средних (СС). Но СС можно использовать не только на ценах графика, но и на других линиях графика. Вот сегодня мы и займёмся построением СС на другой линии, например RSI. RSI – это индексный индикатор относительной силы рынка. Он построен на отношении положительных ценовых изменений (это когда цена идёт вверх) к отрицательным ценовым изменениям (когда цена идёт вниз). Один из распространенных методов анализа индикатора RSI состоит в поиске расхождений, при которых цена образует новый максимум, а RSI не удается преодолеть уровень своего предыдущего максимума. Подобное расхождение свидетельствует о вероятности разворота цен. Если затем индикатор поворачивает вниз и опускается ниже своей впадины, то он завершает так называемый «неудавшийся размах» (failure swing). Этот неудавшийся размах считается подтверждением скорого разворота цен. Итак, начнём. Отрываем редактор и создаём новый индикатор, который назовём "RSI+MA". В качестве переменных пишем: ПериодRSI = 14; ПериодMA = 6; Добавляем две линии – синюю для RSI и красную для СС. Указываем, что индикатор будет в отдельном окне и желательно указать максимум и минимум окна – для RSI используется 100 и 0. Делаем цикл так же, как мы делали на индикаторе Сидуса и в этом цикле мы делаем расчёт RSI. MQLExtMapBuffer1 = iRSI(NULL,0,ПериодRSI,PRICE_CLOSE,i); Как видите, здесь всё просто и для вывода RSI больше ничего не надо…. Но наша задача "навесить" СС на нашу линию RSI. Для этого мы делаем ещё раз цикл и пользуемся функцией iMAOnArray: MQLfor(i=0; i<limit; i++) { ExtMapBuffer2 = iMAOnArray(ExtMapBuffer1,0,ПериодMA,0,MODE_SMA,i); } Функция iMAOnArray предназначена как раз, для расчёта СС исходя из данных имеющегося массива ExtMapBuffer1. Как видите, он стоит первым в аргументах функции. С остальными аргументами функции вам, я думаю, уже не стоит труда разобраться. В принципе, эту функцию можно было бы использовать и в первом цикле вместе с расчётом RSI, но мои эксперименты показали, что лучше использовать отдельный цикл для расчёта СС. Это всё! Осталось сохранить, скомпилировать, поместить на график и наслаждаться нашим индикатором. Скользящая средняя на RSI будет показывать тенденцию изменения индекса роста/снижения цен, а сама линия RSI покажет момент возможного разворота цен. Домашнее задание: Что нужно сделать, чтобы выводились линии уровней 30 и 70? Они помогают в определении точки разворота. Что нужно сделать для добавления ещё одной СС? Разобраться, для чего нужна вторая СС.
-
После некоторого отсутствия (увы - денюжку я пока не на форексе зарабатываю), я продолжаю наши занятия. Сегодня будет простой урок: Как сделать, чтобы индикатор был в отдельном окне? На самом деле это очень просто! Нужно только вместо: #property indicator_chart_window написать так: #property indicator_separate_window Те, кто немного разбирает аглицкие буковы поймёт, что новая инструкция как раз и устанавливает индикатор в отдельном окне. В принципе, любой индикатор может помещён как в окно графика цены, так и в отдельное окно. Для проверки достаточно в нашем индикаторе Сидуса заменить указаные инструкции. Может получиться так, что некоторым такой вариант этого индикатора будет удобнее, т.к. ничего не мешает определению пересечений линий индикатора. А индикатор MACD, например, может некоторым понравиться в окне графика, ибо там он становиться более наглядным. http://forex.orotukan.ru/images/macd.jpg Как я только что обнаружил, что это работает не на всех терминалах. :ninja: Тут надо быть внимательным, потому, что не все индикаторы будут нормально отображаться в противоположном окне. Индикатор ZigZag, в отрыве от цены, полностью теряет свою информативность и в отдельном окне абсолютно не пригоден. Так же как и некоторые индексные индикаторы (CCI, RVI, RSI & etc.), которые используют текущую шкалу цены и исчезают с графика (или полностью корожатся).
-
Очень интересно... Если вы брали чужие скомпилированые файлы .EX4, то в этом случае я всегда бы советовал не разрешать использование DLL. Таким образом никакой скомпилированый модуль ни как не сможет навредить, ибо в MQL не предусмотрены подобные средства и возможности. А говорить о вирусе в текстовом файле .MQ4 было бы смешно. Извиняюсь, если грубовато.. EUR-Aleks, приглашаю подучиться языку программирования MQL4.
-
Мне пришли в ЛС сообщения о том, что скрипты покупки и продажи неверно ставят TakeProfit и StopLoss. И указали, что в функцию передают величину пунктов (pips). Вот только я же нигде не говорил, о том, что там значения будут в пунктах..... Для того, чтобы можно было передать в функцию величину в пунктах, нужно немного изменить наши скрипты, а именно саму команду покупки/продажи. В начале скрипта мы изменяем тип переменных: int СтопПотери=0; int ВзятьПрофит=0; Для покупки: Ask - СтопПотери*Point, Ask+ ВзятьПрофит*Point, Соответственно для продажи: Bid + СтопПотери*Point, Bid - ВзятьПрофит*Point, Теперь можно передавать в функцию значения в пунктах. Как вы уже догадались, Point - это величина пункта текущего инструмента в валюте котировки.
-
К сожалению, пока не получается - что-то, видимо, ещё не знаю... но ближайшее время сделаю.
-
Да, действительно... Я взял текст открытия ордера с одного из моих советников. Там используется описание ошибок. Ошибки взяты из справочника. Саму функцию вы можете взять в приложенном архиве. Конечно, можно было бы дать вам задание написать её, тем более, что она очень простая, но как-то назойливо получается с моей стороны... Но желающие могут попробовать сами её написать и сравнить с той, что использую я errordiscriptions.zip
-
Внимание. Для того, чтобы ввести код MQL нужно использовать BB-коды: [MQL] здесь вы пишите свой код MQL [/MQL]
-
Ага, понял.... речь идёт о сдвиге.. то, что в хелпе проименовано как ma_shift. Конечно, значения функций на одном и том же баре никак отличаться не будут, за тем исключением, что одна линия будет сдвинута по отношению к другой на некоторое значение. Вот я сделал два индикатора с одинаковыми скольжениями, но со сдвигом 1. http://forex.orotukan.ru/images/vid01.jpg Тут совершенно не важно сама величина сдвига. Это применяется в основном для более ясного отображения линии.... Я не совсем хорошо знаю индикатор Ишимоку (надо будет его освоить - сам себе ), но очень похоже, что линия Chinkou - это средняя c нулевым скольжением по средней цене, но со сдвигом от 20 до 30 (26 - по-умолчанию). Поправьте меня, если не так....
-
Мне приятно видеть правильные ответы! Ответ на второй вопрос будет такой: сделать для каждой позиции отдельный скрипт И так, наш скрипт будет выглядеть так: MQLint start() { double ЧислоЛотов=1; int Проскальзывание=3; double СтопПотери=0; double ВзятьПрофит=0; int МагическоеЧисло=2222; datetime СрокИстечения=0; string Коментарий = "Как мне это нравится!" ; color ЦветСимвола = GREEN; int Ордер=OrderSend( Symbol(), OP_BUY, ЧислоЛотов, Ask, Проскальзывание, СтопПотери, ВзятьПрофит, Коментарий, МагическоеЧисло, СрокИстечения, ЦветСимвола ); if(Ордер<1) { int error=GetLastError(); Print("Error = " ,error,ErrorDescription(error)); } return(0); } Я выделил назначение переменных впереди для того, чтобы проще было бы разобраться с присвоением значений. Как видете, мы сначала назначили переменным значения, затем открыли ордер и после проверили его открытие. Если же ордер не был открыт (переменной Ордер не было назначено значение ордера - обычно целое число больше нуля), то в журнал записывается причина. Данный файл я назвал "купить1" и назначил ему сочетание CTRL+1. Соответственно для открытия ордера в 0,1 лота я сделал файл "купить01" (клавиши CTRL+0), для ордера в 0,5 лота - "купить05" (клавиши CTRL+5). Точно так же были сделаны скрипты открытия ордеров на продажу. Они отличаются тем, что в качестве команды используется не константа OP_BUY, а константа OP_SELL и вместо цены Ask - цена Bid. Назвал я их соответственно: "продать1" (назначена клавиша ALT+1), "продать01" (клавиша ALT+0), "продать05" (клавиша ALT+5). Вот собственно и всё... Эти скрипты достаточно хорошо помогают при пипсовке - ордера создаются быстро и меньше теряется профита! Ну, а теперь вопрос-задание. А как быть с закрытием ордеров? Предложите оптимальное решение...
-
Разумеется, MQL4 Просто MQL я не знаю, а он достаточно сильно отличается! И это видно в самом коде...
-
Не всегда одинаковый! Здесь указаны запросы средней по текущему бару и по предыдущему бару. Разумеется, не всегда эти бары одинаковые и чем больше таймфрэйм, тем больше, обычно, они отличаются. Да, с отладкой здесь очень туго... ближайшее время я выделю специальную библиотеку для отладки из своего отладочного комплекса, которым я пользуюсь...
-
Никто и не попытался.... или лень, или не знают... И так, вызов функции из библиотеки делается так: MQL#import "моя_библиотека.ex4" int ПроверкаПерекрещивания(double Массив1[],double Массив2[],int Сдвиг,int Расхождение,int Глубина); #import Вызывается функция в модуле так: MQLint Крест = ПроверкаПерекрещивания(Массив1[],Массив2[],Сдвиг,Расхождение,Глубина); А теперь, для собственного контроля - ответьте, где я ошибся? Ошибка не была запланирована, сделал я её не нарочно, но она есть и пока я её исправлять не буду.... :ninja:
-
Меня удивляет! Неужели никто не удосужился хелп терминала (МТ4) посмотреть - все стандартные индикаторы там описаны в исчерпывающем виде.
-
С трудом, НО ПОЛУЧИЛОСЬ... этот труд воздастся сторицей... и я очень рад А что именно не получается с библиотекой? Там же не надо ничего придумывать, только я начале модуля сделать одну строку: MQL#property library Но, всё-таки лучше эту тему будем обсуждать в топике, посвященном именно библиотекам: "Создание библиотек".
-
Нда... учиться лучше на собственной работе - быстрее запоминается, легче осваивается... Ну, да ладно! Если есть те, кто сделал себе этот индикатор (поверьте - он пригодится, я им часто пользуюсь), то могли заметить одну неприятную особенность: при запуске, индикатор не сразу появляется на графике, а только после прихода тика или после принудительного обновление графика через контекстное меню. Это связано с тем, что при запуске модуля значение функции IndicatorCounted() ещё не определено и появится только после тика или обновления. А для того, чтобы наш индикатор (да и все остальные, какие мы будем ваять ) сразу появлялся на графике, мы будем сравнивать значение функции IndicatorCounted() с переменной Bars. Таким самым образом, даже при начальной загрузке, у нас будут определённые значения и индикатор появится на графике. MQLint limit;int counted_bars=IndicatorCounted(); // проверим возможные ошибки - зачем время терять, если нет ничего if(counted_bars<0) return(-1); // пересчитаем последний if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for(int i=0; i<limit; i++) { /// --- здесь идут вычисления } Вот теперь наш индикатор будет появляться сразу же при загрузке. Жду ваши вопросы....
-
Следующая функция в нашу библиотеку: MQL/*Автор: MAMOHT направил эту функцию в "Хитрости и трюки MQL" но я думаю, что её место в нашей библиотеке */ int ПроверкаПерекрещивания( double Массив1[], // два массива, которые проверяются double Массив2[], int Сдвиг=0, // сдвиг в историю, если надо int Расхождение=0, // минимальное расхождение в пунктах, которое не считается переплетением int Глубина=0 // как глубоко в историю искать факт пересечения ) { /* Возвращает: 0 - не пересекается 1 - Массив1 пересекает Массив2 снизу вверх -1 - Массив1 пересекает Массив2 сверху вниз */ int i; if (Массив1[Сдвиг] > Массив2[Сдвиг]) { // Массив1 больше, ищем пересечение снизу вверх for( i=0; i<Глубина; i++) { if( Массив2[i + Сдвиг] - Массив1[i + Сдвиг] >= Расхождение*Point ) //превысили минимальное расхождение return (1); } } if (Массив1[Сдвиг] < Массив2[Сдвиг]) { // Массив1 меньше, ищем пересечение сверху вниз for( i=0; i<Глубина; i++) { if( Массив1[i + Сдвиг] - Массив2[i + Сдвиг] >= Расхождение*Point ) //превысили минимальное расхождение return (-1); } } //если мы здесь, значит кривые совпадают //Массив1 == Массив2 return (0); } Задание: написать импорт - объявление этой функции из библитеки и пример использования.
-
Сегодня мы напишем два скрипта, с помощью которых можно быстро открывать ордера на покупку или продажу. Как создать новый скрипт вы уже знаете, повторять не буду. Нам нужно только в начале опеределить следующее: число лотов double ЧислоЛотов=1; Проскальзывание int Проскальзывание=3; Магическое число - любое, приглянувшееся целое число int МагическоеЧисло=2222; Коментарий - всё, что угодно... string Коментарий = "Как мне это нравится!"; и наконец, цвет символа для продажи color ЦветСимвола = RED для покупки color ЦветСимвола = GREEN Ну а теперь собственно открытие ордера в функции start() продажа: OrderSend(Symbol(),OP_SELL,ЧислоЛотов,Bid,Проскальзываение,0,0,Коментарий,МагическоеЧисло,0,ЦветСимвола); или покупка: OrderSend(Symbol(),OP_BUY,ЧислоЛотов,Ask,Проскальзываение,0,0,Коментарий,МагическоеЧисло,0,ЦветСимвола); Вот собственно и всё... Ну, а теперь вопросы ученикам: чего тут не хватает? как лучше всего оформить? как лучше всего запускать?
-
Я удивлён, что никто не задал вопроса! Никто не учится здесь и сейчас? Если есть те, кто хочет научиться, то пусть скажут мне одну не очень приятную особенность написанного нами индикатора.... Жду ещё 1 день.