Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.
Да я бы с радостью!!!! Только не могу разобраться как прикрепить код.
Добавлено: 03-08-2014 11:57:21
Прошу прощения. Разобрался.
Изменено 3 августа, 2014 пользователем alex198
Вы берете данные индикатора с 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);
Вы берете данные индикатора с 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);
Спасибо! Исправил. Всё равно тоже самое.
Теперь сделай так:
Спасибо! Исправил. Всё равно тоже самое.
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.
Теперь сделай так:
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.
Ура!!! Заработало!!!! :d Спасибо огромное!!!!
На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.
Индюк открывать ордера не может. Надо писать сову, экспортировать значения индикатора и уже по этим значениям открывать ордера. Алерт, исполняемый индюком, сова не увидит!
На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.
День добрый. Ну не хватает у меня мозгов написать советник ! ))) Просмотрел уроки, почитал справку. Не могу понять, как работать с временными функциями. Подскажите как можно вычислить минимумы и максимумы цены за определённый (введённый) период, (например с 9.00 по 12.00).
Минимум и минимумЫ - штуки разные. Поясню только "минимум" (максимум - аналогично):
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];
Прочитать можно здесь
С кодом своим сам будешь биться или мне поправить?
Если не сложно поправь пожалуйста.
Как правильно написать условие: что если в день 3 ордера подряд закрылись с убытком то сегодня больше не работать и начать работу с завтрашнего дня?
Изменено 6 августа, 2014 пользователем Ruslan982
вопрос, есть индикатор в котором промежуток расчета нужно вводить вручную(начало расчета и конец) может кто знает можно написать скрипт или индюк, чтобы он сам вносил автоматически нужные временные данные от нанесенных на графике вертикальных линий(и при их перемещении соот. он менял значения) использую индикатор профиля от кластердельта, но там нужно вручную вбивать промежуток если он пользовательский. спасибо
Минимум и минимум
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];
Спасибо за ответ. А 180 - это количество отсчитываемых баров от последнего ? И как привязать к ним период вычисления минимума (например с 9.00 по 11.00) ? Сверить время закрытия бара на предмет попадания в заданый период ?
Изменено 6 августа, 2014 пользователем dronsk
Вам нужен период с 9 до 12, текущее время 14, привязываем к минутным барам:
А как привязать время (например с 9.00 по 12.00) к вычисленным (например 180) барам?
Количество_баров_для_анализа (count) = Время12 - Время9; (=180)
Номер_бара_для_начала_анализа (start)= CurrentTime() - Время12; (=120)
iLowest (NULL, 0, MODE_LOW, count, start)
1. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.
2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;
3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту)
Код поправлю позже
Код поправлю позже
Спасибо.
Добавлено: 07-08-2014 04:20:00
1. Нужна переменная 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
Простите, чувствую что что то сделал не так, а что не понимаю. Если возможно помогите понять и исправить.
1. Моя работа
2. Индикатор
Добавлено: 07-08-2014 15:41:51
Извините забыл объяснить. При компиляции ошибок нет вроде все сделал правильно, но ордера не открываются. Я так понимаю, что из за специфики индюка. но что и как пока не дошло.
Простите, чувствую что что то сделал не так, а что не понимаю.
Пока сидел в аэропорту - поправил:
- Вместо ф-ции Старт - ф-ция Тик
- в ОрдерСелект после открытия ордера поправил формат вызова
Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):
Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня
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);
}
Вы здесь наставили здесь задач - теперь не знаю что и поправлять...
Вы уж соберите все мысли в кучу, оформите как-то...
Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):
Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня
добавил условие
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
Приветствую всех!
Не так давно решил начать изучение языка MQL, что-то понятно, что-то не очень...
Хочу написать советник, работающий в канале, о прибыльности речи не идет, просто хочу знать как реализовать некоторые моменты.
Суть системы простая: есть канальный индикатор, если цена пересекает верхнюю линию, то продаем, нижнюю - покупаем.
Алгоритм такой я написал, но вот только в условии if>= iCustom(.....) , и советник открывает позиции просто , когда цена находится вне канала...
Что бы мне хотелось узнать:
1) Что нужно добавить в условие открытия ордера, чтобы он открывался только в том случае, если предыдущий бар был закрыт внутри канала (или же его open/close находились внутри канала, или же high/low)\
2) Можно ли задать некий отступ "n" от границы канала во внутрь, на который цена должна отползти, прежде, чем ордер будет открыт? Например, close предыдущего бара должен находится на некотором расстоянии от канала (внутри него), чтобы выполнялось условия открытия ордера.
В качестве индикатора взял канал "KC", это то же самое, что и тма по сути, только не перерисовывается, поэтому его поведение можно смотреть в ретроспективе.
Помогите плиз кто чем может...
Ура заработало. Большое спасибо. Теперь буду решать следующую проблему.
Подскажите ,пожалуйста, в чём может быть причина!
При тестировании советника (алгоритм три тайм фрейма) ,при всех включённых тайм фреймах,советник не хочет открывать
сделки.При отключении самого старшего тайм фрейма советник работает.При выводе на принт все значения индикаторов
самого старшего тайм фрейма выводятся?
почему то открывает очено много ордеров на одном тике не дожидаясь срабатывания стоп и тейк уровней предыдущего ордера
в чем проблема
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);
}
задача совы: если открытых ордеров нет
открываем ордер на покупку с установленными тейк и стоп уровнями
ищем последний закрытый ордер на покупку
если ордер закрылся по тейкпрофиту
открываем снова на покупку с установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на продажу с удвоенным лотом
ищем последний закрытый ордер на продажу
если ордер закрылся по тейк профиту
открываем ордер на продажу с начальным лотом и установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на покупку с удвоенным лотом
Скажите пожалуйста. Если в индюке выполняется условие
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");
}
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем