[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 346
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Зачем спрашивать совета, а потом еще его и оспаривать ? Это что , мейнстрим такой ?
я думаю , что дальнейшие прения бесполезны. я все подробно объяснил по шагам. продолжайте делать как делали.
Да какие здесь могут быть прения? Закрывать нужно ордер с максимальным отклонением по цене. А значит нас интересует цена... т.е. нужно найти крайний отложенник (с максимальной или минимальной ценой открытия). Если Вы не согласны, то могли бы аргументировать. Иначе я всё-таки прав! Я же чётко понимаю что говорю.
Код удаляет ST и TP. добавляю условие на выборочное удаление
Что не правильно написан? Продолжает удалять все:(
#property show_inputs
extern bool StopLoss = True; // Удалить только StopLoss
extern bool TakeProfit = True; // Удалить только TakeProfit
extern bool ALL = True; // Удалить все
void start()
{
bool fm;
int i;
double SL=OrderStopLoss();
double TP=OrderTakeProfit();
if (StopLoss) SL=0;
if (TakeProfit) TP=0;
if (ALL) {SL=0; TP=0;}
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
}
}
}
}
Или другого решения нет и придется прописывать код удаления для каждого условия?
#property show_inputs
#include <WinUser32.mqh>
extern bool StopLoss = False; // Удалить только StopLoss
extern bool TakeProfit = False; // Удалить только TakeProfit
extern bool ALL = False; // Удалить все
void start()
{
bool fm;
int i;
if (StopLoss)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
}
}
}
return(0);
}
if (TakeProfit)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
}
}
}
return(0);
}
if (ALL)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
}
}
}
return(0);
}
}
Вадим, зачем создавать объект заново, если можно воспользоваться функцией ObjectSet() ?
В том случае была функция, где полностью создавался и настраивался графический объект. В ней функция создания оптимизирована. Если объект уже есть, то он не создаётся. Сами проверте. Засеките время на создание объектов, потом на изменение свойств. Второй вызов будет существенно более коротким. Т.е. ничего не пересоздаётся.
В результате у нас есть универсальная функция, которая не только создаст объект, но ещё может настроить его заменой свойств объекта без особых временных затрат.
Я написал функцию, которая будет удалять отложки на продажу с самыми низкими ценами. Количество шортовых отложек для закрытия равно количеству отложек на покупкукоторые сработали т.е. перешли в рыночные ордера.
Получается, что если сработала одна отложка в бай, значит закроем одну отложку в селл, если сработало 2 отложки в бай, то закроем 2 отложки в селл.
Вот код:
amountOfCurrPending - количество отложенных ордеров баевых.
level - количество изначально посылаемых отложенных ордеров в кажду. сторону.
OOP - цена открытия отложки, взял любое недосягаемое значение.
Условие у нас такое, что если счётчик меньше ordersToDelete то удаляем отложку с самой низкой ценой. Но удаляются все отложки шортовые. Что у меня не так?
Я написал функцию, которая будет удалять отложки на продажу с самыми низкими ценами. Количество шортовых отложек для закрытия равно количеству отложек на покупкукоторые сработали т.е. перешли в рыночные ордера.
Получается, что если сработала одна отложка в бай, значит закроем одну отложку в селл, если сработало 2 отложки в бай, то закроем 2 отложки в селл.
Вот код:
amountOfCurrPending - количество отложенных ордеров баевых.
level - количество изначально посылаемых отложенных ордеров в кажду. сторону.
OOP - цена открытия отложки, взял любое недосягаемое значение.
Условие у нас такое, что если счётчик меньше ordersToDelete то удаляем отложку с самой низкой ценой. Но удаляются все отложки шортовые. Что у меня не так?
И всё. Или у вас пачка ордеров на одной цене висит?
И всё. Или у вас пачка ордеров на одной цене висит?
Нет, ордера с шагом..
Я вот вообще не пойму вашей логики... Почему не сделать: ордер преобразовался в рыночную позицию - удалили самую дальнюю противоположную отложку.
Так я и удаляю самую дальнюю позиции т.е. раз это шортовая позиция, значит позиция с самой низкой ценой открытия. Вот переписал функцию, тут должно быть всё понятно. Принты убрал, и убрал лишнюю переменную.
Ведь переменная amountOfCurrPending как раз и передаёт количество оставшихся отложек в бай. Т.е. если всего изначально количество level, а amountOfCurrPending текущее количество отложек, то вычитая изначальное количество отложек от текущего, получится разница, а это и есть количество требуемое для удаления шортов. Понимаете?
Нет, ордера с шагом..
Так я и удаляю самую дальнюю позиции т.е. раз это шортовая позиция, значит позиция с самой низкой ценой открытия. Вот переписал функцию, тут должно быть всё понятно. Принты убрал, и убрал лишнюю переменную.
Ведь переменная amountOfCurrPending как раз и передаёт количество оставшихся отложек в бай. Т.е. если всего изначально количество level, а amountOfCurrPending текущее количество отложек, то вычитая изначальное количество отложек от текущего, получится разница, а это и есть количество требуемое для удаления шортов. Понимаете?
Ищется ордер, с минимальной ценой открытия
Я б записал в комментарий отложки его порядковый номер в сетке и в соответствующем ему противоположном отложенном прописал тот же номер. Тогда по нахождению рыночной позиции, прочитав номер в её комментарии, без проблем ищется соответствующая противоположная отложка по идентичному номеру в её комментарии. Раз магики используете для другого.
ЗЫ. Код ваш пока некогда читать/разбирать
Я б записал в комментарий отложки его порядковый номер в сетке и в соответствующем ему противоположном отложенном прописал тот же номер. Тогда по нахождению рыночной позиции, прочитав номер в её комментарии, без проблем ищется соответствующая противоположная отложка по идентичному номеру в её комментарии. Раз магики используете для другого.
ЗЫ. Код ваш пока некогда читать/разбирать
Хм. Да, без проблем ищется соответствующая отложка таким образом, если количество отложек в каждом направлении одинаковое. А если разное, тогда такой вариант не прокатит как я понимаю.