Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Liv

Пользователи ST test (off)
  • Постов

    147
  • Зарегистрирован

  • Посещение

Весь контент Liv

  1. Я очень этому рад! Желаю удачи и дальнейших успехов! Буду помогать, как смогу!
  2. Такой индикатор уже давно написан (не мной) и он достаточно прикольный. см. приложение.... а что касается "можно ли отобразить вертикальный отрезок в необходимом месте экрана, с координатами в пикселах (а не время/цена)?", то именно такой объект создать нельзя - нет такого в MT4. Это же не графический редактор, а график движения цен и здесь всё на это завязано. поэтому вряд ли стоит что-то ещё придумывать.... ma_color.zip
  3. У переменной MA1 всегда будет + (плюс), т.к. это Moving Average, т.е. Средняя Скользящая цены, а цена никогда не будет отрицательной (во был бы прикол - тебе платят за то, что ты покупаешь товар! ) На сколько я понял, имеется желание сделать индикатор направления движения СС (вверх или вниз). Об этом позднее мы будем говорить.... увы, сейчас сильно занят - как раз то время, когда день весь год кормит....
  4. Вы не очень внимательно читали мои посты.... Функция 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]
  5. Ээээ.... мда... Переменной значение присваевается с помощью знака равно (=). Вот так: int МояПеременная=0; Если вы хотели что-то другое узнать, то нужно говрить конкретнее.....
  6. Ну, кто из учеников решит это простой пример? :)
  7. Привет! Простейший вариант - использование коментария: 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.
  8. Индикатор Сидуса построен на нескольких скользящих средних (СС). Но СС можно использовать не только на ценах графика, но и на других линиях графика. Вот сегодня мы и займёмся построением СС на другой линии, например 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? Они помогают в определении точки разворота. Что нужно сделать для добавления ещё одной СС? Разобраться, для чего нужна вторая СС.
  9. После некоторого отсутствия (увы - денюжку я пока не на форексе зарабатываю), я продолжаю наши занятия. Сегодня будет простой урок: Как сделать, чтобы индикатор был в отдельном окне? На самом деле это очень просто! Нужно только вместо: #property indicator_chart_window написать так: #property indicator_separate_window Те, кто немного разбирает аглицкие буковы поймёт, что новая инструкция как раз и устанавливает индикатор в отдельном окне. В принципе, любой индикатор может помещён как в окно графика цены, так и в отдельное окно. Для проверки достаточно в нашем индикаторе Сидуса заменить указаные инструкции. Может получиться так, что некоторым такой вариант этого индикатора будет удобнее, т.к. ничего не мешает определению пересечений линий индикатора. А индикатор MACD, например, может некоторым понравиться в окне графика, ибо там он становиться более наглядным. http://forex.orotukan.ru/images/macd.jpg Как я только что обнаружил, что это работает не на всех терминалах. :ninja: Тут надо быть внимательным, потому, что не все индикаторы будут нормально отображаться в противоположном окне. Индикатор ZigZag, в отрыве от цены, полностью теряет свою информативность и в отдельном окне абсолютно не пригоден. Так же как и некоторые индексные индикаторы (CCI, RVI, RSI & etc.), которые используют текущую шкалу цены и исчезают с графика (или полностью корожатся).
  10. Очень интересно... Если вы брали чужие скомпилированые файлы .EX4, то в этом случае я всегда бы советовал не разрешать использование DLL. Таким образом никакой скомпилированый модуль ни как не сможет навредить, ибо в MQL не предусмотрены подобные средства и возможности. А говорить о вирусе в текстовом файле .MQ4 было бы смешно. Извиняюсь, если грубовато.. EUR-Aleks, приглашаю подучиться языку программирования MQL4.
  11. Мне пришли в ЛС сообщения о том, что скрипты покупки и продажи неверно ставят TakeProfit и StopLoss. И указали, что в функцию передают величину пунктов (pips). Вот только я же нигде не говорил, о том, что там значения будут в пунктах..... Для того, чтобы можно было передать в функцию величину в пунктах, нужно немного изменить наши скрипты, а именно саму команду покупки/продажи. В начале скрипта мы изменяем тип переменных: int СтопПотери=0; int ВзятьПрофит=0; Для покупки: Ask - СтопПотери*Point, Ask+ ВзятьПрофит*Point, Соответственно для продажи: Bid + СтопПотери*Point, Bid - ВзятьПрофит*Point, Теперь можно передавать в функцию значения в пунктах. Как вы уже догадались, Point - это величина пункта текущего инструмента в валюте котировки.
  12. К сожалению, пока не получается - что-то, видимо, ещё не знаю... но ближайшее время сделаю.
  13. Да, действительно... Я взял текст открытия ордера с одного из моих советников. Там используется описание ошибок. Ошибки взяты из справочника. Саму функцию вы можете взять в приложенном архиве. Конечно, можно было бы дать вам задание написать её, тем более, что она очень простая, но как-то назойливо получается с моей стороны... Но желающие могут попробовать сами её написать и сравнить с той, что использую я errordiscriptions.zip
  14. Внимание. Для того, чтобы ввести код MQL нужно использовать BB-коды: [MQL] здесь вы пишите свой код MQL [/MQL]
  15. Ага, понял.... речь идёт о сдвиге.. то, что в хелпе проименовано как ma_shift. Конечно, значения функций на одном и том же баре никак отличаться не будут, за тем исключением, что одна линия будет сдвинута по отношению к другой на некоторое значение. Вот я сделал два индикатора с одинаковыми скольжениями, но со сдвигом 1. http://forex.orotukan.ru/images/vid01.jpg Тут совершенно не важно сама величина сдвига. Это применяется в основном для более ясного отображения линии.... Я не совсем хорошо знаю индикатор Ишимоку (надо будет его освоить - сам себе ), но очень похоже, что линия Chinkou - это средняя c нулевым скольжением по средней цене, но со сдвигом от 20 до 30 (26 - по-умолчанию). Поправьте меня, если не так....
  16. Мне приятно видеть правильные ответы! Ответ на второй вопрос будет такой: сделать для каждой позиции отдельный скрипт И так, наш скрипт будет выглядеть так: 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). Вот собственно и всё... Эти скрипты достаточно хорошо помогают при пипсовке - ордера создаются быстро и меньше теряется профита! Ну, а теперь вопрос-задание. А как быть с закрытием ордеров? Предложите оптимальное решение...
  17. Разумеется, MQL4 Просто MQL я не знаю, а он достаточно сильно отличается! И это видно в самом коде...
  18. Не всегда одинаковый! Здесь указаны запросы средней по текущему бару и по предыдущему бару. Разумеется, не всегда эти бары одинаковые и чем больше таймфрэйм, тем больше, обычно, они отличаются. Да, с отладкой здесь очень туго... ближайшее время я выделю специальную библиотеку для отладки из своего отладочного комплекса, которым я пользуюсь...
  19. Никто и не попытался.... или лень, или не знают... И так, вызов функции из библиотеки делается так: MQL#import "моя_библиотека.ex4" int ПроверкаПерекрещивания(double Массив1[],double Массив2[],int Сдвиг,int Расхождение,int Глубина); #import Вызывается функция в модуле так: MQLint Крест = ПроверкаПерекрещивания(Массив1[],Массив2[],Сдвиг,Расхождение,Глубина); А теперь, для собственного контроля - ответьте, где я ошибся? Ошибка не была запланирована, сделал я её не нарочно, но она есть и пока я её исправлять не буду.... :ninja:
  20. Меня удивляет! Неужели никто не удосужился хелп терминала (МТ4) посмотреть - все стандартные индикаторы там описаны в исчерпывающем виде.
  21. С трудом, НО ПОЛУЧИЛОСЬ... этот труд воздастся сторицей... и я очень рад А что именно не получается с библиотекой? Там же не надо ничего придумывать, только я начале модуля сделать одну строку: MQL#property library Но, всё-таки лучше эту тему будем обсуждать в топике, посвященном именно библиотекам: "Создание библиотек".
  22. Нда... учиться лучше на собственной работе - быстрее запоминается, легче осваивается... Ну, да ладно! Если есть те, кто сделал себе этот индикатор (поверьте - он пригодится, я им часто пользуюсь), то могли заметить одну неприятную особенность: при запуске, индикатор не сразу появляется на графике, а только после прихода тика или после принудительного обновление графика через контекстное меню. Это связано с тем, что при запуске модуля значение функции 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++) { /// --- здесь идут вычисления } Вот теперь наш индикатор будет появляться сразу же при загрузке. Жду ваши вопросы....
  23. Следующая функция в нашу библиотеку: 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); } Задание: написать импорт - объявление этой функции из библитеки и пример использования.
  24. Сегодня мы напишем два скрипта, с помощью которых можно быстро открывать ордера на покупку или продажу. Как создать новый скрипт вы уже знаете, повторять не буду. Нам нужно только в начале опеределить следующее: число лотов 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,ЦветСимвола); Вот собственно и всё... Ну, а теперь вопросы ученикам: чего тут не хватает? как лучше всего оформить? как лучше всего запускать?
  25. Я удивлён, что никто не задал вопроса! Никто не учится здесь и сейчас? Если есть те, кто хочет научиться, то пусть скажут мне одну не очень приятную особенность написанного нами индикатора.... Жду ещё 1 день.
×
×
  • Создать...