Задача следующая:
Перевести фразу "Если три последних ордера закрылись в минус то: " в код.
Приблизительное начало кода написал, но как определить что это будут именно три последних закрытых ордера ?
Заранее благодарен !
Модульно это выглядит так:
- сохранить в массив данные всех рыночных ордеров из истории
- отсортировать по времени закрытия по убыванию.
- взять из массива первые N.
Модульно это выглядит так:
- сохранить в массив данные всех рыночных ордеров из истории
- отсортировать по времени закрытия по убыванию.
- взять из массива первые N.
Спасибо, в целом понятно но с массивами пока у меня проблемы не до конца понимаю принцип работы. Буду пробовать если не будет получаться задам еще вопрос )
Спасибо !
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
void OnStart() { int Всего=OrdersHistoryTotal(); Alert("Всего ордеров = ",Всего); for(int i = Всего-5; i <= Всего-1; i++) { if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { Alert("Ошибка"); return; } Alert("Ордер = ", OrderTicket(), " Время = ",OrderOpenTime(), " Профит = ",OrderProfit()); } }В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...
Во-первых, OrdersTotal возвращает общее количество открытых и отложенных ордеров.
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...
Запусти скрипт и посмотри
void TrallLot() { int TotalOrders = OrdersHistoryTotal(); for(int i = TotalOrders-N_OrdersLosse; i <= TotalOrders-1; i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderProfit() < 0) } } } }
Получается пока так.
Но есть вопросы:
1) Можно ли обойтись без OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) т.к используется OrdersHistoryTotal().
2) Как указать что если TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 и TotalOrders - 4 и ... TotalOrders - N_OrdersLosse < 0 то ...
Во-первых, OrdersTotal возвращает общее количество открытых и отложенных ордеров.
А надо OrdersHistoryTotal возвращает количество закрытых и ...
Во-вторых, ордера в истории располагаются в исторической последовательности.
OrdersHistoryTotal()-1 это последний ордер, OrdersHistoryTotal()-2 предпоследний и т.д.
Убедиться в этом можно с помощью скрипта
В-третьих. Количество ордеров в истории и скорость работы задается на вкладке История Счета. Так что у вас ПОЧТИ правильно...
Вы уверены, что всегда будет именно так?
Прецеденты уже были. Раньше зависело от сортировки в терминале.
ИМХО - чтобы однозначно быть уверенным в том, что мы знаем именно нужные последние закрытые позиции, нужно их искать по времени закрытия. Это самый надёжный независимый от никакой сторонней сортировки метод. А советник работает с деньгами. Ладно, когда с вашими - фиг с ними, а если на заказ или продажу?
Вы уверены, что всегда будет именно так?
Прецеденты уже были. Раньше зависело от сортировки в терминале.
ИМХО - чтобы однозначно быть уверенным в том, что мы знаем именно нужные последние закрытые позиции, нужно их искать по времени закрытия. Это самый надёжный независимый от никакой сторонней сортировки метод. А советник работает с деньгами. Ладно, когда с вашими - фиг с ними, а если на заказ или продажу?
Проверял скрипт, он показал ордера по порядку. см.скрин.
Проверял скрипт, он показал ордера по порядку. см.скрин.
Вы давно программируете для МТ4, 5 ?
Я ж сказал: раньше была зависимость от сортировки в терминале МТ4. Потом её убрали. А потом опять она вдруг всплыла. После чего опять её не стало...
Как думаете, есть уверенность, что опять что-то не произойдёт?
При таком подходе, какой предлагаете вы, у меня нет такой уверенности. При однозначном поиске по времени закрытия, у меня есть уверенность, что чтобы ни случилось с сортировкой, я найду именно то, что ищу.
Вы же можете искать так, как вам скрипт показал в данный момент - никто вас не неволит.
Проверял скрипт, он показал ордера по порядку. см.скрин.
Речь о том, что если в Истории Счета щелкнуть по заголовку любого столбца, то расположение ордеров изменится. В предыдущих билдах функция OrderSelect() выбирала ордера в соответствии с этой сортировкой. Для надежности следует обратиться к разработчикам с вопросом о порядке выбора ордеров из истории с помощью функции OrderSelect().
Ответы на вопросы:
1) Можно ли обойтись без OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
К элементам массива мы обращаемся по индексу. Индекс - это целое число, величина его ограничена. Поэтому, размер массива ограничен.
Ордеров очень много, ордера хранятся в базе данных. Обращение к ордерам происходит иначе. Выбирается один ордер с помощью функции OrderSelect
и после этого происходит обращение к полям ордера с помощью функций OrderTicket(), OrderOpenTime(), ... Так что без OrderSelect ...
2) Как указать что если TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 ...
int N=111; bool Результат=true; int Всего=OrdersHistoryTotal(); for(int i = Всего-1; i >= Всего-N; i--) // Перед этим надо сравнить количество ордеров и N { bool Результат=OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) if(OrderProfit()>0) { Результат=false; break; // Выход из цикла на первом встретившемся прибыльном } }
Если Результат==true, то все N ордеров убыточны. Оператор break прекращает выполнение оператора switch, while, do-while или for
Если же ордера в базе данных ордеров расположены хаотично, то надо проверять OrderCloseTime() и программа будет сложнее
Может быть проще следить за балансом. Если он в какой-то момент возрастет - значит была прибыль. Вам что конкретно надо-то?
Речь о том, что если в Истории Счета щелкнуть по заголовку любого столбца, то расположение ордеров изменится. В предыдущих билдах функция OrderSelect() выбирала ордера в соответствии с этой сортировкой. Для надежности следует обратиться к разработчикам с вопросом о порядке выбора ордеров из истории с помощью функции OrderSelect().
Ответы на вопросы:
1) Можно ли обойтись без OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)
К элементам массива мы обращаемся по индексу. Индекс - это целое число, величина его ограничена. Поэтому, размер массива ограничен.
Ордеров очень много, ордера хранятся в базе данных. Обращение к ордерам происходит иначе. Выбирается один ордер с помощью функции OrderSelect
и после этого происходит обращение к полям ордера с помощью функций OrderTicket(), OrderOpenTime(), ... Так что без OrderSelect ...
2) Как указать что если TotalOrders - 1 и TotalOrders - 2 и TotalOrders - 3 ...
Если Результат==true, то все N ордеров убыточны. Оператор break прекращает выполнение оператора switch, while, do-while или for
Если же ордера в базе данных ордеров расположены хаотично, то надо проверять OrderCloseTime() и программа будет сложнее
Может быть проще следить за балансом. Если он в какой-то момент возрастет - значит была прибыль. Вам что конкретно надо-то?
Идея следующая:
Есть результаты теста советника из которого следует что в среднем на подряд убыточных сделок 3 шт. Максимальное количество на подряд убыточных сделок 8 шт. Хочу вписать в советник следующее: если на подряд N убыточных сделок, следующий ордер открываем с увеличенным лотом. (Lot*kLot) ...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Задача следующая:
Перевести фразу "Если три последних ордера закрылись в минус то: " в код.
Приблизительное начало кода написал, но как определить что это будут именно три последних закрытых ордера ?
Заранее благодарен !