Пишу советника, хочу чтобы переводил открытую позицию в безубыток, если цена прошла от цены открытия ордера указанное число пунктов. Перечитал тут все ветки по этой теме, вроде и делаю все, как показано в примерах и в справке, но не работает и все.
Видимо, нет понимания, что Вы пишите. Угадать здесь не получится.
Начните с малого. Разберите хотя бы первую строку, которую приводите. Уже в ней ошибка. Причем это не опечатка, а именно не понимание того, что пишете:
if(OrderSelect(OrderTicket(), SELECT_BY_POS,MODE_TRADES))
Откройте справку по функции OrderSelect() и почитайте, что означает каждый из ее аргументов. Если не поймете, спросите, поставив прямой вопрос о том, что именно не понятно.
Видимо, нет понимания, что Вы пишите. Угадать здесь не получится.
Начните с малого. Разберите хотя бы первую строку, которую приводите. Уже в ней ошибка. Причем это не опечатка, а именно не понимание того, что пишете:
Откройте справку по функции OrderSelect() и почитайте, что означает каждый из ее аргументов. Если не поймете, спросите, поставив прямой вопрос о том, что именно не понятно.
Да, Я только осваиваю язык, поэтому и задаю тут вопросы и не понимаю в чем ошибка в первой строке
Прочитайте справку по функции OrderSelect() и задайте прямой вопрос.
Я пишу в MQL4. Я не понимаю, что там надо писать. Я делаю так, как указано в других советниках или видео. Я писал туда и ticket и OrderTicket() и просто числа -не работает. Причем , что в советнике с видео обучения код такой и ордер модифицируется:
if(CountBuy() == 0 && Ask <= PriceLow) { ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue); if(ticket > 0) { TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); SL = NormalizeDouble(Ask - StopLoss*Point, Digits); if(OrderSelect(ticket, SELECT_BY_TICKET)) if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)) Print("Ошибка модификации ордера на покупку!"); } else Print("Ошибка открытия ордера на покупку!"); }
Я не понимаю, что там надо писать.
Так дело с мертвой точки не сдвинется. Невозможно что-то делать правильно, не понимая, что и как следует делать. Выход только один - разбираться. Если желания разбираться нет, то и писать код самому не стоит. В этом случае обращайтесь во Фриланс.
Так дело с мертвой точки не сдвинется. Невозможно что-то делать правильно, не понимая, что и как следует делать. Выход только один - разбираться. Если желания разбираться нет, то и писать код самому не стоит. В этом случае обращайтесь во Фриланс.
Так я и не спорю, я для этого и задал вопрос, чтобы разобраться. Просто как разбираться?!
Рекомендую не просто воткнуть в код, а разобраться что было не правильно в своём творчестве
extern int NoLoss = 20; //Безубыток (=0 откл) extern int NLstart = 150; //Старт безубытка double Stoplevel; void OnTick() { double OSL,OOP,Sl; int OT,OTicket; Stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); if(NoLoss!=0){ for (int i=0; i<OrdersTotal(); i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { OT = OrderType(); OSL = NormalizeDouble(OrderStopLoss(),Digits); OOP = NormalizeDouble(OrderOpenPrice(),Digits); Sl=OSL; if (OT==OP_BUY) { if ((Bid-OOP)/Point>=NLstart) Sl=NormalizeDouble(OOP+NoLoss*Point,Digits); if ((Sl!=OSL||OSL==0.0) && Sl<=NormalizeDouble(Bid-Stoplevel*Point,Digits)){ OTicket=OrderTicket(); if (!OrderModify(OTicket,OOP,Sl,OrderTakeProfit(),0,DarkGray)) Print("Error OrderModify BUY ",GetLastError());} } if (OT==OP_SELL) { if ((OOP-Ask)/Point>=NLstart) Sl=NormalizeDouble(OOP-NoLoss*Point,Digits); if ((Sl!=OSL||OSL==0.0) && Sl>=NormalizeDouble(Ask+Stoplevel*Point,Digits)){ OTicket=OrderTicket(); if (!OrderModify(OTicket,OOP,Sl,OrderTakeProfit(),0,DarkGray)) Print("Error OrderModify SELL ",GetLastError());} } } } }//OnTick END
for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { if(Bid - OrderOpenPrice()>NormalizeDouble(650*Point,_Digits)) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(1*Point,5),OrderTakeProfit(),0,clrNONE)) Print("Ордер в Б.У. не переведен"); } } } }Вот тут был отличный пример с описанием for, и после этого стало понятно, что куда писать) https://www.mql5.com/ru/forum/100201/page2
- 2008.04.17
- www.mql5.com
Всем спасибо, почитал еще, потом написал так, и все заработало
Чуть поправлю
for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { if((Bid - OrderOpenPrice())/Point > 650) { if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE)) Print("ОШИБКА: Ордер BUY в Б/У не переведен, причина "+GetLastError()); } } } }
1. Получить пункты можно и без Digits знаков после запятой
2. Нормализовать надо всю полученную цену и 1*Point это мало, в итоге закроется с минусом, желательно брать этот кусок равным спреду,
например
если спред 10 то лучше с запасом указать 15 из-за проскальзывания цены во время закрытия чтобы не получить минус вместо БУ
3. Если есть ошибка модификации, то лучше её знать чтобы с ней потом бороться
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Пишу советника, хочу чтобы переводил открытую позицию в безубыток, если цена прошла от цены открытия ордера указанное число пунктов. Перечитал тут все ветки по этой теме, вроде и делаю все, как показано в примерах и в справке, но не работает и все. Выдает только такое предупреждение когда пишу ticket вместо OrderTicket() : possible loss of data due to type conversion sample. Пробовал так:
потом так: