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

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


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

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

Господа, подскажите как правильно прописать условие. В тестере хочу посмотреть максимальную просадку, т. к. в результатах она не совсем корректная. Хочу вывести Comment с информацией максимальная просадка/ текущий профит. Сломал голову как написать данное условие, что-то не получается ((

double Loss=0;
double Pro=AccountProfit();
if (Pro Loss=Pro;

Comment("Buy=",countBUY," Sell=",countSELL," Loss/Profit=",Loss,"/",AccountProfit(),
" Spread=",MarketInfo(Symbol(),MODE_SPREAD);

Благодарю!

P.S. Спасибо, вопрос снят. Самостоятельно нашел решение :)

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Доброго времени суток . У меня проблема с советником.При переключении таймфрейма советник модифицирует профиты до нереальных цен void ModifyOrders()
{
int B=0,S=0;
double avg_priceBuy=0 , avg_priceSell=0, order_lotsBuy=0, order_lotsSell=0,OpriceBuy =0, OpriceSell=0,avg_price=0;
bool res=true;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true &&
OrderSymbol()==Symbol())// && OrderMagicNumber()==Magic)
if(OrderType()==OP_BUY)
{
OpriceBuy+=OrderOpenPrice()*OrderLots();
order_lotsBuy+=OrderLots();
B++;
}
else if(OrderType()==OP_SELL)
{
OpriceSell+=OrderOpenPrice()*OrderLots();
order_lotsSell+=OrderLots();
S++;
}

}
if(B>1) avg_priceBuy =OpriceBuy/order_lotsBuy;
if(S>1)avg_priceSell =OpriceSell/order_lotsSell ;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true &&
OrderSymbol()==Symbol())//&& OrderMagicNumber()==Magic)
if(OrderType()==OP_BUY) TP=NormalizeDouble(avg_priceBuy +MinTP*Point(),Digits);
if(OrderType()==OP_SELL)TP=NormalizeDouble(avg_priceSell-MinTP*Point(),Digits);
{
if(OrderTakeProfit()!= TP)
res=OrderModify(OrderTicket(),OrderOpenPrice(),0,TP,0,clrAliceBlue);
if(!res)
{
Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
}
else
{
Print("Ордер успешно модифицирован.");
}

}
}
}

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

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

Здравствуйте, коллеги.

Пробую написать Рекавери режим (удвоение лота после убыточной сделки).
Получился вот такой простенький код:

double Lot()
{
double l = 0.1;

for (int i=0; i {
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);

if (OrderProfit() if (OrderProfit() >= 0) l = 0.1;
}

return (l);
}


В данном коде указано: если предыдущий ордер был с минусом - следующий откроется уже с удвоенным лотом,
а если с плюсом либо в ноль - лот следующего ордера будет вновь равен 0.1.
Вопрос в следующем - как можно ограничить кол-во ордеров, лот которых будет умножаться на 2?
К примеру я хочу что бы только три ордера были в "сетке".
Тобишь, что бы после третьего подряд ордера с минусом лот был уже не 0.8 (1й = 0.1, 2й = 0.2, 3й = 0.4, 4й = 0.8), а вновь с начала - 0.1.
Ссылка на сообщение
Поделиться на другие сайты

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

extern int MaxOrders = 3; //внешняя переменная

double Lot()
{
double l = 0.1;
int count = 0;

for (int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderProfit() {
l = OrderLots()*2;
count++;
if(count > MaxOrders) l = 0.1;
}
if(OrderProfit() >= 0) l = 0.1;
}
}
return (l);
}
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


В данном коде указано: если предыдущий ордер был с минусом - следующий откроется уже с удвоенным лотом,
а если с плюсом либо в ноль - лот следующего ордера будет вновь равен 0.1.
Вопрос в следующем - как можно ограничить кол-во ордеров, лот которых будет умножаться на 2?
К примеру я хочу что бы только три ордера были в "сетке".
Тобишь, что бы после третьего подряд ордера с минусом лот был уже не 0.8 (1й = 0.1, 2й = 0.2, 3й = 0.4, 4й = 0.8), а вновь с начала - 0.1.



Здравствуйте! Ваш вариант выбора последнего закрытого ордера из истории абсолютно не правильный. Вот Ваш вариант функции:

int maxMultOrders = 3 ;//максимальное количество ордеров с умножением

double Lot()
{
double l = 0.1;

//гарантированно получим тикет последнего закрытого ордера
int lastCloseOrder=0;
datetime oTime=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
{
if(OrderType()==OP_BUY||OrderType()==OP_SELL)
{
if(OrderCloseTime()>oTime)
{
lastCloseOrder=OrderTicket();
oTime=OrderCloseTime();
}
}
}
}

static int multCount;//сюда будем считать сколько раз подряд мы умножили лот

//а теперь уже выберем нужный нам ордер и проверим значение его профита
if(OrderSelect(lastCloseOrder,SELECT_BY_TICKET))
{

//если ордер был закрыт с убытком
if(OrderProfit() {
//и мы еще не достигли макимально разрешенного кол-ва раз умножения лота
if(multCount {
l=OrderLots()*2;//умножаем лот
multCount++;//считаем кол-во умножений лота
}
//если же мы уже достигли макимально разрешенного кол-ва раз умножения лота
else{
l=0.1;
multCount=1;
}
}
//если последний ордер был закрыт с прибылью
if(OrderProfit()>=0)
{
l = 0.1;
multCount=1;
}
}

return (l);
}




Добавлено: 31-03-2017 20:04:45


Доброго времени суток . У меня проблема с советником.При переключении таймфрейма советник модифицирует профиты до нереальных цен void ModifyOrders()



Похоже функция модификации тут не причем. Скорее всего это связано с переинициализацией советника после смены ТФ. Смотрите что там у Вас в OnInit(); Изменено пользователем DreamWorks
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Sergey Forex, DreamWorks - спасибо вам большое! 8->


Цитата

Ваш вариант выбора последнего закрытого ордера из истории абсолютно не правильный


Мне важно было понять саму суть. А остальное - нюансы.
Поэтому и предоставил максимально сокращённый код. ;)
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте!
Есть такой вопрос: например, есть в настройках булевый параметр включения выставления дополнительного ордера. Как прописать в коде так, что бы при оптимизации в тестере при этом параметре false, тестер не делал лишних прогонов для того, что бы перебрать настраиваемые параметры этого ордера? То есть, если выставление ордера выключено, тестер должен игнорировать параметры из настроек этого самого ордера.
Подскажите, пожалуйста, реально ли так сделать?

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

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

Прошу помочь в доработке индикатора открытых ордеров / профита.
Нужно, чтобы в графах Net lots и Profit по всем открытым валютным парам данные отображались следующими цветами (colors):
в случае = 0, оставить текущий цвет = LightSeaGreen,
в случае > 0, цвет = Lime,
в случае
Заранее благодарю!

iExposure.mq4

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

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

Здравствуйте всем!
Такой вопросик у меня. На базе третьего урока попытался сделать советник, воткнув в него матрицу Genesis из одноименной стратегии.
После компиляции в советнике и индикаторе ошибок нет. В журнале тоже нет никаких подсказок, в чем может быть косяк.
При этом жутко виснет тестер стратегий во время запуска советника, похоже, что где-то делаются лишние расчеты.
Подскажите, где?

Genesis_Matrix_EAMine2.mq4
GenesisMatrix_Mine.mq4

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

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


Здравствуйте!
Есть такой вопрос: например, есть в настройках булевый параметр включения выставления дополнительного ордера. Как прописать в коде так, что бы при оптимизации в тестере при этом параметре false, тестер не делал лишних прогонов для того, что бы перебрать настраиваемые параметры этого ордера? То есть, если выставление ордера выключено, тестер должен игнорировать параметры из настроек этого самого ордера.
Подскажите, пожалуйста, реально ли так сделать?



Здравствуйте! А почему не реально? Зачем что-то в коде прописывать? Уберите эти параметры из оптимизации просто и задайте им значения, которые Вам необходимы (false в Вашем случае). Оставьте только те, которые необходимо оптимизировать. Или я что-то не понял?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, подскажите как повысить стабильность работы советника ,например на 5-и минутках при открытии по средним то открывается , то нет при равных условиях, при закрытии такая же штука , при чем при закрытии случаи не срабатывания происходят чаще, правда при закрытии используется сложное условие , т. е. пересечение средних, но ниже или выше цены открытия на определенное кол-во пунктов.Спасибо.

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

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

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

Закрыть_встречные_позиции.mq4

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

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


Здравствуйте всем!
Такой вопросик у меня. На базе третьего урока попытался сделать советник, воткнув в него матрицу Genesis из одноименной стратегии.
После компиляции в советнике и индикаторе ошибок нет. В журнале тоже нет никаких подсказок, в чем может быть косяк.
При этом жутко виснет тестер стратегий во время запуска советника, похоже, что где-то делаются лишние расчеты.
Подскажите, где?



Здравствуйте! Да у Вас не "вопросик", а ВОПРОСИЩЕ! x_x Если компилятор не выдает ошибок, то дело естественно в логической ошибке. А чтобы кому-то ее найти, надо разобраться и вникнуть в каждую строчку. Потратить на это уйму времени. И ради чего? Научиться программировать это Вам не поможет. Потому что нельзя вот так вот посмотреть три урока, скопировать кусок чужого кода, абсолютно не понимая что там внутри, увидеть что что-то не работает, прибежать на форум, задать подобный вопрос и научиться программировать. НЕЛЬЗЯ. Также нельзя таким образом по-бырому и свой "грааль запилить" (если Вы так торопитесь сделать именно это). А здесь тема по обучению MQL. Чтобы обучаться программированию, смотрите уроки последовательно, делайте домашние задания, читайте документацию по MQL, пишите несложные вещи но СВОИМИ руками и СВОЕЙ головой. Не пользуйтесь чужим кодом, пока не научитесь хорошо его читать. Идите от простого к сложному и все получиться. И если что-то непонятно именно в материале, в документации и т.п., то задавайте ради Бога вопросы в этой ветке. А Вы же пытаетесь из первого класса прыгнуть в одиннадцатый.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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


Здравствуйте! А почему не реально? Зачем что-то в коде прописывать? Уберите эти параметры из оптимизации просто и задайте им значения, которые Вам необходимы (false в Вашем случае). Оставьте только те, которые необходимо оптимизировать. Или я что-то не понял?


Спасибо за ответ )), но, видимо, я неправильно описал проблему ))
Есть параметр Ордер_2 = true, тейк ордера_2 = 50, стоп ордера_2 = 100....
Так вот, при Ордер_2 = true, тестер будет перебирать варианты тейков и стопов этого ордера (и это правильно). Но, он так же будет их перебирать при Ордер_2 = false (а вот этого не надо, ордер то не выставляется...)
Просто выключить это из оптимизации невозможно, так как я заранее не знаю, как отразится на результатах наличие второго ордера или его отстутствие...
Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).
Как-то так )) Изменено пользователем Кетариец
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо за ответ )), но, видимо, я неправильно описал проблему ))
Есть параметр Ордер_2 = true, тейк ордера_2 = 50, стоп ордера_2 = 100....
Так вот, при Ордер_2 = true, тестер будет перебирать варианты тейков и стопов этого ордера (и это правильно). Но, он так же будет их перебирать при Ордер_2 = false (а вот этого не надо, ордер то не выставляется...)
Просто выключить это из оптимизации невозможно, так как я заранее не знаю, как отразится на результатах наличие второго ордера или его отстутствие...
Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).
Как-то так ))


Я бы прописал в коде так:
if(Ордер_2 == true)//задается в настройках
{
проверяем условия для входа
открываем ордер
модифицируем СЛ и ТП и тд
}
То есть, если Ордер_2 == false, то метатрейдер просто пропускает этот кусок кода и идет дальше.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Привет, помоги мне . У меня не открывает ордер, там сложная система с отступами. Я знаю, ты сможешь?.
P.S. Надеюсь ты поймешь что в твоем посте не так)

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

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

Я бы прописал в коде так:
if(Ордер_2 == true)//задается в настройках
{
проверяем условия для входа
открываем ордер
модифицируем СЛ и ТП и тд
}
То есть, если Ордер_2 == false, то метатрейдер просто пропускает этот кусок кода и идет дальше.


Думаю. что там и так что-то такое прописано. Иначе суть параметра Ордер_2 = false/true утрачивает всякий смысл.

Вопрос конечно интересный. Вообще подобные вещи делаются как-то так:
Переменные, которые необходимо оптимизировать по определенным правилам объявляются с модификатором sinput (вместо input или extern). Таким образом вы исключаете их из оптимизации вообще. В тестере для них становится невозможным задавать старт, шаг и стоп. Но есть функция ParameterSetRange(), с помощью которой можно создать правила оптимизации sinput-переменных. Эта функция может вызываться только в обработчике OnTesterInit(). Но проблема в том, что ParameterSetRange() задекларирована в MQL4, но по факту почему-то не работает (((
Вот здесь можете подробней почитать https://docs.mql4.com/ru/basis/variables/inputvariables
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).
Как-то так ))


Ни как, тетстер не знает, что при false нужно пропустить то и то. Только в два этапа прогона: с установленным параметром на Ордер_2 = true и с галками по перебору его TP, SL и т.д. и с выключенным, Ордер_2 = false и без галок по перебору. Предварительно сохранив предыдущие результаты тестирования.
Ссылка на сообщение
Поделиться на другие сайты

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


Но я не нашел в редакторе MT4 такой ф-ии или её нужно писать самому ?



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

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

Если не трудно можете посмотреть что не так :

//Проверяем на закрытие
//-------------------------------------+
// Закрытие продаж
//-------------------------------------+



if((CountSell() > 0 && Bid (CountSell() > 0 && ma82 ma131) ||
// (CountSell() > 0 && open2 > close2 && open1 OrderOpenTime()) ||
(CountSell() > 0 && close1 ma51 &&time1 > OrderOpenTime()) ||
(CountSell() > 0 && Bid hi1 && time1 > OrderOpenTime()))


{
for(int i = OrdersTotal() -1;i >= 0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELL)
if(!OrderClose(OrderTicket(),OrderLots(),Ask,Sleepage,Black))
Print("Ошибка закрытия ордера на продажу");
}
}
}
//------------------------+
// Закрытие покупок
//------------------------+



if((CountBuy() > 0 && Bid >= envup0) ||
(CountBuy() > 0 && ma82 >= ma132 && ma81 // (CountBuy() > 0 && open2 close1 && close1 > (OrderOpenPrice() + CloseDelta * Point) && time1 > OrderOpenTime())||
(CountBuy() > 0 && close1 > NormalizeDouble(OrderOpenPrice() + CloseDelta * Point,Digits) && close1 OrderOpenTime()) ||
(CountBuy() > 0 && Bid > NormalizeDouble(OrderOpenPrice() + CloseDelta * Point,Digits) && Bid OrderOpenTime()))

{
for(int i=OrdersTotal() -1;i >= 0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderMagicNumber() == Magic && OrderType() == OP_BUY)
if(!OrderClose(OrderTicket(),OrderLots(),Bid,Sleepage,Black))
Print("Ошибка закрытия ордера на покупку");
}
}
}
}

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

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

Если не трудно можете посмотреть что не так :



Да все здесь так. В этом куске синтаксических ошибок нет. Но есть куча переменных-черных ящиков, значения которых остались "за кадром". Сказать что-либо внятное по существу вопроса из перового поста невозможно.
Ссылка на сообщение
Поделиться на другие сайты

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

CountSell() и CountBuy() достаточно вызвать один раз и результат использовать в выражении.

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

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


Я бы прописал в коде так:
if(Ордер_2 == true)//задается в настройках
{
проверяем условия для входа
открываем ордер
модифицируем СЛ и ТП и тд
}
То есть, если Ордер_2 == false, то метатрейдер просто пропускает этот кусок кода и идет дальше.


Думаю. что там и так что-то такое прописано. Иначе суть параметра Ордер_2 = false/true утрачивает всякий смысл.

Вопрос конечно интересный. Вообще подобные вещи делаются как-то так:
Переменные, которые необходимо оптимизировать по определенным правилам объявляются с модификатором sinput (вместо input или extern). Таким образом вы исключаете их из оптимизации вообще. В тестере для них становится невозможным задавать старт, шаг и стоп. Но есть функция ParameterSetRange(), с помощью которой можно создать правила оптимизации sinput-переменных. Эта функция может вызываться только в обработчике OnTesterInit(). Но проблема в том, что ParameterSetRange() задекларирована в MQL4, но по факту почему-то не работает (((
Вот здесь можете подробней почитать https://docs.mql4.com/ru/basis/variables/inputvariables


Переменная, объявленная с модификатором sinput, является входным параметром MQL4-программы, значение этого параметра можно изменять при её запуске. Но при этом данная переменная не участвует в процессе оптимизации входных параметров, то есть не производится перебор её значений при поиске наилучшего набора параметров по заданному критерию.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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