Если открыто 2 позиции и сумма по эквити положительная (это может возникнуть только при срабатывания ордера SELL_STOP) то присваиваем этому событию логическое значение
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Владимир. Что то у меня не получается. При срабатывании SELL_STOP ордеров - всё в порядке. Закрывается только одна позиция, у которой профит больше,
а вот при срабатывании SELL_LIMIT закрытие происходит неправильно, не по сумме профита всех открытых позиций, а похоже закрывается позиция, у которой профит больше.
У меня до этого была схожая ошибка. Сейчас уже начинаю думать, что возможно это у меня какой то косяк, может я как то не так считаю позы и открываю их.
Посмотрите пожалуйста мой готовый к проверке кусок кода, может увидите ошибку. Но возможно и в Вашем коде несоответствие условиям. Или я их как то не так объяснил.., что такое для меня усреднённый профит.
Я сейчас начал разбираться с алгоритмом и понял, что он несколько сложнее в последствиях чем я сказал Вам ранее.
Третье условие закрытия позиции по собственному SL возможно приводит к ошибкам в алгоритме первых двух первых условий.
Я ещё раз опишу полный алгоритм закрытия позиций только для случая SELL_LIMIT, так как случай SEL_STOP выполняется как надо. Оставим его пока.
1. У нас изначально есть одна открытая позиция SELL у неё установлен свой SL но он стоит выше чем SELL_LIMIT, а это значит что SL не сработает раньше, чем SELL_LIMIT.
2. Сработал SELL_LIMIT и появилась вторая позицияSELL со своим SL, который так же не сможет сработать раньше чем очередной SELL_LIMIT
3. Если ордер SELL_LIMIT сработал, то устанавливается новый ордер SELL_LIMIT. (всегда)
4. Количество открытых позиций SELL может быть 1-3 и больше, всё зависит от того, как далеко стоят их SL. Рассмотрим случай если их максимум три. (я могу это ограничить SL)
Теперь сценарии закрытия позиций.
Если открытых поз. 2, то возможны только два сценария закрытия одной или всех позиций
1. По Эквити, если он больше баланса на 15 (закрываются все позиции), (m_account.Equity()>= m_account.Balance()+15) Я это имел ввиду закрыть несколько поз. по усреднению.
2. По собственному SL (закрывается одна позиция).
3. Оставшаяся одна позиция, теперь должна быть очищена от условий закрытия если они были заданы ранее, так как мы не знаем какое условие к ней применить.
Она может повторить сценарий SELL_LIMIT или же спуститься к SEL_STOP и пойти по другому условию закрытия. (обнуляем для неё условия)
4. Если позиций было три, то так же закрываем их (m_account.Equity()>= m_account.Balance()+15) или у одной из них сработает SL и останется две позиции.
Применяем это правило, до тех пор пока не останется одна позиция, у которой условия закрытия не определены...
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Владимир. Что то у меня не получается. При срабатывании SELL_STOP ордеров - всё в порядке. Закрывается только одна позиция, у которой профит больше,
а вот при срабатывании SELL_LIMIT закрытие происходит неправильно, не по сумме профита всех открытых позиций, а похоже закрывается позиция, у которой профит больше.
У меня до этого была схожая ошибка. Сейчас уже начинаю думать, что возможно это у меня какой то косяк, может я как то не так считаю позы и открываю их.
Посмотрите пожалуйста мой готовый к проверке кусок кода, может увидите ошибку. Но возможно и в Вашем коде несоответствие условиям. Или я их как то не так объяснил.., что такое для меня усреднённый профит.
Вообще без разницы какой отложенный ордер сработал - ведь в итоге получаем позицию и далее считаем прибыль позиции.
Вообще без разницы какой отложенный ордер сработал - ведь в итоге получаем позицию и далее считаем прибыль позиции
Да без разницы. У меня возникло подозрение в разнице, потому что я при выставлении ордеров и позиций присваивал им "коменты" для позиций свои, для ордеров свои. В результате когда ордер переходит в позицию он наследует коментарий ордера.
Потом при проверке позиций через комментарии возникла путаница... комментарии то у них разные получились. Ну это я поправил.
У Вас в коде, я вообще не нашёл или не понял, как закрываются позиции для условия сработал SELL_LIMIT. по Эквити.
if(total==2)
{
//-------------------------------------------------------- conditon 1ulong tmp_ticket=ULONG_MAX;
double tmp_profit=DBL_MIN;
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
{
double profit=m_position.Commission()+m_position.Swap()+m_position.Profit();
if(profit>tmp_profit)
{
tmp_profit=profit;
tmp_ticket=m_position.Ticket();
}
}
//---if(tmp_ticket!=ULONG_MAX)
m_need_close_ticket=tmp_ticket;
}
else
{
if(total==2)
{
//--------------------------------------------------------- conditon 2double profit=0;
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i)) // selects the position by index for further access to its propertiesif(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();
//--------if(profit>=InpProfitTarget)
m_need_close_all=true;
}
}
Вроде бы выполнено проверка на возможность закрытие всех позиций и установлен по ней флаг
Да без разницы. У меня возникло подозрение в разнице, потому что я при выставлении ордеров и позиций присваивал им "коменты" для позиций свои, для ордеров свои. В результате когда ордер переходит в позицию он наследует коментарий ордера.
Потом при проверке позиций через комментарии возникла путаница... комментарии то у них разные получились. Ну это я поправил.
У Вас в коде, я вообще не нашёл или не понял, как закрываются позиции для условия сработал SELL_LIMIT. по Эквити.
Вроде бы выполнено проверка на возможность закрытие всех позиций и установлен по ней флаг
но в блоке CloseAllPositions();
отсутствует что то типа.
По которому нужно закрыть все позиции для случая - сработал сработал SELL_LIMIT
Возможно у Вас это же m_account.Equity()>= m_account.Balance()+15 реализовано как то иначе?
Или оно у Вас действительно не выполняется? Быть может из-за того что я не так объяснил что такое усреднение в моём понимании.
Я уже выше обратил Ваше внимание -отложенные ордера вообще не причём. Не может быть у отложенного ордера прибыль. От слова "совсем". Пока это не проясните, дальше двигаться нельзя.
Добавлено: я показал пример решения для двух случаев:
Имеем всего две позиции - значит ищет ту, у которой прибыль больше и её закрываем.
Имеем более двух позиций - если их суммарная прибыль больше заданной - закрываем все позиции.
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Я уже выше обратил Ваше внимание -отложенные ордера вообще не причём. Не может быть у отложенного ордера прибыль. От слова "совсем". Пока это не проясните, дальше двигаться нельзя
Владимир. Ну конечно у отложенного ордера не может быть прибыли. Речь о прибыли конечно об открытых позициях.
Только есть разница в том как были открыты эти позиции. Метод закрытия для них нам нужен разный.
Если вторая позиция открылась от отл. ордера SELL_STOP, то одна из них должна быть закрыта, та у которой профит позиции больше. Это у Вас получилось и работает.
Если вторая позиция открылась от отл. ордера SELL_LIMIT, то они обе должны быть закрыты по Эквити (m_account.Equity()>= m_account.Balance()+15) Если SL одной из них не сработает раньше.
Добавлено.
я показал пример решения для двух случаев:
Имеем всего две позиции - значит ищет ту, у которой прибыль больше и её закрываем.
Имеем более двух позиций - если их суммарная прибыль больше заданной - закрываем все позиции
Вроде бы всё нормально по второму условию. Но почему то у меня у меня на втором условии открывает вторую позицию и закрывает её сразу близко к 0 -1,2.
Быть может я не там указываю суммарную прибыль?
InpProfitTarget = 15; Если здесь, то это не срабатывает.
Владимир. Ну конечно у отложенного ордера не может быть прибыли. Речь о прибыли конечно об открытых позициях.
Только есть разница в том как были открыты эти позиции. Метод закрытия для них нам нужен разный.
Если вторая позиция открылась от отл. ордера SELL_STOP, то одна из них должна быть закрыта, та у которой профит позиции больше. Это у Вас получилось и работает.
Если вторая позиция открылась от отл. ордера SELL_LIMIT, то они обе должны быть закрыты по Эквити (m_account.Equity()>= m_account.Balance()+15) Если SL одной из них не сработает раньше.
Извините:
я показал пример решения для двух случаев:
Имеем всего две позиции - значит ищет ту, у которой прибыль больше и её закрываем.
Имеем более двух позиций - если их суммарная прибыль больше заданной - закрываем все позиции.
Добрый вечер,ребята, чтоб не плодить темы - вопрос такой - выставлен скриптом отложенный стоп-ордер с вполне определенным тейком и стопом, он не исполняется, а в комментах прописывается [illiquidity] - как бороться - зациклить скрипт до исполнения,установить бОльшее проскальзывание, или прописать количество повторных запросов или что ? Или ткните носом тему где рыть.
neitrino22: Добрый вечер,ребята, чтоб не плодить темы - вопрос такой - выставлен скриптом отложенный стоп-ордер с вполне определенным тейком и стопом, он не исполняется, а в комментах прописывается [illiquidity] - как бороться - зациклить скрипт до исполнения,установить бОльшее проскальзывание, или прописать количество повторных запросов или что ? Или ткните носом тему где рыть.
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вот полный код для двух условий:
Спасибо Владимир. попытаюсь разобраться.
Я пытался решить это по своему, я понимаю как можно развести два этих условия.
Например.
Объявим три логические переменные.
Поз_1;
Поз_2_Clos_1;
Поз_2_Clos_All;
1. Проводим проверку на количество открытых позиций.
Если у нас открыта только 1 позиция SELL присваиваем значение:
Поз_1=true; Поз_2_Clos_1=false; Поз_2_Clos_All=false;
Если открыто 2 позиции и сумма по эквити положительная (это может возникнуть только при срабатывания ордера SELL_STOP) то присваиваем этому событию логическое значение
Поз_1=false; Поз_2_Clos_1=true; Поз_2_Clos_All=false;
Если открыто 2 позиции и сумма по эквити отрицательная (это может возникнуть только при срабатывания ордера SELL_LIMIT) то
Поз_1=false; Поз_2_Clos_1=false; Поз_2_Clos_All=true;
Вот вроде бы и всё... Можно запускать проверку на логические переменные и назначать им свой метод закрытия, но у меня почему то это не сработало...
Программист то я пока никудышный, возможно где то ошибся...
Спасибо за помощь)
Vladimir Karputov:
Владимир. Что то у меня не получается. При срабатывании SELL_STOP ордеров - всё в порядке. Закрывается только одна позиция, у которой профит больше,
а вот при срабатывании SELL_LIMIT закрытие происходит неправильно, не по сумме профита всех открытых позиций, а похоже закрывается позиция, у которой профит больше.
У меня до этого была схожая ошибка. Сейчас уже начинаю думать, что возможно это у меня какой то косяк, может я как то не так считаю позы и открываю их.
Посмотрите пожалуйста мой готовый к проверке кусок кода, может увидите ошибку. Но возможно и в Вашем коде несоответствие условиям. Или я их как то не так объяснил.., что такое для меня усреднённый профит.
Я сейчас начал разбираться с алгоритмом и понял, что он несколько сложнее в последствиях чем я сказал Вам ранее.
Третье условие закрытия позиции по собственному SL возможно приводит к ошибкам в алгоритме первых двух первых условий.
Я ещё раз опишу полный алгоритм закрытия позиций только для случая SELL_LIMIT, так как случай SEL_STOP выполняется как надо. Оставим его пока.
1. У нас изначально есть одна открытая позиция SELL у неё установлен свой SL но он стоит выше чем SELL_LIMIT, а это значит что SL не сработает раньше, чем SELL_LIMIT.
2. Сработал SELL_LIMIT и появилась вторая позиция SELL со своим SL, который так же не сможет сработать раньше чем очередной SELL_LIMIT
3. Если ордер SELL_LIMIT сработал, то устанавливается новый ордер SELL_LIMIT. (всегда)
4. Количество открытых позиций SELL может быть 1-3 и больше, всё зависит от того, как далеко стоят их SL. Рассмотрим случай если их максимум три. (я могу это ограничить SL)
Теперь сценарии закрытия позиций.
Если открытых поз. 2, то возможны только два сценария закрытия одной или всех позиций
1. По Эквити, если он больше баланса на 15 (закрываются все позиции), (m_account.Equity()>= m_account.Balance()+15) Я это имел ввиду закрыть несколько поз. по усреднению.
2. По собственному SL (закрывается одна позиция).
3. Оставшаяся одна позиция, теперь должна быть очищена от условий закрытия если они были заданы ранее, так как мы не знаем какое условие к ней применить.
Она может повторить сценарий SELL_LIMIT или же спуститься к SEL_STOP и пойти по другому условию закрытия. (обнуляем для неё условия)
4. Если позиций было три, то так же закрываем их (m_account.Equity()>= m_account.Balance()+15) или у одной из них сработает SL и останется две позиции.
Применяем это правило, до тех пор пока не останется одна позиция, у которой условия закрытия не определены...
Vladimir Karputov:
Владимир. Что то у меня не получается. При срабатывании SELL_STOP ордеров - всё в порядке. Закрывается только одна позиция, у которой профит больше,
а вот при срабатывании SELL_LIMIT закрытие происходит неправильно, не по сумме профита всех открытых позиций, а похоже закрывается позиция, у которой профит больше.
У меня до этого была схожая ошибка. Сейчас уже начинаю думать, что возможно это у меня какой то косяк, может я как то не так считаю позы и открываю их.
Посмотрите пожалуйста мой готовый к проверке кусок кода, может увидите ошибку. Но возможно и в Вашем коде несоответствие условиям. Или я их как то не так объяснил.., что такое для меня усреднённый профит.
Вообще без разницы какой отложенный ордер сработал - ведь в итоге получаем позицию и далее считаем прибыль позиции.
Вообще без разницы какой отложенный ордер сработал - ведь в итоге получаем позицию и далее считаем прибыль позиции
Да без разницы. У меня возникло подозрение в разнице, потому что я при выставлении ордеров и позиций присваивал им "коменты" для позиций свои, для ордеров свои. В результате когда ордер переходит в позицию он наследует коментарий ордера.
Потом при проверке позиций через комментарии возникла путаница... комментарии то у них разные получились. Ну это я поправил.
У Вас в коде, я вообще не нашёл или не понял, как закрываются позиции для условия сработал SELL_LIMIT. по Эквити.
Вроде бы выполнено проверка на возможность закрытие всех позиций и установлен по ней флаг
но в блоке CloseAllPositions();
отсутствует что то типа.
По которому нужно закрыть все позиции для случая - сработал сработал SELL_LIMIT
Возможно у Вас это же m_account.Equity()>= m_account.Balance()+15 реализовано как то иначе?
Или оно у Вас действительно не выполняется? Быть может из-за того что я не так объяснил что такое усреднение в моём понимании.
Да без разницы. У меня возникло подозрение в разнице, потому что я при выставлении ордеров и позиций присваивал им "коменты" для позиций свои, для ордеров свои. В результате когда ордер переходит в позицию он наследует коментарий ордера.
Потом при проверке позиций через комментарии возникла путаница... комментарии то у них разные получились. Ну это я поправил.
У Вас в коде, я вообще не нашёл или не понял, как закрываются позиции для условия сработал SELL_LIMIT. по Эквити.
Вроде бы выполнено проверка на возможность закрытие всех позиций и установлен по ней флаг
но в блоке CloseAllPositions();
отсутствует что то типа.
По которому нужно закрыть все позиции для случая - сработал сработал SELL_LIMIT
Возможно у Вас это же m_account.Equity()>= m_account.Balance()+15 реализовано как то иначе?
Или оно у Вас действительно не выполняется? Быть может из-за того что я не так объяснил что такое усреднение в моём понимании.
Я уже выше обратил Ваше внимание - отложенные ордера вообще не причём. Не может быть у отложенного ордера прибыль. От слова "совсем". Пока это не проясните, дальше двигаться нельзя.
Добавлено: я показал пример решения для двух случаев:
Я уже выше обратил Ваше внимание - отложенные ордера вообще не причём. Не может быть у отложенного ордера прибыль. От слова "совсем". Пока это не проясните, дальше двигаться нельзя
Владимир. Ну конечно у отложенного ордера не может быть прибыли. Речь о прибыли конечно об открытых позициях.
Только есть разница в том как были открыты эти позиции. Метод закрытия для них нам нужен разный.
Если вторая позиция открылась от отл. ордера SELL_STOP, то одна из них должна быть закрыта, та у которой профит позиции больше. Это у Вас получилось и работает.
Если вторая позиция открылась от отл. ордера SELL_LIMIT, то они обе должны быть закрыты по Эквити (m_account.Equity()>= m_account.Balance()+15) Если SL одной из них не сработает раньше.
Добавлено.
я показал пример решения для двух случаев:
Вроде бы всё нормально по второму условию. Но почему то у меня у меня на втором условии открывает вторую позицию и закрывает её сразу близко к 0 -1,2.
Быть может я не там указываю суммарную прибыль?
InpProfitTarget = 15; Если здесь, то это не срабатывает.
Владимир. Ну конечно у отложенного ордера не может быть прибыли. Речь о прибыли конечно об открытых позициях.
Только есть разница в том как были открыты эти позиции. Метод закрытия для них нам нужен разный.
Если вторая позиция открылась от отл. ордера SELL_STOP, то одна из них должна быть закрыта, та у которой профит позиции больше. Это у Вас получилось и работает.
Если вторая позиция открылась от отл. ордера SELL_LIMIT, то они обе должны быть закрыты по Эквити (m_account.Equity()>= m_account.Balance()+15) Если SL одной из них не сработает раньше.
Извините:
я показал пример решения для двух случаев:
Дальше пожалуйста сами хоть что то сделайте.
Извините:
я показал пример решения для двух случаев:
Дальше пожалуйста сами хоть что то сделайте.
Спасибо за помощь Владимир, я пытаюсь.
2.Имеем более двух позиций - если их суммарная прибыль больше заданной - закрываем все позиции.
Но мне было нужно не это, а двух и более позиций, где вторая из них была открыта через срабатывание SELL_LIMIT.
Всё равно спасибо за терпение и труд. Решу я конечно, как нибудь по своему, помучаюсь и решу)))
Добрый вечер,ребята, чтоб не плодить темы - вопрос такой - выставлен скриптом отложенный стоп-ордер с вполне определенным тейком и стопом, он не исполняется, а в комментах прописывается [illiquidity] - как бороться - зациклить скрипт до исполнения,установить бОльшее проскальзывание, или прописать количество повторных запросов или что ? Или ткните носом тему где рыть.
Рыть надо всегда в документации
ORDER_TIME_GTC
Ордер будет находится в очереди до тех пор, пока не будет снят