Ruslan S. Опубликовано 31 марта, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2017 Господа, подскажите как правильно прописать условие. В тестере хочу посмотреть максимальную просадку, т. к. в результатах она не совсем корректная. Хочу вывести 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. Ссылка на сообщение Поделиться на другие сайты More sharing options...
ILmeT_V Опубликовано 31 марта, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2017 Доброго времени суток . У меня проблема с советником.При переключении таймфрейма советник модифицирует профиты до нереальных цен 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Richie Rich Опубликовано 31 марта, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2017 Здравствуйте, коллеги.Пробую написать Рекавери режим (удвоение лота после убыточной сделки).Получился вот такой простенький код: 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. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sergey Forex Опубликовано 31 марта, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2017 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 31 марта, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 31 марта, 2017 В данном коде указано: если предыдущий ордер был с минусом - следующий откроется уже с удвоенным лотом,а если с плюсом либо в ноль - лот следующего ордера будет вновь равен 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 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Richie Rich Опубликовано 2 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 апреля, 2017 Sergey Forex, DreamWorks - спасибо вам большое! 8-> Цитата Ваш вариант выбора последнего закрытого ордера из истории абсолютно не правильный Мне важно было понять саму суть. А остальное - нюансы. Поэтому и предоставил максимально сокращённый код. ;) 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Кетариец Опубликовано 2 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 2 апреля, 2017 Здравствуйте!Есть такой вопрос: например, есть в настройках булевый параметр включения выставления дополнительного ордера. Как прописать в коде так, что бы при оптимизации в тестере при этом параметре false, тестер не делал лишних прогонов для того, что бы перебрать настраиваемые параметры этого ордера? То есть, если выставление ордера выключено, тестер должен игнорировать параметры из настроек этого самого ордера. Подскажите, пожалуйста, реально ли так сделать? Ссылка на сообщение Поделиться на другие сайты More sharing options...
step-scorp Опубликовано 3 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 3 апреля, 2017 Прошу помочь в доработке индикатора открытых ордеров / профита.Нужно, чтобы в графах Net lots и Profit по всем открытым валютным парам данные отображались следующими цветами (colors):в случае = 0, оставить текущий цвет = LightSeaGreen,в случае > 0, цвет = Lime,в случае Заранее благодарю! iExposure.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vasiliy Pupkin Опубликовано 4 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 4 апреля, 2017 Здравствуйте всем!Такой вопросик у меня. На базе третьего урока попытался сделать советник, воткнув в него матрицу Genesis из одноименной стратегии. После компиляции в советнике и индикаторе ошибок нет. В журнале тоже нет никаких подсказок, в чем может быть косяк.При этом жутко виснет тестер стратегий во время запуска советника, похоже, что где-то делаются лишние расчеты.Подскажите, где? Genesis_Matrix_EAMine2.mq4GenesisMatrix_Mine.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 5 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 апреля, 2017 Здравствуйте!Есть такой вопрос: например, есть в настройках булевый параметр включения выставления дополнительного ордера. Как прописать в коде так, что бы при оптимизации в тестере при этом параметре false, тестер не делал лишних прогонов для того, что бы перебрать настраиваемые параметры этого ордера? То есть, если выставление ордера выключено, тестер должен игнорировать параметры из настроек этого самого ордера. Подскажите, пожалуйста, реально ли так сделать? Здравствуйте! А почему не реально? Зачем что-то в коде прописывать? Уберите эти параметры из оптимизации просто и задайте им значения, которые Вам необходимы (false в Вашем случае). Оставьте только те, которые необходимо оптимизировать. Или я что-то не понял? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 5 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 апреля, 2017 Здравствуйте, подскажите как повысить стабильность работы советника ,например на 5-и минутках при открытии по средним то открывается , то нет при равных условиях, при закрытии такая же штука , при чем при закрытии случаи не срабатывания происходят чаще, правда при закрытии используется сложное условие , т. е. пересечение средних, но ниже или выше цены открытия на определенное кол-во пунктов.Спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Vitaly-rf Опубликовано 5 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 апреля, 2017 Прошу помощи у спецов по mql,пытаюсь сваять функцию по закрытию встречных позиций с положительным профитом и с определённым расстоянием между позициями,ни фига не работает,понимаю что,что-то делаю не так,но вот как правильно сделать не знаю. Закрыть_встречные_позиции.mq4 Изменено 5 апреля, 2017 пользователем Vitaly-rf Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 5 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 апреля, 2017 Здравствуйте всем!Такой вопросик у меня. На базе третьего урока попытался сделать советник, воткнув в него матрицу Genesis из одноименной стратегии. После компиляции в советнике и индикаторе ошибок нет. В журнале тоже нет никаких подсказок, в чем может быть косяк.При этом жутко виснет тестер стратегий во время запуска советника, похоже, что где-то делаются лишние расчеты.Подскажите, где? Здравствуйте! Да у Вас не "вопросик", а ВОПРОСИЩЕ! x_x Если компилятор не выдает ошибок, то дело естественно в логической ошибке. А чтобы кому-то ее найти, надо разобраться и вникнуть в каждую строчку. Потратить на это уйму времени. И ради чего? Научиться программировать это Вам не поможет. Потому что нельзя вот так вот посмотреть три урока, скопировать кусок чужого кода, абсолютно не понимая что там внутри, увидеть что что-то не работает, прибежать на форум, задать подобный вопрос и научиться программировать. НЕЛЬЗЯ. Также нельзя таким образом по-бырому и свой "грааль запилить" (если Вы так торопитесь сделать именно это). А здесь тема по обучению MQL. Чтобы обучаться программированию, смотрите уроки последовательно, делайте домашние задания, читайте документацию по MQL, пишите несложные вещи но СВОИМИ руками и СВОЕЙ головой. Не пользуйтесь чужим кодом, пока не научитесь хорошо его читать. Идите от простого к сложному и все получиться. И если что-то непонятно именно в материале, в документации и т.п., то задавайте ради Бога вопросы в этой ветке. А Вы же пытаетесь из первого класса прыгнуть в одиннадцатый. 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Кетариец Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Здравствуйте! А почему не реально? Зачем что-то в коде прописывать? Уберите эти параметры из оптимизации просто и задайте им значения, которые Вам необходимы (false в Вашем случае). Оставьте только те, которые необходимо оптимизировать. Или я что-то не понял? Спасибо за ответ )), но, видимо, я неправильно описал проблему ))Есть параметр Ордер_2 = true, тейк ордера_2 = 50, стоп ордера_2 = 100.... Так вот, при Ордер_2 = true, тестер будет перебирать варианты тейков и стопов этого ордера (и это правильно). Но, он так же будет их перебирать при Ордер_2 = false (а вот этого не надо, ордер то не выставляется...)Просто выключить это из оптимизации невозможно, так как я заранее не знаю, как отразится на результатах наличие второго ордера или его отстутствие... Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).Как-то так )) Изменено 6 апреля, 2017 пользователем Кетариец Ссылка на сообщение Поделиться на другие сайты More sharing options...
Sergey Forex Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Спасибо за ответ )), но, видимо, я неправильно описал проблему ))Есть параметр Ордер_2 = true, тейк ордера_2 = 50, стоп ордера_2 = 100....Так вот, при Ордер_2 = true, тестер будет перебирать варианты тейков и стопов этого ордера (и это правильно). Но, он так же будет их перебирать при Ордер_2 = false (а вот этого не надо, ордер то не выставляется...)Просто выключить это из оптимизации невозможно, так как я заранее не знаю, как отразится на результатах наличие второго ордера или его отстутствие...Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).Как-то так )) Я бы прописал в коде так:if(Ордер_2 == true)//задается в настройках{ проверяем условия для входа открываем ордер модифицируем СЛ и ТП и тд}То есть, если Ордер_2 == false, то метатрейдер просто пропускает этот кусок кода и идет дальше. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
viktor004 Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Привет, помоги мне . У меня не открывает ордер, там сложная система с отступами. Я знаю, ты сможешь?. P.S. Надеюсь ты поймешь что в твоем посте не так) 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Да просто все делается. Функция StabilityUp() да и все тут. :d 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Я бы прописал в коде так: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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Но я не нашел в редакторе MT4 такой ф-ии или её нужно писать самому ? Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Вот и вопрос, как сделать так, что бы при выключенном Ордер_2, тестер не трогал параметры тейка и стопа этого ордера, что бы не тратить время на их прогоны. При этом Ордер_2 = true или Ордер_2 = false тоже есть в оптимизации (стоит галочка).Как-то так )) Ни как, тетстер не знает, что при false нужно пропустить то и то. Только в два этапа прогона: с установленным параметром на Ордер_2 = true и с галками по перебору его TP, SL и т.д. и с выключенным, Ордер_2 = false и без галок по перебору. Предварительно сохранив предыдущие результаты тестирования. Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Но я не нашел в редакторе MT4 такой ф-ии или её нужно писать самому ? :) Да пошутил я. Такой функции конечно нет в MQL4. Просто постановка вопроса вызывает только желание улыбнуться. Стабильность открытия ордеров, она либо есть, либо нет. Ее невозможно повысить или понизить ))) Если открывается через раз, то проблема только в Вашем кривом коде, который никто в глаза не видел. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Если не трудно можете посмотреть что не так ://Проверяем на закрытие//-------------------------------------+// Закрытие продаж//-------------------------------------+ 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("Ошибка закрытия ордера на покупку"); } } }} Ссылка на сообщение Поделиться на другие сайты More sharing options...
DreamWorks Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Если не трудно можете посмотреть что не так : Да все здесь так. В этом куске синтаксических ошибок нет. Но есть куча переменных-черных ящиков, значения которых остались "за кадром". Сказать что-либо внятное по существу вопроса из перового поста невозможно. Ссылка на сообщение Поделиться на другие сайты More sharing options...
nixxer Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 CountSell() и CountBuy() достаточно вызвать один раз и результат использовать в выражении. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
vitek01 Опубликовано 6 апреля, 2017 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 6 апреля, 2017 Спойлер Я бы прописал в коде так: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-программы, значение этого параметра можно изменять при её запуске. Но при этом данная переменная не участвует в процессе оптимизации входных параметров, то есть не производится перебор её значений при поиске наилучшего набора параметров по заданному критерию. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти