0ll Опубликовано 3 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 августа, 2014 Каждый раз одно и тоже...Чем-же мы Вам поможем если нет кода совы и индикатора?Мы можем только посочувствовать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
alex198 Опубликовано 3 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 августа, 2014 Каждый раз одно и тоже...Чем-же мы Вам поможем если нет кода совы и индикатора?Мы можем только посочувствовать. Да я бы с радостью!!!! Только не могу разобраться как прикрепить код. Добавлено: 03-08-2014 11:57:21Прошу прощения. Разобрался. Stalin.mq4моё_второе_творение.mq4 Изменено 3 августа, 2014 пользователем alex198 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 3 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 августа, 2014 Вы берете данные индикатора с 0 свечи, а он пишет стрелки только в 1-ую свечу.Исправьте это: мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 0); мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 0);на это: мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 1); мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 1); 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
alex198 Опубликовано 4 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 августа, 2014 Вы берете данные индикатора с 0 свечи, а он пишет стрелки только в 1-ую свечу.Исправьте это: мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 0); мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 0);на это: мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 1); мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 1); Спасибо! Исправил. Всё равно тоже самое. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 4 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 августа, 2014 Спасибо! Исправил. Всё равно тоже самое.Теперь сделай так:if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно. Ссылка на сообщение Поделиться на другие сайты More sharing options...
alex198 Опубликовано 4 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 августа, 2014 Теперь сделай так:if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно. Ура!!! Заработало!!!! :d Спасибо огромное!!!! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр2303 Опубликовано 5 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 августа, 2014 На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 5 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 августа, 2014 На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.Индюк открывать ордера не может. Надо писать сову, экспортировать значения индикатора и уже по этим значениям открывать ордера. Алерт, исполняемый индюком, сова не увидит! Ссылка на сообщение Поделиться на другие сайты More sharing options...
dronsk Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 День добрый. Ну не хватает у меня мозгов написать советник ! ))) Просмотрел уроки, почитал справку. Не могу понять, как работать с временными функциями. Подскажите как можно вычислить минимумы и максимумы цены за определённый (введённый) период, (например с 9.00 по 12.00). Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 Минимум и минимумЫ - штуки разные. Поясню только "минимум" (максимум - аналогично):1. У Вас есть период, надо вычислить количество например минутных баров (например 180)(если вычисляем на минутках, то и ТФ графика должен быть М1)2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];Прочитать можно здесь Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ruslan982 Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 С кодом своим сам будешь биться или мне поправить? Если не сложно поправь пожалуйста.Как правильно написать условие: что если в день 3 ордера подряд закрылись с убытком то сегодня больше не работать и начать работу с завтрашнего дня? Изменено 6 августа, 2014 пользователем Ruslan982 Ссылка на сообщение Поделиться на другие сайты More sharing options...
igor2012 Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 вопрос, есть индикатор в котором промежуток расчета нужно вводить вручную(начало расчета и конец) может кто знает можно написать скрипт или индюк, чтобы он сам вносил автоматически нужные временные данные от нанесенных на графике вертикальных линий(и при их перемещении соот. он менял значения) использую индикатор профиля от кластердельта, но там нужно вручную вбивать промежуток если он пользовательский. спасибо Ссылка на сообщение Поделиться на другие сайты More sharing options...
dronsk Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 Минимум и минимум1. У Вас есть период, надо вычислить количество например минутных баров (например 180)(если вычисляем на минутках, то и ТФ графика должен быть М1)2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)]; Спасибо за ответ. А 180 - это количество отсчитываемых баров от последнего ? И как привязать к ним период вычисления минимума (например с 9.00 по 11.00) ? Сверить время закрытия бара на предмет попадания в заданый период ? Изменено 6 августа, 2014 пользователем dronsk Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 А как привязать время (например с 9.00 по 12.00) к вычисленным (например 180) барам?Вам нужен период с 9 до 12, текущее время 14, привязываем к минутным барам:Количество_баров_для_анализа (count) = Время12 - Время9; (=180)Номер_бара_для_начала_анализа (start)= CurrentTime() - Время12; (=120)iLowest (NULL, 0, MODE_LOW, count, start) Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 6 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 августа, 2014 1. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту)Код поправлю позже 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ruslan982 Опубликовано 7 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 августа, 2014 Код поправлю позже Спасибо.Добавлено: 07-08-2014 04:20:001. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту) Начал писать, и вот ч то у меня получается. Правильно ли я иду?int FunctionStopTrade(){ int closestoploss; double OldCloseTime; int Closetime = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { OldCloseTime = OrderCloseTime(); if(OldCloseTime > Closetime) { Closetime = OldCloseTime; if(OrderProfit() closestoploss++; if(OrderProfit()>0) closestoploss = 0; } } } } return();}Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня Изменено 7 августа, 2014 пользователем Ruslan982 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр2303 Опубликовано 7 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 августа, 2014 Простите, чувствую что что то сделал не так, а что не понимаю. Если возможно помогите понять и исправить. 1. Моя работа2. Индикатор Добавлено: 07-08-2014 15:41:51Извините забыл объяснить. При компиляции ошибок нет вроде все сделал правильно, но ордера не открываются. Я так понимаю, что из за специфики индюка. но что и как пока не дошло.HMA_SV.mq4HMA_SV.ex4HMA_Color.mq4HMA_Color.ex4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 7 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 августа, 2014 Простите, чувствую что что то сделал не так, а что не понимаю. Пока сидел в аэропорту - поправил:- Вместо ф-ции Старт - ф-ция Тик- в ОрдерСелект после открытия ордера поправил формат вызоваHMA_SV_0ll.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 7 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 августа, 2014 Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дняПримерно так (и считает и сбрасывает и выдаёт результат торговать/нет):bool FunctionStopTrade(){ datetime Today; MqlDateTime dtToday; TimeCurrent(dtToday); dtToday.hour = 0; dtToday.sec = 0; dtToday.min = 0; Today = StructToTime(dtToday); bool result = false: int closestoploss = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderCloseTime() > Today) { if(OrderProfit { closestoploss++; } } } } if (closestoploss > 2) result = true; return(result);} Вы здесь наставили здесь задач - теперь не знаю что и поправлять...Вы уж соберите все мысли в кучу, оформите как-то... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Ruslan982 Опубликовано 8 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 августа, 2014 Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дняПримерно так (и считает и сбрасывает и выдаёт результат торговать/нет): добавил условие if (FunctionStopTrade() == false) { if(CountBuy() == 0) // если количество открытых ордеров равно нулю,то { if(Close[2] { if (Close[1] > iMA_buy) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, NormalizeDouble(Ask-StopLoss*Point, Digits), NormalizeDouble(Ask+TakeProfit*Point, Digits), "", Magic, 0, Blue); } } }но он не хочет считать :(Добавлено: 08-08-2014 07:38:07Вы здесь наставили здесь задач - теперь не знаю что и поправлять...Вы уж соберите все мысли в кучу, оформите как-то... Я учусь программировать, вот и решил в первый советник (найденный на просторах интернета) добавить мартина, а второй советник пишу сам. Изменено 8 августа, 2014 пользователем Ruslan982 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 8 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 августа, 2014 Приветствую всех!Не так давно решил начать изучение языка MQL, что-то понятно, что-то не очень... Хочу написать советник, работающий в канале, о прибыльности речи не идет, просто хочу знать как реализовать некоторые моменты.Суть системы простая: есть канальный индикатор, если цена пересекает верхнюю линию, то продаем, нижнюю - покупаем.Алгоритм такой я написал, но вот только в условии if>= iCustom(.....) , и советник открывает позиции просто , когда цена находится вне канала...Что бы мне хотелось узнать:1) Что нужно добавить в условие открытия ордера, чтобы он открывался только в том случае, если предыдущий бар был закрыт внутри канала (или же его open/close находились внутри канала, или же high/low)\2) Можно ли задать некий отступ "n" от границы канала во внутрь, на который цена должна отползти, прежде, чем ордер будет открыт? Например, close предыдущего бара должен находится на некотором расстоянии от канала (внутри него), чтобы выполнялось условия открытия ордера.В качестве индикатора взял канал "KC", это то же самое, что и тма по сути, только не перерисовывается, поэтому его поведение можно смотреть в ретроспективе.Помогите плиз кто чем может... KCexpert.rar Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр2303 Опубликовано 8 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 августа, 2014 Ура заработало. Большое спасибо. Теперь буду решать следующую проблему. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 8 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 августа, 2014 Подскажите ,пожалуйста, в чём может быть причина!При тестировании советника (алгоритм три тайм фрейма) ,при всех включённых тайм фреймах,советник не хочет открывать сделки.При отключении самого старшего тайм фрейма советник работает.При выводе на принт все значения индикаторов самого старшего тайм фрейма выводятся? Ссылка на сообщение Поделиться на другие сайты More sharing options...
дима123 Опубликовано 9 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 августа, 2014 почему то открывает очено много ордеров на одном тике не дожидаясь срабатывания стоп и тейк уровней предыдущего ордерав чем проблемаint start(){ if (CountTrades() == 0) { TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); SL = NormalizeDouble(Ask - StopLoss * Point, Digits); OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE); { for (int i = OrdersHistoryTotal()-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if ( OrderType()==OP_BUY) { if (StringFind(OrderComment(),"sl")>=0) { lastlot = FindLastLots(OP_BUY); lastlot = NormalizeDouble(lastlot * Multiplier, 2); TP = NormalizeDouble(Bid - TakeProfit * Point, Digits); SL = NormalizeDouble(Bid + StopLoss * Point, Digits); OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE); { if (StringFind(OrderComment(),"tp")>=0) { TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); SL = NormalizeDouble(Ask - StopLoss * Point, Digits); OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE); } } } } if(OrderType()==OP_SELL) { if(StringFind(OrderComment(),"sl")>=0) { lastlot = FindLastLots(OP_SELL); lastlot = NormalizeDouble(lastlot * Multiplier, 2); TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); SL = NormalizeDouble(Ask - StopLoss * Point, Digits); OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE); { if (StringFind(OrderComment(),"tp")>=0) { TP = NormalizeDouble(Bid - TakeProfit * Point, Digits); SL = NormalizeDouble(Bid + StopLoss * Point, Digits); OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE); } } } } } }}}} return(0);}//+------------------------------------------------------------------+int CountTrades(){ int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) count++; } } return(count);}//+------------------------------------------------------------------+double FindLastLots(int otype){ double oldlots; int oldticket; ticket = 0; for(int i=OrdersHistoryTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { oldticket = OrderTicket(); if(oldticket > ticket) { oldlots = OrderLots(); ticket = oldticket; } } } } return(oldlots); }задача совы: если открытых ордеров нет открываем ордер на покупку с установленными тейк и стоп уровнями ищем последний закрытый ордер на покупку если ордер закрылся по тейкпрофиту открываем снова на покупку с установленными тейк и стоп уровнями если ордер закрылся по стоплоссу открываем ордер на продажу с удвоенным лотом ищем последний закрытый ордер на продажу если ордер закрылся по тейк профиту открываем ордер на продажу с начальным лотом и установленными тейк и стоп уровнями если ордер закрылся по стоплоссу открываем ордер на покупку с удвоенным лотом Ссылка на сообщение Поделиться на другие сайты More sharing options...
Александр2303 Опубликовано 9 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 августа, 2014 Скажите пожалуйста. Если в индюке выполняется условиеif(PointB > PointA && c234 { Alert("Take Profit (Sell) Ready to Buy \n Symbol=",Symbol()," Period=",Period()); c234 = 1; } if(PointB = 0 ) { Alert("Take Profit (Buy) Ready to Sell \n Symbol=",Symbol()," Period=",Period()); c234 = -1;Возможно ли по этим условиям открыть ордераif(PointB = 0 ) { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, NULL, Magic, 0, Red); if (ticket >0) { if(OrderSelect(ticket, SELECT_BY_TICKET) == true) { if(OrderModify(ticket, OrderOpenPrice(), SL, TP,0,0)) Print ("Ok"); }else Print("HELP"); } } if(PointB > PointA && c234 { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, NULL, Magic, 0, Blue); if (ticket >0) { if(OrderSelect(ticket, SELECT_BY_TICKET) == true) { if(OrderModify(ticket, OrderOpenPrice(), SL, TP,0)) Print ("Ok"); }else Print("HELP"); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти