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

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

#2901
htp87 у Вас в коде нет перебора ордеров. из-за ошибки здесь: for(int i = 0; ii--). измените на ++

Согласен с dermitay - его ответ более развёрнутый и правильный.

Изменено 19 декабря, 2015 пользователем 0ll

#2902

Попробовал тут пару Явовских операторов - работают под MQL4, могут иногда облегчить жизнь :)

1) Х = (условие) ? выражение1 : выражение2; условный оператор присваивания, хорошая замена оператору IF, когда надо только присвоить значение переменной, экономит запись и меньше фигурных скобок, которые здорово путают.

2) Цикл с проверкой в конце
do{
...
.... какие то операторы
}while(условие);
полезно, когда цикл должен выполниться по крайней мере 1 раз, не зависимо от условия.



Буду рад, если кому-то пригодится

#2903

думаю лучше пользоваться официальной документацией...
?: и do-while

#2904

да-да помню этот чит-код на Яве, иногда без него код становится гораздо тяжелее.
не знал что на mql4 тоже так можно)) спасибо!

#2905

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

#2906

Не ругается))
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

#2907

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

#2908


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



Круто, а это как?? стесняюсь спросить))
#2909

я же ссылку выше кинул
http://www.metatrader5.com/ru/metaeditor/help/development/debug

а вобще если у тебя в условии сравнения работает толкьо при >= а при

#2910


я же ссылку выше кинул


Спасибо, поюзаю.


Добавлено: 20-12-2015 16:19:16

Хм, точка остановки на нужном месте, процесс запускаю, окно графика запускается и далее ни чего не происходит, график не движется.

Изменено 20 декабря, 2015 пользователем forextime

#2911

Может мне тут кто-нибудь объяснить когда тернарный оператор стал явовским как и циклы с постусловием?

#2912


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

}



OrderModify() возвращает значение типа bool.
Т.е
bool ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
#2913

Ну я на Яве программировал и там встречал, а так бог его знает откуда он первоначально пришёл :)

#2914

такая же фигня(я про тернарный 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

#2915

Всем большое спасибо за помощь, буду искать ошибку в трейлинге, он не срабатывает.
Подскажите пожалуйста, функция времени, которая в 5-ом уроке описывается, при компилировании выдает предупреждение:
if(timeprev == Time[0]) return(0);
timeprev = Time[0];

Что здесь можно изменить??

#2916

Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?

#2917


Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?



ты сам ответил на свой вопрос. пока рынок закрыт OnTick() не производит ни единую итерацию.
Либо если ты хочешь проверить тупо эту функцию - юзай ее в OnCalculate индикатора или в OnInit() совы или вобще в скрипте(не помню какой там блок выполняется всегда.)
гугли связку EventSetSecondTimer и OnTimer() чтобы вобще зыбыть о тиках и не зависеть то рынка.

Comment("я на графике");
Print("я в логах ");

Изменено 20 декабря, 2015 пользователем dermitay

#2918

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

#2919


Это в тестере или на демке? Про что выходной помните? :)



1-ый раз с этим столкнулся, отладка в выходные не работает что ли?
Что значит "Это в тестере или на демке?"
Работает MT4, MetaEditor там отладка, точки расставлены процесс запущен. Как по другому?
#2920

если у тебя точки останова в OnTick'e то конечно же дебагер даже не дойдет до них - рынок-то закрыт. модификации ордеров конечно же тоже не будет.

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

кстати, дебагер работает и на истории котировок, типа эмулируя тестер стратегий.

Изменено 20 декабря, 2015 пользователем dermitay

#2921
ВОПРОС РЕШЁН

ТЕМА ЗАКРЫТА

В АРХИВ или КОРЗИНУ
#2922
forextime, так в чем была ошибка/некорректность?
Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что.
#2923


forextime, так в чем была ошибка/некорректность?
Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что.



Действительно. Ok))
Посмотрел в сети разного типа коды и пришёл к выводу что в условие кода Игоря Кима почему то нет ==true
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) ==true) {
Добавил и вроде цена закрытия стала определяться корректно.
Логику дистанции я додумал с помощью листочка, ручки и линейки: на листочке отметил точку закрытия, на линейке отметил текущую цену + дистанция, ну и пришёл к выводу что PriceClose - dist для селл и PriceClose + dist для бай, а Ask и Bid в свободном полёте. Без помощи воображения так бы и не понял, что больше чего должно быть))
Добавил эти условия и всё стало в порядке:
MathAbs(PriceCloseLastPos(Symbol(),-1,magic)-distPpS*PointBid) // для селл ордеров (серия закрывается до значения дистанции, если превышает значение, то закрытия нет)
MathAbs(PriceCloseLastPos(Symbol(),-1,magic)+distPpB*Point>=Ask) // для бай ордеров (серия закрывается до значения дистанции, если превышает значение, то закрытия нет)
Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.
Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA

Изменено 22 декабря, 2015 пользователем forextime

#2924


Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.
Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA



OrderSelect() в режиме MODE_HISTORY "видит" только те ордера, которые ему показывает терминал. Если ты в терминале выставил историю только на "сегодня", то вчерашний ордер у тебя просто тупо не будет показываться и соответственно не будет видеться совой.

если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки.
#2925


Если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки.


В терминале настройки я могу поставить значения только на максимальные бары в истории или максимальные бары в окне. Или есть ещё какой то способ указать всю историю?

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

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