Мне не понятно почему если я блокирую флаг внутри этой функции советник начинает открывать и закрывать за раз 100-200 ордеров
Объясняю на твоем коде:
Изначально флаг
int flag_close=0;
//+------------------------------------------------------------------+
Далее идет открытие ордеров
//-------------------------------------------------------------------+ Команда на открытие первых ордеров в сеткеif((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
{
Далее если появляется условие для закрытия ордеров (у тебя их три)
//-------------------------------------------------------------------+ Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
{
flag_close=1;
//-------------------------------------------------------------------+ Команда на закрытие сетки ордеровif((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
{
flag_close=1;
//-------------------------------------------------------------------+ Команда на закрытие первых ордеровif((CountTrade(0) == 1 && CalculiteProfit() >= 0 && OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 && OrderCloseSignal()==1))
{
flag_close=1;
флаг получает значение "1" и начинает закрывать ордера
//-------------------------------------------------------------------+ Команда на закрытие ордеровif(flag_close==1)ClosseAll();
и как только все ордера закрыты флаг получает значение "0"
Да. Но замок открывается с одинаковым лотом. И два разнонаправленных ордера открываются одновременно. А хеджирование, это когда сделка вошла в просадку, а трейдер открывает позицию с бОльшим лотом в том же направлении (с разными направлениями я перепутал) подразумевая что цена развернется, чтобы получить прибыль на сделке с бОльшим лотом и перекрыть убыток сделки с меньшим лотом или усредняться до 0. Если что-то перепутал, то поправьте меня.
Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.
Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.
Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.
Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.
Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"
Нужно создать список ордеров, с тикетами, для закрытия (как уже многие здесь говорили). Если робот обнаружил сигнал на выход, то добавлять соответствующие ордера (тикеты) в список на закрытие. Список проходится циклом который отправляет запросы на закрытие (OrderClose). Затем нужно постоянно проверять есть ли открытые ордера с тикетами, которые были добавлены в этот список. Если один или несколько тикетов не обнаружено, то нужно удалять их из списка. Так функция не будет отправлять запрос на закрытие несуществующих ордеров.
Что делать с новыми сигналами и ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия по сигналу выхода. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по тикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.
Нужно создать список ордеров для закрытия (как уже многие здесь говорили) с тикетами. Если робот обнаружил сигнал на выход, то добавлять соответствующие ордера (тикеты) в список на закрытие. Список проходится циклом который отправляет запрос на закрытие (OrderClose). Затем нужно постоянно проверять есть ли открытые ордера с тикетами, которые были добавлены в этот список. Если один или несколько тикетов не обнаружено, то нужно удалять их из списка. Так функция не будет отправлять запрос на закрытие несуществующих ордеров.
Что делать с новыми ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по этикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.
Получиться по очереди будет закрывать каждый?Когда сетка это так долго, ока закроет нужные. При закрытии последнего, может случиться так, что уже ордеров 10 нужно закрывать и вот по очереди все закрывает и тянется это бесконечно долго.
Получиться по очереди будет закрывать каждый?Когда сетка это так долго, ока закроет нужные. При закрытии последнего, может случиться так, что уже ордеров 10 нужно закрывать и вот по очереди все закрывает и тянется это бесконечно долго.
Не совсем так. Все ордера и так закрываются по очереди терминалом. В цикле OrderSendможет срабатывать очень много раз в секунду (зависит от вашего железа). Но OrderSend всего лишь добавляет соответствующие команды в очередь на закрытие. Затем эти команды терминал отправляет на сервер с заданным интервалом или после получения ответа сервера о предыдущем запросе, а не сразу. Так что, по любому, большое количество ордеров (позиций) закрывается на много медленнее чем один ордер.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Ростислав мне это понятно
Мне не по не понятно почему если я блокирую флаг внутри этой функции советник начинает открывать и закрывать за раз 100-200 ордеров
Мне не понятно почему если я блокирую флаг внутри этой функции советник начинает открывать и закрывать за раз 100-200 ордеров
Объясняю на твоем коде:
Изначально флаг
Далее идет открытие ордеров
Далее если появляется условие для закрытия ордеров (у тебя их три)
флаг получает значение "1" и начинает закрывать ордера
и как только все ордера закрыты флаг получает значение "0"
Потому что ели флаг не равен "0", то постоянно вызывает функцию ClosseAll()
Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"
Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"
У тебя кредитка есть?
Заходишь в магазин и покупаешь пиво по одной бутылке за раз и каждый раз расчитываешься картой пока не получишь "0" на карте,
после этого идешь пополняешь карту и опять идешь за пивом
Да. Но замок открывается с одинаковым лотом. И два разнонаправленных ордера открываются одновременно. А хеджирование, это когда сделка вошла в просадку, а трейдер открывает позицию с бОльшим лотом в том же направлении (с разными направлениями я перепутал) подразумевая что цена развернется, чтобы получить прибыль на сделке с бОльшим лотом и перекрыть убыток сделки с меньшим лотом или усредняться до 0. Если что-то перепутал, то поправьте меня.
Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.
Хеджирование - это абсолютно не lock, и не частичный lock, а совершенно другая система.
Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.
Но я же и не говорю, что это losk. Просто перепутал вчера (сказал: нужно открывать противоположную позицию вместо однонаправленной). Время было позднее уже. А сегодня понял где ошибся.
Тогда всё понятно, бывает и такое :)
Может быть и так при условии что приводит команда на открытие ордера. Вот и происходит своего рода "ЗАЦИКЛИВАНИЕ"
Нужно создать список ордеров, с тикетами, для закрытия (как уже многие здесь говорили). Если робот обнаружил сигнал на выход, то добавлять соответствующие ордера (тикеты) в список на закрытие. Список проходится циклом который отправляет запросы на закрытие (OrderClose). Затем нужно постоянно проверять есть ли открытые ордера с тикетами, которые были добавлены в этот список. Если один или несколько тикетов не обнаружено, то нужно удалять их из списка. Так функция не будет отправлять запрос на закрытие несуществующих ордеров.
Что делать с новыми сигналами и ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия по сигналу выхода. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по тикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.
Нужно создать список ордеров для закрытия (как уже многие здесь говорили) с тикетами. Если робот обнаружил сигнал на выход, то добавлять соответствующие ордера (тикеты) в список на закрытие. Список проходится циклом который отправляет запрос на закрытие (OrderClose). Затем нужно постоянно проверять есть ли открытые ордера с тикетами, которые были добавлены в этот список. Если один или несколько тикетов не обнаружено, то нужно удалять их из списка. Так функция не будет отправлять запрос на закрытие несуществующих ордеров.
Что делать с новыми ордерами, которые появились в период заполненного списка? Можно также добавлять их в список закрытия. Таким образом, они также закроются в свою очередь. Вот и всё. Создайте такой список и закрываете ордера по этикетам циклически. Можно с интервалом в секунду или несколько секунд на один проход цикла. Осталось реализовать данный алгоритм и всё будет работать.
Получиться по очереди будет закрывать каждый?Когда сетка это так долго, ока закроет нужные.
При закрытии последнего, может случиться так, что уже ордеров 10 нужно закрывать и вот по очереди все закрывает и тянется это бесконечно долго.
Получиться по очереди будет закрывать каждый?Когда сетка это так долго, ока закроет нужные.
При закрытии последнего, может случиться так, что уже ордеров 10 нужно закрывать и вот по очереди все закрывает и тянется это бесконечно долго.
Не совсем так. Все ордера и так закрываются по очереди терминалом. В цикле OrderSend может срабатывать очень много раз в секунду (зависит от вашего железа). Но OrderSend всего лишь добавляет соответствующие команды в очередь на закрытие. Затем эти команды терминал отправляет на сервер с заданным интервалом или после получения ответа сервера о предыдущем запросе, а не сразу. Так что, по любому, большое количество ордеров (позиций) закрывается на много медленнее чем один ордер.