Перейти к содержанию

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


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SergeyNT в Вашем релизе индюка буферы выключены (совсем) - т.е. в них нули...
Подправил индюшку: теперь вместе с отрисовкой стрелочки заполняются буфера 0-бычий, 1-медвежий.

4X_Bheurekso_Pattern_indikatorforeks.ru.mq4

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Вау, заработало
upper=iCustom(Symbol(),Period(),"4X Bheurekso Pattern indikator New",lines,step,Dell,0,1);
Благодарю.

А в какой строке сделали изменения? Хочу посмотреть как это делается.

Изменено пользователем SergeyNT
Ссылка на сообщение
Поделиться на другие сайты

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

Индюшка странная (или у меня что-то не так) - значений в буферах оказывается больше чем стрелочек на графике. Т.е. видимо стрелочки удаляются где-то (т.е. индюк рисует), а значения в буферах остаётся (имхо)
Изменения простые (последний вариант): найдите и раскомментируйте строки "ExtMapBuffer1[shift] = "

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?

Ссылка на сообщение
Поделиться на другие сайты

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


А подскажите как сделать, чтобы какой-либо ценовой уровень, скажем, лоу предыдущего дня, отображался в виде линии и с надписью?

Я так делал:
ObjName= "Name_";
txt = "Описание";
ObjectCreate (ObjName, OBJ_TREND, 0, StartX, StartY, EndX, EndY); //Х = время, Y=Y = лоу дня
ObjectSet (ObjName, OBJPROP_RAY, 0);
ObjectSet (ObjName, OBJPROP_WIDTH, 2); //толщина линии
ObjectSet (ObjName, OBJPROP_COLOR, DodgerBlue); //цвет
ObjectSet (ObjName, OBJPROP_BACK, true); //рисовать под барами
ObjectSetString(0, ObjName, OBJPROP_TEXT, txt); //здесь описание
ObjectSetString(0, ObjName, OBJPROP_TOOLTIP, txt); //здесь всплывающая подсказка
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.
Я недавно скачал видео уроки , стал изучать делать домашнее задание , а таи изменения.
Вопрос где прочитать про эти изменения.
Спасибо .

Ссылка на сообщение
Поделиться на другие сайты

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

Хочу попробовать заключить в советник самодельный индикатор пивотов просто, линии было бы интересно увидеть при визуальном тестировании

Ошибок в editor-e нет, но линию не чертит...
С объектами впервые работаю, не соображу никак в чем дело... :-?


Спойлер


extern string BlockSettings2 = " Area "; // Пока не используется
extern int Area = 2; // Пока не используется


double C, H, L, P, S1, S2, S3, R1, R2, R3;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

datetime StartTime = iTime(Symbol(), PERIOD_D1, 0);
datetime EndTime = TimeCurrent();

H = iHigh(Symbol(),PERIOD_D1,1);
C = iClose(Symbol(),PERIOD_D1,1);
L = iLow(Symbol(),PERIOD_D1,1);

P = (H+L+C)/3;

S1 = P-(H-P);
S2 = P-(H-L);
S3 = L-2*(H-P);

R1 = P+(P-L);
R2 = P+(H-L);
R3 = H+2*(P-L);

long current_chart_id=ChartID();
string obj_name = "Line_P";
string txt = "P";
ObjectCreate (current_chart_id, obj_name, OBJ_HLINE, 0, StartTime, P, EndTime, P);
ObjectSet (obj_name, OBJPROP_RAY, 0);
ObjectSet (obj_name, OBJPROP_WIDTH, 20);
ObjectSet (obj_name, OBJPROP_COLOR, Blue);
ObjectSetString (0, obj_name, OBJPROP_TEXT, txt);

Print("StartTime = " + StartTime + " EndTime = " + EndTime + " P = " + P);

}



Print сделал для того, чтобы проверить, правильно ли дата берется и нет ли ошибки в подсчете переменной Р
Ошибок, судя по записям в журнале, нет
2014.09.25 22:35:16.693 2014.09.24 09:28 Resistance v 0.2 GBPUSD,M15: StartTime = 2014.09.24 00:00:00 EndTime = 2014.09.24 09:28:09 P = 1.63687
Ссылка на сообщение
Поделиться на другие сайты

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


Ошибок в editor-e нет, но линию не чертит...

Я-ж вроде написал пример... Проверьте ObjectCreate .
Ссылка на сообщение
Поделиться на другие сайты

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



Ошибок в editor-e нет, но линию не чертит...

Я-ж вроде написал пример... Проверьте ObjectCreate .


Ага, я просто в справочнике такое нашел...

Только я думал, что линия будет перерисовываться каждый новый день, но она так и остается на месте

Исправил вот таким образом)

if (Hour() == 00 && Minute() == 01) { ObjectDelete(obj_name);}

Добавлено: 25-09-2014 20:37:02

Правда журнал выдает ошибки вот такого характера

TestGenerator: unmatched data error (volume limit 1274 at 2014.09.18 13:45 exceeded)
TestGenerator: unmatched data error (high value 1.63399 at 2014.09.18 13:58 and price 1.63404 mismatched)
TestGenerator: unmatched data error (volume limit 816 at 2014.09.18 13:15 exceeded)

Именно в 13:15 и 13:45 для данного дня, для других дней было 8:15 и 8:45, например

На всякий даже привел переменную P вот к такому виду
P = NormalizeDouble(((H+L+C)/3),5);
Но дело не в этом оказалось
Попробовал закомментировать объект, ничего не изменилось, значит дело не в нем...
Судя по всему, все это не влияет на подсчеты уровней, но просто не понятно, что это значит Изменено пользователем oleguitar
Ссылка на сообщение
Поделиться на другие сайты

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


Судя по всему, все это не влияет на подсчеты уровней, но просто не понятно, что это значит

Это котиры дырявые (имхо)
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Цитата

Это котиры дырявые (имхо)



Возможно кстати...

Еще вопросик: а как узнать результат последней сделки в истории для конкретного советника? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.
Ссылка на сообщение
Поделиться на другие сайты

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


Добрый день.
Я недавно скачал видео уроки , стал изучать делать домашнее задание , а таи изменения.
Вопрос где прочитать про эти изменения.
Спасибо .



Приветствую!
На самом деле практически все старые варианты уроков работают в новых версиях.
Нужно только понимать некоторые вещи типа:
если в старом варианте была функция start(), где мы размещали основной код, то в новой версии эта функция называется OnTick(), точней это уже событие, а не функция, но это не столь важно.
Старая функция init(), теперь как событие OnInit().

Остальное всё по аналогии.
Удачи в изучении MQL!
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.

Ссылка на сообщение
Поделиться на другие сайты

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


А как узнать результат последней сделки в истории? (прибыль/убыток)
Только не от общего баланса, имеется ввиду, что на счету могут совершаться и другие операции, помимо операций советника.

В цикле перебираете закрытые ордера (по истории), фильтруете по магику, ищите самый большой тикет или время закрытия, смотрите прибыль. Примеров полно. Единственная хитрость: перебирать надо ордера с конца и ограничивать количество (или дату открытия) иначе терминал будет подвисать на тестировании на большой истории.
Ссылка на сообщение
Поделиться на другие сайты

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

пытаюсь учить язык программирования

вот что написал

int start()
{

Comment("Привет");


return(0);
}

в тестере стратегий ничего не отображается...в чем причина?

Ссылка на сообщение
Поделиться на другие сайты

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


пытаюсь учить язык программирования

вот что написал

int start()
{

Comment("Привет");


return(0);
}

в тестере стратегий ничего не отображается...в чем причина?



Дружище, в таком виде операция Comment будет видна только в визуальном режиме тестера стратегий, т.е. на экране. Для того, чтобы это увидеть нужно установить галку "Визуализация" и тогда всё будет видно.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день.

Скажите правильное ли решения задачи 1 в 1.5 уроке?

А то негде на форуме я не нашел не разбора, не решения этой задачи.

15.jpg

Ссылка на сообщение
Поделиться на другие сайты

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


ставлю визуализацию. и по прежнему ничего нет

Кроме Comment() есть Alert() и Print(). Попробуй всех троих (можно одновременно).
Ссылка на сообщение
Поделиться на другие сайты

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

Попробовал вот так сделать

Спойлер


double Profit;
int TotalOrders=OrdersHistoryTotal();
for(int pos=0; pos {
if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{

Profit = OrderCommission()+OrderSwap()+OrderProfit();

}
}
else
Print("Ошибка ", GetLastError());
}

if (Profit


Сначала лот нормальный идет, но после первого же убытка он приобретает вот такое значение:

2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF
2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF

Не понимаю в чем дело... Изменено пользователем oleguitar
Ссылка на сообщение
Поделиться на другие сайты

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


Сначала лот нормальный идет, но после первого же убытка он приобретает вот такое значение:

2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF
2014.10.01 13:38:17.606 2014.01.24 03:24 Resistance v 1.0 EURUSD,M15: Lot = 1.#INF

Не понимаю в чем дело...

1. Что-б разобраться сделайте: Print("Lot = " + DoubleToStr(Lot,2));
2. У Вас есть сброс лота в начальный после профита? - если нет - ошибка.
я советую начальный лот и расчётный разнести в разные переменные например РабочийЛот = НачЛот * Мульт;
3. Используйте новые возможности MQL: workLot = (Profit 4. Имейте в виду: в Вашем цикле в переменной Profit - профит последнего (в истории) ордера, но Вы перебираете ВСЮ историю (она может быть большая - я писал), поэтому начните с конца! и после
Profit = OrderCommission()+OrderSwap()+OrderProfit(); //добавьте:
break;
5. Имейте в виду: если сова открыла 1 ордер, потом 2-й, закрыла 2, а потом 1-ый - какой ордер будет последним в истории?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Цитата

5. Имейте в виду: если сова открыла 1 ордер, потом 2-й, закрыла 2, а потом 1-ый - какой ордер будет последним в истории?



1-й, как я понимаю

Переделал, разбил переменные, добавил функцию FindLastLots

Спойлер


WLot = Lot;
WLotHis = FindLastLots();

double Profit;

for (int pos = OrdersHistoryTotal()-1; pos>=0; pos--)

{
if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY) == true)
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{

Profit = OrderCommission()+OrderSwap()+OrderProfit();
break;

}
}
else
Print("Ошибка ", GetLastError());
}

if (Profit {
WLot = NormalizeDouble(WLotHis*Multiplier,2); Print("WLot = " + DoubleToStr(WLot,2));
}

//+------------------------------------------------------------------+


double FindLastLots()
{

double oldlots;
int oldticket;

ticket = 0;
for (int i = OrdersHistoryTotal()-1; i >=0; i--)
{
if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)== true)
{
if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
{
oldticket = OrderTicket();
if( oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}

}

}
return(oldlots);
}




Теперь все работает как надо)

А правильно ли я понимаю, что если в цикле поставить перебор не от OrdersHistoryTotal()-1, а от OrdersHistoryTotal()-2, то в переменной Profit будет результат предпоследнего ордера?
Ссылка на сообщение
Поделиться на другие сайты

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


1-й, как я понимаю

2. Сортируется по тикету, поэтому я делаю всё проще - когда ордер открыт - сохраняю его параметры, а после закрытия применяю
Цитата


А правильно ли я понимаю, что если в цикле поставить перебор не от OrdersHistoryTotal()-1, а от OrdersHistoryTotal()-2, то в переменной Profit будет результат предпоследнего ордера?

А если у Вас работает ещё один советник на счёте? и два последних ордера чужие?
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...