0ll Опубликовано 22 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 января, 2018 А вы можете пожалуйста написать этот цикл кодом для Однобуферного ЗигЗага чтоб на выходе я мог получить отдельно все High экстремумы и Low экстремумы за последние 500 баров?Вам экстремумы в массив записывать? время экстремума Вам нужно? Сколько экстремумов минимально необходимо? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Evendx Опубликовано 22 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 января, 2018 Минимум 2 экстремума. А вот писать ли масив и нужно ли время экстремума я точно не знаю. Но конечная задача такова: 1) эксперт должен простраивать уровни (обычные горизнотальные линии или горизонтальные трендовые) по экстремумам ЗигЗага за последние 500 баров.2) и убирать пробитые уровни (пробитыми считаются если цена пересекла уровень и закрыла за ним подряд 15 свечей)Это все что мне не хватает для советника и я хотел бы чтоб вы это прописали. И спасибо вам что мне помогаете я чесно не ожидал :) уровни1.PNGуров2.PNG Изменено 22 января, 2018 пользователем Evendx Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 22 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 января, 2018 Уровни надо писать в массив, а потом в цикле по массиву рисовать уровни если прошли проверку на 15 свечей.Если нужны лучи, то и время экстремума нужно - от него луч рисовать.Наметим план:1. нужна структура хранения уровня - цена + время2. массивы hi & low уровней3. счётчики найденных уровнейДалееОбъявляем цикл на 500 барищем уровень > 0определяем hi или lowпишем в нужный массивувеличиваем соответствующий счётчикконец циклаобрезаем по размеру массивы уровней... завтра будем наполнять... кстати правило 15 свечей можно проверять на этапе формирования массива уровней Ссылка на сообщение Поделиться на другие сайты More sharing options...
d1w4m3 Опубликовано 26 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 января, 2018 Доброго времени суток.Разбил в кровь все кулаки своих извилин)Есть такой не мало известный индикатор "$hah+"!Написал функцию для него, но хоть убейте не вьеду, почему не работает?Огромная просьбы подсказать или дать почитать инфу? //возвращает данные зеленого буфера double Greens(int shift){ double buf = iCustom(NULL, 0, "$hah+", 0, 0, shift); return(buf);} //возвращает данные красного буфера double Reds(int shift){ double buf = iCustom(NULL, 0, "$hah+", 0, 1, shift); return(buf);} //возвращает данные черного буфера double Blacks(int shift){ double buf = iCustom(NULL, 0, "$hah+", 0, 2, shift); return(buf);}bool SellSignal(){ //если последний столбик красный, а предпоследний зеленый if(Reds(1)!=0&&Blacks(2)!=0) return(true); else return (false);}bool BuySignal(){ //если последний столбик зеленый, а предпоследний красный if(Greens(1)!=0&&Blacks(2)!=0) return(true); else return (false);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр_F Опубликовано 26 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 января, 2018 Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара: Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи: if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал){ if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) { Print ("Ошибка открытия ордер на продажу"); } }Заранее Спасибо за ваш ответ. Безымянный.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
d1w4m3 Опубликовано 27 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2018 Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара: Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи: if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал){ if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) { Print ("Ошибка открытия ордер на продажу"); } } Вот так можноbool TREND (){ if(Trend_R1 > 0 &&Trend_R1 != 2147483647.0) return(true); return(false);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр_F Опубликовано 27 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2018 Извините, но, разве bool TREND () не должен находится в глобальной переменной? Я только что вставил этот код в советник и он вывел ошибку 'TREND' - function can be declared only in the global scope Здравствуйте трейдеры, подскажите, через какую функцию можно брат сигнал стрелочного индикатора, возникшим только над текущим баре? Данный индюк дает стрелку сразу, при возникновении нового бара: Trend_R1 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,1); - Сигнал возникшей стрелки при открытии новой свечи: if (Trend_R1 >= 1 && (Каким должно быть условие? Для того что бы открытие сделки произошло именно на том баре, над которым возник сигнал){ if (OrderSend (Symbol(), OP_SELL, Lots_x1, Bid, Slippage, sl_s, tp_s, comment, Magic, 0, clrRed) { Print ("Ошибка открытия ордер на продажу"); } } Вот так можноbool TREND (){ if(Trend_R1 > 0 &&Trend_R1 != 2147483647.0) return(true); return(false);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
lordsamven Опубликовано 27 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2018 Добрый день!Ситуация следующая: написал советник для МТ4. В работе используются как стандартные так и внешние индикаторы. Скомпилировал, ошибок нет. Запустил тестирование без визуализации. Ошибок тоже нет, но очень медленно тестирует.Подскажите, есть ли какой-то способ ускорить процесс? Ссылка на сообщение Поделиться на другие сайты More sharing options...
d1w4m3 Опубликовано 27 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 января, 2018 Извините, но, разве bool TREND () не должен находится в глобальной переменной? Я только что вставил этот код в советник и он вывел ошибку 'TREND' - function can be declared only in the global scope мм а вы представляете, что такое bool?Почитайте справку сразу поймете или вы просто неправильно записали if( TREND()==true) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red); if (ticket > 0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); if (OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка на продажу"); } } Изменено 29 января, 2018 пользователем d1w4m3 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 28 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 января, 2018 Александр_F речь идёт о функции Trend() - её надо поместить вне функции OnTick()! просто на пустом месте. А использовать так, как в примере d1w4m3.Подскажите, есть ли какой-то способ ускорить процесс? конечно можно, но к сожалению это творческий процесс - нужно знать тонкости стратегии и работы терминала. нет готовых инструкций...Посоветую избавиться от пересчёта ордеров и опроса индикаторов на каждом тике, искать закрытые ордера в истории.Evendx интерес к зиг-загу не пропал, будем продолжать? 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр_F Опубликовано 29 января, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 января, 2018 Большое Спасибо за совет, функция работает идеально) (P.S. прикрепляю итог, вдруг кому-то пригодится) Trend_R0 = iCustom (NULL,0,"Indicators_Down",LevelEn,TradeTer, 1,0);//+------------------------------------------------------------------+ Lots_x1 if(TREND()==true) { if (OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, sl, tp, comment, Magic, 0, clrRed) { Print ("Ошибка открытия ордер на продажу"); } }//+------------------------------------------------------------------+bool TREND (){ if(Trend_R0 > 0 && Trend_R0 != 2147483647.0) return(true); return(false);}//+------------------------------------------------------------------+ 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
TastyScript Опубликовано 5 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 февраля, 2018 Доброго времени суток, я про автоматизированную торговлю бинарными опционами в grand capital, там система процента выигрыша опциона сейчас плавающая, что нельзя не учитывать при автоматизированной торговле, где очень важен манименеджмент, собственно перед отправкой ordersend, логично будет проверять процент прибыльности опциона, но к сожалению этой информации нет в спецификациях контрактов, уважаемые администратор и модераторы сайта tradelikeapro, существует ли способ узнать этот процент из кода советника?Техподдержка не алё..Client Support: Какой у вас вопрос? Я: существует ли способ узнать процент выигрыша опциона из кода советника?Client Support: К сожалению,не можем ничего вам подсказать по работе советника.Может есть какие-нибудь идеи по этому поводу?У них есть спецификация на сайте, может можно как-то спарсить инфу оттуда? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 5 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 февраля, 2018 существует ли способ узнать процент выигрыша опциона из кода советника?Читайте тему Сайлента - http://tlap.com/forum/strategii-i-indikatory/32/sovetnik-charlie/15737/Там подробно обсудили способы получения этого процента, а так-же другие важные аспекты торговли советником на БО. Ссылка на сообщение Поделиться на другие сайты More sharing options...
ildarvin Опубликовано 11 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 февраля, 2018 Всем привет! Подскажите пожалуйста как сделать чтоб советник останавливал свою работу после сообщения что " недостаточно денег открыть следующую сделку." А то он пишет коммент и задерживает оптимизацию. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 12 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 февраля, 2018 ildarvin попробуйте использовать ExpertRemove. В любом месте программы: if ( всё_хреново() == true ) ExpertRemove();по идее вызывает деинициализацию эксперта, т.е. завершает 1 проход оптимизациии.Сейчас попробовал - из 6 проходов оптимизации делает все, хотя на 4 выходит по ExpertRemove...Если попробуете - опишите результат, думаю будет интересно. Изменено 12 февраля, 2018 пользователем 0ll 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 12 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 февраля, 2018 Всем привет! Подскажите пожалуйста как сделать чтоб советник останавливал свою работу после сообщения что " недостаточно денег открыть следующую сделку." А то он пишет коммент и задерживает оптимизацию. Пробуйте сделать так: объявить булевую переменную Trade, задать её в значение в OnInit(), а затем, в самом начале ф-ции OnTick() её проверять, вообщем, см. ниже:bool Trade;//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int OnInit() { Trade = true; ------ } //+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+void OnTick() {//--- if(!Trade) return; // Прописать в самом начале ф-ции. ----- if(Не денег) { Trade = false; Print("Не достаточно средств."); } }//+------------------------------------------------------------------+ 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 12 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 февраля, 2018 mobidik этот вариант прекратит торговлю, но тики будут идти до конца периода оптимизации.Интересно попробовать именно вариант с ExpertRemove Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 12 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 февраля, 2018 Интересно попробовать именно вариант с ExpertRemove Проверил с ExpertRemove() - работает, оптимизация проходит быстрее, при одиночном прогоне с визуализацией при наступлении события по ExpertRemove(), график дальше не двигается. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
ildarvin Опубликовано 13 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 февраля, 2018 Да с ExpertRemove получилось, спасибо за подсказку. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
feniks78 Опубликовано 14 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 февраля, 2018 Приветствую всех!Подскажите, пожалуйста, что нужно написать в такой ситуации.У меня открылся ордер по индикаторам(с этим все в порядке).И если он закрылся по стоплоссу - открывается сразу же ордер в том же направлении,несмотря на показания индикаторов. И также со вторым - если закрылся по стоплоссу, открывается третий(последний).Хотя бы в каком направлении работать.... Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 14 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 февраля, 2018 Хотя бы в каком направлении работать...Вам нужно открыть от 1 до 3 ордеров по сигналу индикатора? Здесь одни вопросы: время от сигнала и до открытия последнего ордера имеет значение? если за это время будет новый сигнал в ту-же сторону? или противоположный?Самый простой случай (это когда всё не важно) :int countB = 0, countS = 0 ; // счётчики ордеров на Бай и Селлif ( countB { if ( Indicatop_Buy() == true ) countB = 1; // =1 - сигнал получен }if ( countB > 0 && countB { int tiket = OrderSend ( NULL, OP_BUY, ... ); // открываем ордер if ( tiket >= 0 ) { countB++; ..... }}else if ( countB > 3 ) countB = 0; // >3 - сбрасываем счётчик в ожидание сигнала индюкаПС: старайтесь более чётко формулировать вопросы - они после этого сами решаются ;) Ссылка на сообщение Поделиться на другие сайты More sharing options...
feniks78 Опубликовано 15 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 февраля, 2018 Сформулировал.....не отпали b-)Только первый открывается по показаниям индикаторов.Второй - если первый закрылся по стоплоссу.Третий(последний) - если второй закрылся по стоплоссу. Добавлено: 15-02-2018 02:53:49То есть второму ордеру НЕ важны показания индикаторов, сигнал для него - если первыйзакрылся по стоплоссу. Если первый ордер закрылся в профите - второй не открывается(если нет новых сигналов от индикаторов).И также третий ордер - по отношению к второму.Добавлено: 15-02-2018 03:35:00Ну и конечно, ордера на покупку независимы от ордеров на продажу.Добавлено: 15-02-2018 03:59:00С первыми ордерами мне все понятно, но вот как к ним подключить вторые и третьи.....Какие функции нужны....И какие сравнения производить(что и с чем). Изменено 15 февраля, 2018 пользователем feniks78 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 февраля, 2018 Да, забыл проверить на СЛ... вот с проверкой по Бай-стороне (Селл - тоже самое): пример int countB = 0, countS = 0, tiket = -1; // это на глобальный уровеньif ( countB { if ( Indicatop_Buy() == true ) countB = 1; // =1 - сигнал получен }if ( countB > 0 && countB { if ( tiket { int tik = OrderSend ( NULL, OP_BUY, ... ); // открываем ордер if ( tik >= 0 ) { tiket = tik; countB = 1; ..... } } else // ордер есть - следим за закрытием { OrderSelect ( tiket, SELECT_BY_TICKET ); // выбираем ордер по сохранённому тикету if ( OrderCloseTime() > 0 ) // ордер закрыт { if ( OrderProfit() { int tik = OrderSend ( NULL, OP_BUY, ... ); // открываем следующий ордер if ( tik >= 0 ) { tiket = tik; countB++; ..... } // запоминаем тикет и считаем ордера } else { tiket = -1; countB = 0; } // закрыт в профите - сбрасываем счётчик } }}else if ( countB > 3 ) { tiket = -1; countB = 0; } // >3 - сбрасываем счётчик и ожидаем след. сигнала Изменено 15 февраля, 2018 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
feniks78 Опубликовано 15 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 февраля, 2018 Подскажите, пожалуйста, что не так :-s Спойлер { if (curtime == Time[0]) return; curtime = Time[0]; maxbb = iBands(NULL, 0, Bperiod, Bsdvig, Sdvigoc, PRICE_CLOSE, MODE_UPPER, 1); minbb = iBands(NULL, 0, Bperiod, Bsdvig, Sdvigoc, PRICE_CLOSE, MODE_LOWER, 2); maxwpr = iWPR(NULL, 0, WPRperiod, 0); minwpr = iWPR(NULL, 0, WPRperiod, 1); maxrsi = iRSI(NULL,0,RSIperiod,PRICE_CLOSE,0); minrsi = iRSI(NULL, 0, RSIperiod, PRICE_CLOSE, 1); if (countS { if (Ask >= maxbb && maxwpr > WPRmax && maxrsi >= RSImax)countS=1; } if(countS>0 && countS { if(tiket { tp = NormalizeDouble(Bid - Tprofit_1*Point, 5); sl = NormalizeDouble(Bid + Sloss_1*Point, 5); int tik = OrderSend(Symbol(), OP_SELL, 0.01, Bid, Slippage, sl, tp, "", Magic_1, 0, Red); if(tik>=0) {tiket = tik; countS = 1; } else { if(OrderSelect(tiket, SELECT_BY_TICKET)) if(OrderCloseTime()>0 && OrderProfit() { tp_1 = NormalizeDouble(Bid - Tprofit_2*Point, 5); sl_1 = NormalizeDouble(Bid + Sloss_2*Point, 5); int tik = OrderSend(Symbol(), OP_SELL, 0.02, Bid, Slippage, sl_1, tp_1, "", Magic_1, 0, Red); if(tik>=0) { tiket = tik; countS++; } else { tiket = -1; countS = 0; } } } } } else if(countS>3) { tiket = -1; countS = 0; } if (countB { if (Bid } if(countB>0 && countB { if(tiket { tp = NormalizeDouble( Ask + Tprofit_1*Point, 5); sl = NormalizeDouble(Ask- Sloss_1*Point, 5); int tik = OrderSend(Symbol(), OP_BUY, 0.01, Ask, Slippage, sl, tp, "", Magic_1, 0, Blue); if(tik>=0) { tiket = tik; countB = 1; } else { if(OrderSelect(tiket, SELECT_BY_TICKET)) if(OrderCloseTime()>0 && OrderProfit() { tp_1 = NormalizeDouble(Ask + Tprofit_2*Point, 5); sl_1 = NormalizeDouble(Ask - Sloss_2*Point, 5); int tik = OrderSend(Symbol(), OP_SELL, 0.02, Bid, Slippage, sl_1, tp_1, "", Magic_1, 0, Red); if(tik>=0) { tiket = tik; countB++; } else { tiket = -1; countB = 0; } } } } } else if(countB>3) { tiket = -1; countB = 0; } }//+------------------------------------------------------------------+ В тестере за время проверки одну сделку открывает и все... Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 февраля, 2018 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 февраля, 2018 В журнале пишет что-нибудь?вставь Принт сюда: if(countS>0 && countS { Print ( " if(tiketПотом смотри в Журнале как идёт отработка и где затык.Потом можешь Принт поставить в другое место и с другим текстом Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти