
Liv
Пользователи ST test (off)-
Постов
147 -
Зарегистрирован
-
Посещение
Весь контент Liv
-
Привет! Ещё раз и по-подробнее: что должен показывать индикатор, как считать, какие ТФ.... "Провёл по паре...." - как-то непонятно!
-
Привет! У меня советников нет, я торгую только на демо, а в этом случае советник бессмылен! Но немного позднее мы займёмся созданием советников... Просто сейчас у меня катастрофически не хватает времени!
-
Не понял, зачем это? Если один раз настроить Фибо при наложении на график, то эта настройка запоминается и не имеет смысла делать какие-то скрипты.... а тем более скомпиленные и непонятно что делающие!
-
Странно, но вроде такая весчь называется конвергенцией... :)
-
Ну, это просто... Зная, что первый индикатор - зелёный, а второй красный можно делать проверку на ненулевое значение. Следовательно, если CurValue1 = iCustom(NULL,0,"Heiken AshiR",0,bar); больше нуля, значит линия зелёная и, соответственно, только BUY и наоборот, если CurValue2 = iCustom(NULL,0,"Heiken AshiR",1,bar); больше нуля, значит линия красная и только SELL
-
В принципе, из всего исходного текста этого индикатора достаточно ввести в советник только несколько строк: 1. в самом начале обявить массивы: double HighBuffer[]; double LowBuffer[]; 2. а затем в функции start() сделать расчёт: int MaxBar,limit,counted_bars=IndicatorCounted(); //---- проверка на возможные ошибки if (counted_bars<0)return(-1); //---- последний подсчитанный бар должен быть пересчитан if (counted_bars>0) counted_bars--; //---- определение номера самого старого бара, начиная с которого будет произедён пересчёт новых баров MaxBar=Bars-2; limit=(Bars-1-counted_bars); //---- инициализация нуля if (limit>MaxBar) { limit=MaxBar; HighBuffer[bars-1]=0; LowBuffer [bars-1]=0; } //---- for (int bar=limit; bar>=0;bar--) { Trend = iCustom(NULL,0,"Heiken Ashi#",1,bar)-iCustom(NULL,0,"Heiken Ashi#",0,bar); if (Trend>0){HighBuffer[bar]=1; LowBuffer [bar]=0;} if (Trend<0){LowBuffer [bar]=1; HighBuffer[bar]=0;} } После этого можно использовать массивы HighBuffer и LowBuffer для своих расчётов в советнике. Второй способ заключается в том, чтобы сам этот индикатор скомпиллировать - получить файл "Heiken AshiR.ex4" и уже его использовать: CurValue1 = iCustom(NULL,0,"Heiken AshiR",0,bar); CurValue2 = iCustom(NULL,0,"Heiken AshiR",1,bar); Как, вероятно, уже понятно, эти переменные будут содержать значения соответствующих массивов индикатора на определённом баре.
-
Привет! Какой именно индикатор? Как его использовать - визуально или не визуально? Нужно же сразу говорить, что интересует!
-
Это не очень сложно. Воспользуемся скриптом, который уже выставлялся на нашем форуме - закрытие всех ордеров. Сначала нужно указать некоторые параметры: // это время закрытия всех ордеров extern string CloseTime="22:00"; // этот параметр отсутствовал в советнике, хотя и должен был быть extern int MAGIC=77777; Теперь функция закрытия всех ордеров, которые открыл этот советник: [MQL] ////////////////////////////////////////////////////////////////////// void CloseAll() { int total = OrdersTotal(); for(int i=total-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); if(OrderMagicNumber() == MAGIC) { int type = OrderType(); bool result = false; switch(type) { case OP_BUY: result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; case OP_SELL: result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); } } } } [/MQL] Как вы заметили, здесь будут закрываться только те ордера, которые открылись именно этим советником. Для этого стоит проверка так называемого Магического числа (MAGIC). В этот параметр записывается любое целое число. Например, номер вашего торгового счёта.... или дата вашего рождения! Это позволяет торговать параллельно советнику не мешая друг другу. Ну и осталось только вставить в функцию start() следующий код (где-нибудь в самое начало): [MQL] datetime TimeClose = StrToTime(CloseTime); if(TimeCurrent() > TimeClose) { CloseAll(); return(0); } [/MQL] Ну, а весь полностью файл представлен здесь: new_expert.zip
-
Ну, это просто решается! :) 4109 Торговля не разрешена. Необходимо включить опцию "Разрешить советнику торговать" в свойствах эксперта.
-
Приветствую! У меня это скрипт вполне нормально работает!... А что пишется в логах? (закладка "Журнал" в окне "Терминал")
-
У меня: лень, алчность и похоть... :) хотя с предоставленными "грехами" я бы завязал более близкие отношения! :)
-
Советник создаётся так же, как и индикатор или скрипт, только и всего, что нужно указать что вы создаёте советник и ввести нужные аргументы. Начнём мы эту тему с очень простой вещи. Это будет даже не советник, а иммитация советника. Он нам очень пригодится для отладки индикаторов. Там всего несколько строчек: [MQL] int start() { string mm, dd, hh, mi; if(Month()<10) mm = "0"+Month(); else mm = Month(); if(Day()<10) dd = "0"+Day(); else dd = Day(); if(Hour()<10) hh = "0"+Hour(); else hh = Hour(); if(Minute()<10) mi = "0"+Minute(); else mi = Minute(); Comment("Дата: "+Year()+"-"+mm+"-"+dd+" "+hh+":"+mi+" Цена: ",NormalizeDouble(Bid,2)); return(0); } [/MQL] Всё, что он делает, так это выводит вычисленную дату и текущую цену. Можно было бы и этого не делать, но всё-таки надо было его (наш первый советник) чем-то занять! Работает он просто: кидаете его на график и запускаете тестер с визуализацией. Всё, теперь можно в окно визуализации тестера кинуть свой индикатор и проследить на истории как он работает...
-
Нажать клавиши 'Ctrl+T' - появится (или исчезнет, если он был - тогда нажать ещё раз) окошко с надписью "Терминал". Там внизу есть несколько закладок: "Торговля", "История счёта", "Новости", "Сигналы" и т.д.... Нас интересует закладка "Сигналы" - кликаем на ней левой кнопкой мышки. Открывается список сигналов. Конечно, если им ещё не пользовался, то там ничего нет. Создадим сигнал: кликаем правой кнопкой мышки в любом месте этого окошка из появившегося меню выбираем "Создать" - открывается окошко создания сигналов кликаем левой кнопкой мышки на галочке "Разрешить" - галочка должна стоять из списка "Действие" выбираем "Sound" (по-аглицки - "Звук") из списка "Сисмвол" выбираем инструмент, на котором работаем, напр. "EURUSD" из списка "Условие" выбираем, например, "Bid>" в поле "Значение" вводим значение инструмента, при превышении цены предложения которого прозвучит сигнал из списка "Источник" вибираем вид звука, который будет звучать можно установить свой звук, для чего нажать левой кнопкой мышки кнопку с тремя точками справа от списка сигналов можно нажать кнопку "Тест" чтобы послушать как звучит этот сигнал для твоего уха нажать кнопку "Ок" для записи и установки сигнала или нажать кнопку "Отмена" для того, чтобы не создавать сигнал ждём достижение установленного события и балдеем...... Достаточно просто.... и если уж сейчас не получится, то стоит задуматься, а тем ли занимаешься... :ninja: Тут я хотел написать "немножко не понял".... но решил написать "совсем не понял"...
-
Привет! Скачай терминал на сайте производителя http://metaquotes.ru/
-
Приветствую! Пока есть немного времени я хочу поговорить о ещё одной возможности индикации флэта. У RSI есть одна интересная особенность: чем больше волатильность, тем меньше мгновенное значение движения RSI. И, соответственно, наоборот.... что даёт нам возможность получить индикатор мгновенного флэта. Итак, начнём... Это будет просто вывод сообщения о том, что "Индикатор мгновенного флэта" показывет вероятность флэта. Будут пять внешних параметров: [MQL] extern double РазмерФлэта=3.0; // проверочная значение шага RSI extern int ПериодФлэта=10; // период для расчёта RSI extern color ЦветФлэта=Yellow; // цвет вывода надписи extern int КоординатаX=400; // координаты вывода надписи extern int КоординатаY=0; // нам нужна одна переменная, которая бы хранила прошлое значение static double OldValue; [/MQL] Собственно никаких идикаторов нет... просто будет выводиться надпись о том, что RSI сигналит о возможном флэте. Создаём эту надпись и временно убираем с экрана: [MQL] int init() { ObjectCreate("FlatSig",OBJ_LABEL,0,0,0); ObjectSet("FlatSig",OBJPROP_XDISTANCE,1000); ObjectSet("FlatSig",OBJPROP_YDISTANCE,1000); ObjectSetText("FlatSig","ФЛЭТ!",14,"Arial Cyr",ЦветФлэта); return(0); } int deinit() { ObjectDelete("FlatSig"); ObjectDelete("HalfLine"); Comment(" "); return(0); } // эта функция показывает надпись void Make() { ObjectSet("FlatSig",OBJPROP_XDISTANCE,КоординатаX); ObjectSet("FlatSig",OBJPROP_YDISTANCE,КоординатаY); } // эта функция прячет надпись void Del() { ObjectSet("FlatSig",OBJPROP_XDISTANCE,1000); ObjectSet("FlatSig",OBJPROP_YDISTANCE,1000); } int start() { double NewValue = iRSI(NULL,0,ПериодФлэта,PRICE_CLOSE,0); double CurFlat = MathAbs(NewValue - OldValue); Comment("Флэт="+ CurFlat); if (CurFlat > РазмерФлэта || CurFlat == 0) { Make(); } else { Del(); } OldValue = NewValue; } [/MQL] Вот, собственно, и всё... При подозрении на флэт будет выводиться надпись "ФЛЭТ!", а в месте коментария будет выведено расчётное значение. Для каждого инструмента, таймфрэйма и ДЦ значения мгновенного флэта будут разные и тут нужно поработать с индикатором, чтобы найти нужные значения. Но, как я думаю, это стоит того.... Я широко пользуюсь этим индикатором. Как только начинает мигать (или горит постоянно) надпись "ФЛЭТ!", значит будет флэт. Если сначала уровень был высок, затем снизился (надпись исчезла), а потом опять появилась - сужающийся флэт,.... если сначала высокий, затем низкий, затем опять высокий, то тут можно ждать расширяющегося флэта... Вариантов очень много, но, к сожалению, на каждом инструменте, таймфрэйме и ДЦ они разные.
-
Для этого скрипт не нужен - в MT4 имеется встроенные функции для этого: закладка "Сигналы" -> правой кнопкой кликнуть на пустом месте (или нажать кнопку Insert), появится окошко.... и там легко разобраться.
-
А что, оччччень интересная стратегия! Я, со своей - программисткой точки зрения, рассмотрел данную стратегию и сделал советник! Слив - 100% (причём - очень быстро!)
-
После некоторого отступления, вернёмся опять к нашим скользящим средним. Сейчас мы создадим простой индикатор флэта. Когда четыре СС разных периодов сближаются, то это говорит о возможном повороте тренда, но это может быть и флэт, особенно, когда эти четыре СС доржатся друг возле друга продолжительное время. Вот на этом и будет базироваться наш индикатор. Он будет иметь одну линию типа гистограммы: MQL#property indicator_separate_window#property indicator_buffers 1 #property indicator_color1 White #property indicator_width1 2 #property indicator_minimum 0 #property indicator_maximum 10 Как видите, я прописал размер отдельного окна с тем, чтобы величина нашего индикатора всегда была не более 1/10 совместного окна. Если индикатор не будет использоваться с другими индикаторами вместе, то можно выключить установки максимума и минимума окна и сделать окно индикатора узеньким. Для нашего индикатора мы будем использовать пять параметров - уровень флэта и четыре периода СС: MQLextern double УровеньФлэта=0.0003;extern int MA1=5; extern int MA2=12; extern int MA3=18; extern int MA4=21; //---- buffers double ExtMapBuffer1[]; Уровень флэта подбирается на каждый таймфрейм самостоятельно. Он будет везде разным. И, возможно придётся и периоды подбирать.... Наш индикатор будет гистограммой: MQLint init() { SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexBuffer(0,ExtMapBuffer1); return(0); } И теперь расчётная часть: MQLint start() { int limit; int save_val=0; double valMA1, valMA2, valMA3, valMA4; 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++) { valMA1 = iMA(NULL,0,MA1,0,MODE_SMA,PRICE_CLOSE,i); valMA2 = iMA(NULL,0,MA2,0,MODE_SMA,PRICE_CLOSE,i); valMA3 = iMA(NULL,0,MA3,0,MODE_SMA,PRICE_CLOSE,i); valMA4 = iMA(NULL,0,MA4,0,MODE_SMA,PRICE_CLOSE,i); if ( MathAbs(valMA1-valMA2)<=УровеньФлэта && MathAbs(valMA1-valMA3)<=УровеньФлэта && MathAbs(valMA1-valMA4)<=УровеньФлэта ) save_val = 1; else save_val=0; ExtMapBuffer1 = save_val; } return(0); } Как видите - тут всё просто: на текущем баре расчитываются СС разных периодов и разности этих значений сравниваются со значением переменной УровеньФлэта. Если значение не правышает уровень, то индикатору назначается 1, иначе - 0. Всё просто!
-
Я бы посоветовал поступить обратно: открыть терминал в терминале нажать кнопку открытия MetaEditor в MetaEditor в меню Файл открыть тот индикатор наконец, скомпиллировать его, нажав кнопку компилляции
-
По просьбам, я забегу несколько вперёд и расскажу сегодня о том, как использовать виндоузовские DLL. Если у вас есть DLL, о которой вы всё знаете (какие функции экспортирует, какие параметры имеют эти функции), то её использование в вашем скрипте/индикаторе/советнике - очень простое дело! И как всегда, я буду показывать на примере. Здесь кусочек кода скрипта, с помощью которого я читал данные на своём сервере для использования. MQL#import "wininet.dll" int InternetAttemptConnect (int x); int InternetCloseHandle(int hInet); int InternetOpenA( string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0); int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0, int lFlags = 0, int lContext = 0); int InternetReadFile( int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]); #import int start() { if(!IsDllsAllowed()) { Alert("У вас выключено разрешение использовать DLL" ); return(0); } int rv = InternetAttemptConnect(0); if(rv != 0) { Alert("Нет соединения!" ); return(0); } int hInternetSession = InternetOpenA("Microsoft Internet Explorer" , 0, "", " ", 0); if(hInternetSession <= 0) { Alert("Не удаётся соединиться с Internet'ом" ); return(0); } int hURL = InternetOpenUrlA(hInternetSession, "http://forex.orotukan.ru/cgi-bin/connect.cgi" , "", 0, 0, 0); if(hURL <= 0) { Alert("Не удалось соединиться с адресом!" ); InternetCloseHandle(hInternetSession); return(0); } int cBuffer[256]; int dwBytesRead[1]; bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead); /* здесь я обрабатываю полученные данные в массиве cBuffer */ InternetCloseHandle(hInternetSession); return(0); } Как вы можете заметить, сначала идет описание импорта из DLL нужных мне функций, с обязательным указанием всех параметров и их типов. Обратите внимание, что в используемых функциях имеются параметры, передаваемые по ссылке: MQL...int& sBuffer[], ... Знак амперсанда (&) как раз и указывает то, что этот параметр передаётся по ссылке, а не по значению. После полного описания импортируемых функций, их можно использовать в вашем модуле точно так же, как и обычные функции.
-
Я бы назвал этот вопрос провокационным, т.к. ответ ты уже знаешь!... Но раз вопрос прозвучал, то нужно ответить... В основном это делается с помощью функции iCustom. Например: получение значения индикатора JMA: MQLdouble dlCurrentValue = iCustom(NULL,0,"JMA" ,0,0); Значения параметров этой функции простые: NULL - пишется, если не конкретизируется инструмент, иначе пишется символьное имя инструмента, например "GBPUSD". 0 - если не конкретизируется таймфрейм, иначе пишется нужный таймфрейм, например 15 - 15-минутный таймфрейм. "JMA" - имя используемого индикатора. Индикатор должен быть скомпиллирован, т.е. должен присутствовать файл "jma.ex4" (в Windows регистр букв не имеет значение). После этого параметра могут быть один или несколько параметров, кот. передаются в вызываемый индикатор. Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных индикатора. ВНИМАНИЕ! Не все индикаторы принимают параметры из этой функции. Например, я очень много промучался передавая параметры индикатору ZigZag, но выяснилось, что эти парметры не принимаются. В этом случае следует скомпиллировать индикатор с нужными вам параметрами. 0 - линия индикатора. У используемого индикатора может быть несколько линий и здесь указывается номер линии по порядку начиная с 0 (всего у индикатора может быть 9 линий - от 0 до 8) 0 - текущий бар (свеча). Номера баров (свечей) начинаются от нуля и увеличиваются с права на лево. Для себя я чаще делаю так (при наличии исходных кодов): выделяю индикатор в отдельную функцию и затем использую полчившийся массив в своих целях.
-
Советую скачать МетаТрейдер с сайта производителя. Заметил следующую вещь: скаченные у ДЦ терминалы по разному отображают индикаторы... иногда совсем в обратную сторону... Очень подозреваю, что некоторые ДЦ специально изменяют терминал (он поставляется в исходных кодах и легко поддаётся модификации) для успешного "заваливания" трейдера.
-
Вообще-то, язык MQL был разработан для платформы MT4 и, разумеется, может быть использован только там. И если какой-то ДЦ имеет терминал, отличный от MetaTrader, то там, вполне возможно, советники/индикаторы/скрипты, написанные в MQL работать не будут.