Доброго времени суток, уважаемые!
Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.
Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...
То, что Вы просите отписать - вопрос не решит... принесет убытки: хотя бы на открытии позы и тут же закрытии и т.д. Необходимо нормально написать функцию открытия
ордеров с учетом стопов и тейков... Уточните разрешает ли Ваш брокер выставлять эти ордера при открытии позиции. Конкретнее формулируйте вопрос и подробнее (код) -
здесь телепатов нет...
Доброго времени суток, уважаемые!
Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.
Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...
Ф-ия открытия ордеров с вызовами из ф-ии старт эксперта, например:
// Вызов ф-ии открытия ордеров из ф-ии stаrt эксперта if (здесь условия покупки) { WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт", MagicNumber); } if (продажи) { WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт", MagicNumber); } return(0); // ВЫХОД ИЗ СТАРТ } //+------------------------------------------------------------------+ //| Установка ордера | //+------------------------------------------------------------------+ void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0) { color clr; datetime opentime; int ticket; int error; comment = WindowExpertName() + " " + GetNameTF(Period()) + " " + comment; int msl = MarketInfo(symbol, MODE_STOPLEVEL); clr = CLR_NONE; if (cmd == OP_BUY) { clr = ColorBuy; } else if (cmd == OP_SELL) { clr = ColorSell; } if ((expiration > 0) && (expiration < TimeCurrent())) { expiration = 0; } for (int try = 1; try <= NumberOfTry; try++) { if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) { break; } while (!IsTradeAllowed()) { Sleep(5000); } RefreshRates(); opentime = TimeCurrent(); Print ("Lot_New в ф-ии открытия = ", price); ticket = OrderSend(symbol, cmd, volume, price, SlipPips, stoploss, takeprofit, comment, magic, expiration, clr); if (ticket > 0) { if (UseSound) { PlaySound("ok.wav"); break; } } else { error = GetLastError(); if (error == ERR_TRADE_TIMEOUT) { Sleep(1000*66); if (ExistOrders(symbol, cmd, magic, opentime)) { if (UseSound) { PlaySound("ok.wav"); break; } } } Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try); continue; } Print("Error(", error, ") set order: ", ErrorDescription(error), ", try ", try); Print("Ask=", Ask, " Bid=", Bid, " symbol=", symbol, " volume=", volume, " cmd=", GetNameOP(cmd), " price=", price, " stoploss=", stoploss, " takeprofit=", stoploss, " magic=", magic); if ((error == ERR_COMMON_ERROR) || (error == ERR_ACCOUNT_DISABLED) || (error == ERR_INVALID_ACCOUNT) || (error == ERR_TRADE_DISABLED)) { IsExpertFailed = true; break; } if ((error == ERR_SERVER_BUSY) || (ERR_INVALID_TRADE_VOLUME) || (error == ERR_MARKET_CLOSED)) { Sleep(1000*300); break; } if ((error == ERR_TOO_FREQUENT_REQUESTS) || (error == ERR_TOO_MANY_REQUESTS)) { Sleep(1000*100); } if ((error == ERR_ORDER_LOCKED) || (error == ERR_LONG_POSITIONS_ONLY_ALLOWED) || (error == ERR_TRADE_TOO_MANY_ORDERS)) { break; } if (error == ERR_TRADE_CONTEXT_BUSY) { while (IsTradeContextBusy()) { Sleep(1000*11); } } if (error == ERR_TRADE_EXPIRATION_DENIED ) { expiration = 0; continue; } if ((error != ERR_PRICE_CHANGED) && (error != ERR_REQUOTE)) { Sleep(1000*7.7); } } }
Спасибо за ответ, Роман!
Основные проверки есть, и ордер открывается всегда, когда позволяет ДЦ. ДЦ позволяет открывать сразу с ТП и СЛ, но почему-то в 1 случаи из 100 не ставится ТП.. Я готов к убыткам на открытии ордера, который тут же закроется, если не будет ТП, а вот убытки от не взятия ТП, и ухода в другую степь - куда хуже... Всё же прошу дать ответ, как проверять ордер на наличие ТП > 0 и при ТП = 0, закрывать его немедленно.
Ф-ия открытия ордеров с вызовами из ф-ии старт эксперта, например:
Так Вы же не выставляете ни стопа, ни профита при открытии ордера - чего ж Вы хотите? Все верно.
// Вызов ф-ии открытия ордеров из ф-ии stаrt эксперта if (здесь условия покупки) { WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт", MagicNumber); } if (продажи) { WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт", MagicNumber); } return(0); // ВЫХОД ИЗ СТАРТ } //+------------------------------------------------------------------+ //| Установка ордера | //+------------------------------------------------------------------+ void WmOrderSend(string symbol, int cmd, double volume, double price, double stoploss, double takeprofit, string comment, int magic, datetime expiration = 0) { color clr; datetime opentime; int ticket; int error;
Более того - странно, то, что, по вашим словам, только некоторые ордера без профитов.
ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит
Без профитов должны быть все ордера.
Господа, я ничего не выкладывал из своего кода.. откуда Вы берёте заключения? Робот открывает ордера с ТП каждый раз! ***НО***, по неизвестной мне причине бывает открывает ордер без ТП. (Надеюсь это понятно) Далее просто тупо ждёт, когда закроется ордер, чтобы отработать дальше, а не тут-то было.. Вот в этот момент, когда ордер открыт без ТП и надо ликвидировать сделку...
Сорри - это не Ваш код... моя вина.... Что можно посоветовать навскидку - вставьте проверку на наличие ТП при открытии ордера - если ТП==0 просто не посылать запрос на открытие ордера :
if(TP!=0) OrderSend( ...... );
как-нибудь так. Зачем потом закрывать ордер и терпеть лишние убытки.
Спасибо за ответ, Роман!
Основные проверки есть, и ордер открывается всегда, когда позволяет ДЦ. ДЦ позволяет открывать сразу с ТП и СЛ, но почему-то в 1 случаи из 100 не ставится ТП.. Я готов к убыткам на открытии ордера, который тут же закроется, если не будет ТП, а вот убытки от не взятия ТП, и ухода в другую степь - куда хуже... Всё же прошу дать ответ, как проверять ордер на наличие ТП > 0 и при ТП = 0, закрывать его немедленно.
Ваш вариант. Хотя сам я с подобным "глюком" не сталкивался. У себя в советнике добавьте код после функций открытия ордеров с Вашими
параметрами открытия...
Например:
int ticket = OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,1000,"OrderOpenOne",14774,0,CLR_NONE);// ф-ия открытия - сюда бейте Ваши переменные if (ticket>0) // Если позиция открылась { while(OrderSelect(ticket,SELECT_BY_TICKET)==false) // Если ордер выбран { Sleep(100); } double Order_TP = OrderTakeProfit(); if (Order_TP <= 0) ClosePosBySelect() // если ТП = 0 либо < 0 - закрываем его ф-ей закрытия ордера так, // как эта ф-ия реализована в Вашем эксперте... // у меня это ф-ия ClosePosBySelect(), у Вас название другое... }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток, уважаемые!
Есть вопрос. ТС иногда (по неизвестным мне причинам) открывает позицию "забыв" выставить тейкпрофит. Выяснять, что пошло не так у меня нет никакого желания, просто хочу заставить его закрыть позицию, если она оказалась с ТП = 0.
Подскажите, как это правильно отписать? Ибо код не мой, а сам я не программист, но весь тест робота смазывает этот досадный баг...