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

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

#4301

Господа, подскажите как правильно прописать условие. В тестере хочу посмотреть максимальную просадку, т. к. в результатах она не совсем корректная. Хочу вывести 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. Спасибо, вопрос снят. Самостоятельно нашел решение :)

Изменено 31 марта, 2017 пользователем Ruslan S.

#4302

Доброго времени суток . У меня проблема с советником.При переключении таймфрейма советник модифицирует профиты до нереальных цен 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("Ордер успешно модифицирован.");
}

}
}
}

Изменено 31 марта, 2017 пользователем ILmeT_V

#4303

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

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

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.
#4304
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);
}
#4305


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

Изменено 31 марта, 2017 пользователем DreamWorks

#4306
Sergey Forex, DreamWorks - спасибо вам большое! 8->


Цитата

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


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

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

#4308

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

iExposure.mq45 скач.

#4309

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

Genesis_Matrix_EAMine2.mq45 скач.
GenesisMatrix_Mine.mq44 скач.

#4310


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



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

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

#4312

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

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

Изменено 5 апреля, 2017 пользователем Vitaly-rf

#4313


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



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


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


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

Изменено 6 апреля, 2017 пользователем Кетариец

#4315

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


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

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

#4317

Да просто все делается. Функция StabilityUp() да и все тут. :d

#4318

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


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

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

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

#4320

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


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


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



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

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

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



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("Ошибка закрытия ордера на покупку");
}
}
}
}

#4323

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



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

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

#4325
Спойлер


Я бы прописал в коде так:
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-программы, значение этого параметра можно изменять при её запуске. Но при этом данная переменная не участвует в процессе оптимизации входных параметров, то есть не производится перебор её значений при поиске наилучшего набора параметров по заданному критерию.

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

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