Согласен с dermitay - его ответ более развёрнутый и правильный.
Изменено 19 декабря, 2015 пользователем 0ll
От xbms, 13 апреля, 2013 в Уголок Программиста
Изменено 19 декабря, 2015 пользователем 0ll
Попробовал тут пару Явовских операторов - работают под MQL4, могут иногда облегчить жизнь :)
1) Х = (условие) ? выражение1 : выражение2; условный оператор присваивания, хорошая замена оператору IF, когда надо только присвоить значение переменной, экономит запись и меньше фигурных скобок, которые здорово путают.
2) Цикл с проверкой в конце
do{
...
.... какие то операторы
}while(условие);
полезно, когда цикл должен выполниться по крайней мере 1 раз, не зависимо от условия.
Буду рад, если кому-то пригодится
да-да помню этот чит-код на Яве, иногда без него код становится гораздо тяжелее.
не знал что на mql4 тоже так можно)) спасибо!
я может задам такой глупый вопрос...
а у тебя компилятор не ругается что ты вызываешь процедуру PriceCloseLastPos() без перечисления входных параметров?
если нет - то у тебя при исполнении первой итерации используются значения, которые ты указал в явном виде при описании процедуры в самом заголовке double PriceCloseLastPos(string sy="", int op=-1, int mn=-1), и цикл у тебя не проходит даже первую итерацию, t у тебя вобще не инициализировано.
разве нет?
а вобще поюзай вот эту статейку, работает и на нашем mql4. я лично особо не вижу критической какой-то ошибки в коде. вроде всё корректно.
http://www.metatrader5.com/ru/metaeditor/help/development/debug
Изменено 20 декабря, 2015 пользователем dermitay
Не ругается))
datetime t;
int i;
я вынес,
а вот PriceCloseLastPos(string sy="", int op=-1, int mn=-1) оставил без изменений,
только добавил: if (mn==-1) mn=magic;
Это чистый код Игоря Кима.
Попробовал написать по хитрому для закрытия серии и работает только если больше-равно, а мне надо MathAbs((PriceCloseLastPos()-distPp*Point)>=(Bid+distPp*Point))
Изменено 20 декабря, 2015 пользователем forextime
юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d
юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d
я же ссылку выше кинул
http://www.metatrader5.com/ru/metaeditor/help/development/debug
а вобще если у тебя в условии сравнения работает толкьо при >= а при
я же ссылку выше кинул
Изменено 20 декабря, 2015 пользователем forextime
Может мне тут кто-нибудь объяснить когда тернарный оператор стал явовским как и циклы с постусловием?
Добрый вечер! В пятом уроке простой трейлинг не тестируется. Вроде все правильно прописываю, ошибок не выдает при компилировании. Посмотрите код, плиз.
void OnTick()
{
Trailing ();
maprice = iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
if(CountBuy() + CountSell() == 0 && Ask > maprice)
{
int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
if(ticket Print("Не удалось открыть ордер на покупку!");
}
if(CountBuy() + CountSell() == 0 && Bid {
int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red);
if(ticket Print("Не удалось открыть ордер на продажу!");
}
}
//+------------------------------------------------------------------+
void Trailing()
{
for(int i = 0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if(OrderStopLoss() {
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if(OrderStopLoss() != SL)
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
Print ("Ордер успешно изменился!");
}
}
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
if(OrderOpenPrice()- Ask > TrailingStop*Point)
{
if(OrderStopLoss() {
SL = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if(OrderStopLoss() != SL)
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
Print ("Ордер успешно изменился!");
}
}
}
}
}
}
bool ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);Ну я на Яве программировал и там встречал, а так бог его знает откуда он первоначально пришёл :)
такая же фигня(я про тернарный return), я о нем впервые услышал на Яве, не спорю, он мог придти из того же С или С++.
Пример решения. который когда-то разорвал мне мозг своей простотой:
поиск максимального числа из двух чисел
int max(int a,int b)
{
return (a>b)?a:b;
}
а теперь поехали дальше(из трех и четырех используя ф-цию выше)
int Max3(int a,int b, int c)
{
return max(max(a,b),max(b,c)) ;
}
int Max4(int a,int b, int c, int d)
{
return max(max(a,b),max(c,d));
}
гениально, не правда ли?)) и не надо тебе никаких кучи ифов и т.д.
ЗЫ: в официальной документации mql4 в примерах используется перегрузка метода, что новичку не сразу станет понятно почему так оно работает.
Изменено 20 декабря, 2015 пользователем dermitay
Всем большое спасибо за помощь, буду искать ошибку в трейлинге, он не срабатывает.
Подскажите пожалуйста, функция времени, которая в 5-ом уроке описывается, при компилировании выдает предупреждение:
if(timeprev == Time[0]) return(0);
timeprev = Time[0];
Что здесь можно изменить??
Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?
Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?
Изменено 20 декабря, 2015 пользователем dermitay
Спасибо за ответ, понял из него что дело в рынке которого на сей момент нет. С остальным ща буду гуглить
Это в тестере или на демке? Про что выходной помните? :)
если у тебя точки останова в OnTick'e то конечно же дебагер даже не дойдет до них - рынок-то закрыт. модификации ордеров конечно же тоже не будет.
дело не в выходных а в понимании того как работает фундаментально код. можно писать так, чтобы вобще никакой зависимости от тиков брокера не было.
кстати, дебагер работает и на истории котировок, типа эмулируя тестер стратегий.
Изменено 20 декабря, 2015 пользователем dermitay
forextime, так в чем была ошибка/некорректность?
Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что.
Изменено 22 декабря, 2015 пользователем forextime
Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.
Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA
Если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем