Возьмем более сложный пример...
Предположим, что у нас есть следующие ордера, которые мы хотим закрыть, все они имеют одинаковый магический номер, но некоторые имеют другой символ, чем наш советник, мы хотим, чтобы наш код закрывал ордера по тому же символу, что и наш советник, EURUSD:
Позиция | Номер билета | Символ |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3 | 444 | EURUSD |
4 | 555 | EURUSD |
Первый проход по циклу:
начальное значение PositionIndex равно TotalNumberOfOrders - 1, что равно 5 - 1 = 4, поэтому выбирается ордер на позиции 4, номер билета 555, этот ордер соответствует магическому номеру и символу, поэтому успешно удаляется, а остальные ордера меняют позицию следующим образом:
Позиция | Номер билета | Символ |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3 | 444 | EURUSD |
2-й проход по циклу:
теперь значение PositionIndex равно 3, поэтому выбирается ордер на позиции 3, тикет номер 444, этот ордер соответствует магическому номеру и символу, поэтомууспешно удаляется, а остальные ордера меняют позицию следующим образом:
Позиция | Номер билета | Символ |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
3-й проход по циклу:
теперь значение PositionIndex равно 2, поэтому выбирается ордер на позиции 2, тикет номер 333, этот ордер соответствует магическому номеру, но НЕ символу, поэтому он не удаляется, остальные ордера не меняются:
Позиция | Номер билета | Символ |
---|---|---|
0 | 111 | EURUSD |
1 | 222 | EURUSD |
2 | 333 | GBPUSD |
4-й проход по циклу:
теперь значение PositionIndex равно 1 , поэтому выбирается ордер на позиции 1, номер билета 222, этот ордер соответствует магическому номеру и символу, поэтому успешно удаляется, а остальные ордера меняют позицию следующим образом:
Позиция | Номер билета | Символ |
---|---|---|
0 | 111 | EURUSD |
1 | 333 | GBPUSD |
5-й и последний проход по циклу:
теперь значение PositionIndex равно 0 , поэтому выбран ордер на позиции 0, билет номер 111, этот ордер успешно удален, значение 0 - последнее допустимое значение для цикла ... цикл завершен.
Мы успешно удалили все наши совпадающие ордера, оставив один ордер, который не соответствовал нашему символу, билет номер 333 теперь на позиции 0. ...
Позиция | Номер билета | Символ |
---|---|---|
0 | 333 | GBPUSD |
Ссылка на эту тему: Петли и закрытие или удаление ордеров
Ничего себе. Вся эта информация для закрытия ордера.
Интересно, сколько информации нужно, чтобы получать 50+ пунктов в день, последовательно, каждый день (в среднем) - без сбоев, на протяжении последних 137 сделок.
Покажите мне, как сделать что-то подобное, и я буду считать это чрезвычайно полезной информацией, и Гуру, да будет ваш титул, во веки веков, аминь.
Ничего себе. Вся эта информация для закрытия ордера.
Интересно, сколько информации нужно, чтобы получать 50+ пипсов в день, последовательно, каждый день (в среднем) - без сбоев, на протяжении последних 137 сделок.
Интересно, сколько информации нужно, чтобы получать 50+ пипсов в день, последовательно, каждый день (в среднем) - без сбоев, на протяжении последних 137 сделок.
Покажите мне, как сделать что-то подобное, и я буду считать это чрезвычайно полезной информацией, а Гуру будет вашим титулом, во веки веков, аминь.
- Не засоряйте тему информацией не по теме
- Мы НЕ собираемся показывать вам это, потому что вы не прочитали правила Любые обсуждения, кроме касающихся MetaQuotes Language 4 и автотрейдинга, запрещены.
Raptor, с первого взгляда на ваше сообщение я понял, что вы являетесь экспертом в mql4. Эта тема снова помогла развеять мои сомнения! Продолжайте в том же духе. tnx
Просто еще одна идея:
for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++) // <-- for loop to loop through all Orders . . COUNT DOWN TO ZERO ! { if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue; // <-- if the OrderSelect fails advance the loop to the next PositionIndex if( OrderMagicNumber() == MagicNo // <-- does the Order's Magic Number match our EA's magic number ? && OrderSymbol() == Symbol() // <-- does the Order's Symbol match the Symbol our EA is working on ? && ( OrderType() == OP_BUY // <-- is the Order a Buy Order ? || OrderType() == OP_SELL ) ) // <-- or is it a Sell Order ? add_trade_to_close_queue( OrderTicket()); // <-- You need to model the queue mechanism ... } // end of For loop
С уважением.
Просто еще одна идея:
С уважением.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Это одна из самых распространенных ошибок, которые я вижу, возможно, отчасти из-за такого мусора, как Expert Advisor Builder. Поэтому я решил, что пришло время создать тему, посвященную этому вопросу, чтобы на нее можно было ссылаться в будущем.
Проблема
Давайте рассмотрим простой пример: нам нужна функция для закрытия всех открытых ордеров нашего советника, примеров много, но давайте создадим один с нуля.
Нам нужен цикл, потому что мы хотим закрыть все наши ордера для определенного советника, внутри этого цикла у нас будет код для выбора ордера, код для проверки правильности символа и магического номера и, наконец, код для закрытия ордера:
Этот код плох. . . НЕ ИСПОЛЬЗУЙТЕ ЕГО. . . Я объясню почему в следующем разделе ... .
Объяснение
Давайте проработаем приведенный выше код... строка за строкой, ордер за ордером...
Предположим, у нас есть следующие ордера, которые мы хотим закрыть, все они имеют тот же магический номер и символ, что и наш советник, поэтому мы хотим, чтобы наш код закрыл их все:
Первый проход по циклу:
начальное значение PositionIndex равно 0, поэтому выбирается заказ на позиции 0, билет номер 111, этот заказ успешно удаляется, а остальные заказы меняют позицию следующим образом:
2-й проход по циклу:
теперь значение PositionIndex равно 1, поэтому выбирается ордер на позиции 1, билет номер 333, этот ордер успешно удаляется, а остальные ордера меняют позицию следующим образом:
3-й проход по циклу:
теперь значение PositionIndex равно 2, поэтому выбирается ордер на позиции 2, билет номер 555, этот ордер успешно удаляется, а остальные ордера меняют позицию следующим образом:
4-й проход по циклу:
теперь значение PositionIndex равно 3 OrderSelect() пытается выбрать ордер на позиции 3 и терпит неудачу, continue переносит выполнение кода на следующее значение в цикле. ...
Пятый и последний запуск цикла:
теперь значение PositionIndex равно 4 OrderSelect() пытается выбрать ордер в позиции 4 и не удается, continue переводит выполнение кода на следующее значение в цикле ... цикл завершен.
Теперь у нас осталось 2 заказа, билеты 222 и 444, которые должны были быть закрыты, но не были... Далее, как решить эту проблему.
Решение
Следующий код является правильным подходом при закрытии открытых ордеров или удалении отложенных ордеров. ...
Ключевое отличие заключается в том, что цикл уменьшает значение от ( TotalNumberOfOrders - 1 ) до 0
.
Давайте еще раз проработаем приведенный выше код ... строка за строкой, ордер за ордером ...
У нас те же заказы, что и раньше:
1-й проход по циклу:
начальное значение PositionIndex равно TotalNumberOfOrders - 1, что равно 5 - 1 = 4, поэтому выбирается заказ на позиции 4, номер билета 555, этот заказ успешно удаляется, а остальные заказы меняют позицию следующим образом:
2-й проход по циклу:
теперь значение PositionIndex равно 3, поэтому выбирается ордер на позиции 3, билет номер 444, этот ордер успешно удаляется, а остальные ордера меняют позицию следующим образом:
3-й проход по циклу:
теперь значение PositionIndex равно 2, поэтому выбирается ордер на позиции 2, билет номер 333, этот ордер успешно удаляется, а остальные ордера меняют позицию следующим образом:
4-й проход по циклу:
теперь значение PositionIndex равно 1 , поэтому выбирается ордер на позиции 1, билет номер 222, этот ордер успешно удаляется, а остальные ордера меняют позицию следующим образом:
5-й и последний проход по циклу:
теперь значение PositionIndex равно 0 поэтому выбирается заказ на позиции 0, билет номер 111, этот заказ успешно удаляется, значение 0 - последнее допустимое значение для цикла ... цикл завершен.
Мы успешно удалили все совпадающие ордера...
Ссылка на эту тему: Циклы и закрытие или удаление ордеров