Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#1101

Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.

#1102


Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.



Да я бы с радостью!!!! Только не могу разобраться как прикрепить код.

Добавлено: 03-08-2014 11:57:21

Прошу прощения. Разобрался.

Stalin.mq410 скач.
моё_второе_творение.mq411 скач.

Изменено 3 августа, 2014 пользователем alex198

#1103

Вы берете данные индикатора с 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);

#1104


Вы берете данные индикатора с 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);



Спасибо! Исправил. Всё равно тоже самое.
#1105


Спасибо! Исправил. Всё равно тоже самое.

Теперь сделай так:
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.
#1106

Теперь сделай так:
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.



Ура!!! Заработало!!!! :d Спасибо огромное!!!!
#1107

На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.

#1108


На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.

Индюк открывать ордера не может. Надо писать сову, экспортировать значения индикатора и уже по этим значениям открывать ордера. Алерт, исполняемый индюком, сова не увидит!
#1109

День добрый. Ну не хватает у меня мозгов написать советник ! ))) Просмотрел уроки, почитал справку. Не могу понять, как работать с временными функциями. Подскажите как можно вычислить минимумы и максимумы цены за определённый (введённый) период, (например с 9.00 по 12.00).

#1110

Минимум и минимумЫ - штуки разные. Поясню только "минимум" (максимум - аналогично):
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];
Прочитать можно здесь

#1111


С кодом своим сам будешь биться или мне поправить?


Если не сложно поправь пожалуйста.

Как правильно написать условие: что если в день 3 ордера подряд закрылись с убытком то сегодня больше не работать и начать работу с завтрашнего дня?

Изменено 6 августа, 2014 пользователем Ruslan982

#1112

вопрос, есть индикатор в котором промежуток расчета нужно вводить вручную(начало расчета и конец) может кто знает можно написать скрипт или индюк, чтобы он сам вносил автоматически нужные временные данные от нанесенных на графике вертикальных линий(и при их перемещении соот. он менял значения) использую индикатор профиля от кластердельта, но там нужно вручную вбивать промежуток если он пользовательский. спасибо

#1113


Минимум и минимум
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];


Спасибо за ответ. А 180 - это количество отсчитываемых баров от последнего ? И как привязать к ним период вычисления минимума (например с 9.00 по 11.00) ? Сверить время закрытия бара на предмет попадания в заданый период ?

Изменено 6 августа, 2014 пользователем dronsk

#1114


А как привязать время (например с 9.00 по 12.00) к вычисленным (например 180) барам?

Вам нужен период с 9 до 12, текущее время 14, привязываем к минутным барам:
Количество_баров_для_анализа (count) = Время12 - Время9; (=180)
Номер_бара_для_начала_анализа (start)= CurrentTime() - Время12; (=120)
iLowest (NULL, 0, MODE_LOW, count, start)
#1115

1. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.
2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;
3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту)

Код поправлю позже

#1116


Код поправлю позже



Спасибо.



Добавлено: 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

#1117

Простите, чувствую что что то сделал не так, а что не понимаю. Если возможно помогите понять и исправить.
1. Моя работа
2. Индикатор


Добавлено: 07-08-2014 15:41:51

Извините забыл объяснить. При компиляции ошибок нет вроде все сделал правильно, но ордера не открываются. Я так понимаю, что из за специфики индюка. но что и как пока не дошло.

HMA_SV.mq49 скач.
HMA_SV.ex47 скач.
HMA_Color.mq410 скач.
HMA_Color.ex48 скач.

#1118


Простите, чувствую что что то сделал не так, а что не понимаю.


Пока сидел в аэропорту - поправил:
- Вместо ф-ции Старт - ф-ция Тик
- в ОрдерСелект после открытия ордера поправил формат вызова

HMA_SV_0ll.mq416 скач.

#1119


Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня

Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):

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);
}

Вы здесь наставили здесь задач - теперь не знаю что и поправлять...
Вы уж соберите все мысли в кучу, оформите как-то...
#1120



Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня

Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):


добавил условие
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

#1121

Приветствую всех!

Не так давно решил начать изучение языка MQL, что-то понятно, что-то не очень...
Хочу написать советник, работающий в канале, о прибыльности речи не идет, просто хочу знать как реализовать некоторые моменты.

Суть системы простая: есть канальный индикатор, если цена пересекает верхнюю линию, то продаем, нижнюю - покупаем.
Алгоритм такой я написал, но вот только в условии if>= iCustom(.....) , и советник открывает позиции просто , когда цена находится вне канала...

Что бы мне хотелось узнать:

1) Что нужно добавить в условие открытия ордера, чтобы он открывался только в том случае, если предыдущий бар был закрыт внутри канала (или же его open/close находились внутри канала, или же high/low)\

2) Можно ли задать некий отступ "n" от границы канала во внутрь, на который цена должна отползти, прежде, чем ордер будет открыт? Например, close предыдущего бара должен находится на некотором расстоянии от канала (внутри него), чтобы выполнялось условия открытия ордера.

В качестве индикатора взял канал "KC", это то же самое, что и тма по сути, только не перерисовывается, поэтому его поведение можно смотреть в ретроспективе.

Помогите плиз кто чем может...

KCexpert.rar7 скач.

#1122

Ура заработало. Большое спасибо. Теперь буду решать следующую проблему.

#1123

Подскажите ,пожалуйста, в чём может быть причина!
При тестировании советника (алгоритм три тайм фрейма) ,при всех включённых тайм фреймах,советник не хочет открывать
сделки.При отключении самого старшего тайм фрейма советник работает.При выводе на принт все значения индикаторов
самого старшего тайм фрейма выводятся?

#1124

почему то открывает очено много ордеров на одном тике не дожидаясь срабатывания стоп и тейк уровней предыдущего ордера
в чем проблема
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);
}
задача совы: если открытых ордеров нет
открываем ордер на покупку с установленными тейк и стоп уровнями
ищем последний закрытый ордер на покупку
если ордер закрылся по тейкпрофиту
открываем снова на покупку с установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на продажу с удвоенным лотом
ищем последний закрытый ордер на продажу
если ордер закрылся по тейк профиту
открываем ордер на продажу с начальным лотом и установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на покупку с удвоенным лотом

#1125

Скажите пожалуйста. Если в индюке выполняется условие
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");
}

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025