Добрый день!
Прошу помочь знающих в решении вопроса. Я абсолютный новичок, никогда не программировал, поэтому, пожалуйста, камнями не закидывайте. Форум/Гугл шерстил, ответа не нашел.
Нужна помощь в реализации советника, торгующего от горизонтальных уровней цены. Уровни заведомо известны. Советник должен открывать сделки при касании этих уровней.
Уровней много(больше 100), поэтому через оператор if все писать не правильно, как мне кажется.
Была идея собрать все уровни в массив, но тут уже столкнулся с первой проблемой.
Если сравнивать текущую цену с элементами массива - появляется один нюанс:
Ф-ия ArrayBsearch возвращает индекс первого найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего меньшего по значению из элементов, между которыми расположено искомое значение.
Возможно ли сделать так, чтобы ArrayBsearch не возвращала ни какого значения, если текущая цена не соответствует не одному из уровней цены, что хранятся в массиве?
Если я не там копаю, то прошу указать на недочеты и посоветовать, как можно реализовать открытие ордеров от конкретных заданных уровней цены, так, чтобы каждый уровень не писать через if?
Заранее благодарю всех кто откликнется!
Просто переберите в цикле массив, вот как пример:
int Get_ArrayIndex(double price, double &arr[]) { int res = -1; int size = ArraySize(arr); for(int i = size - 1; i >= 0; i--) { if(price == arr[i]) { res = i; break; } } return(res); }
Да, прикол. Такое поведение ArrayBsearch делает функцию просто бесполезной.
Посмотрите на \MQL4\Include\Arrays\ArrayDouble.mqh, там есть CArrayDouble::Search, она делает бинарный поиск. Сам он реализован в CArrayDouble::QuickSearch.
После поиска проверить, равно ли найденное значение тому, которое искали.
при поиске использовать разность 2-х вещественных чисел вместо сравнения на равенство https://www.mql5.com/ru/docs/basis/types/double
- www.mql5.com
После поиска проверить, равно ли найденное значение тому, которое искали.
Блин.
)))))
@SeriousRacoon @Igor Makanu @Dmitry Fedoseev @Sergey Kolemanov
Благодарю всех за ответы!
Добрый день,очень нужна помощь.Собираю советник из готовых блоков по своей стратегии,и всё встало с функцией удаления встречного ордера,функция работает,нареканий нет,но мне необходимо что бы она выключатся и включатся во внешних параметрах эксперта то есть в настройках,как только не делал бесполезно,помогите решить проблему,буду искренне благодарен.Сама функция......
DeleteOppositeOrders();
void DeleteOppositeOrders() {
bool fd, fep1, fep2;
fep1=ExistPosition(1);
fep2=ExistPosition(2);
for (int i=OrdersTotal()-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
fd=False;
if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {
if (fep2) fd=OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {
if (fep1) fd=OrderDelete(OrderTicket());
}
if (fd && UseSound) PlaySound(NameFileSound);
}
}
}
}
bool ExistPosition(int mn) {
bool Exist=False;
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
Exist=True; break;
}
}
}
}
return(Exist);
}
...
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Vladimir Karputov, 2015.09.13 19:05
И неплохо было бы научиться вставлять код в свои сообщения (Правильно вставляем код на форуме).Просто переберите в цикле массив, вот как пример:
Так сравнивать double нельзя ))
if(price == arr[i])
Просветите пожалуйства что нажимать для сохранения результатов оптимизации советника в МТ5, для вставки его в последующем в советник МТ5 на панели графика терминала МТ5 ?
Ищу его доолго, пока в поисках...
СПАСИБО.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день!
Прошу помочь знающих в решении вопроса. Я абсолютный новичок, никогда не программировал, поэтому, пожалуйста, камнями не закидывайте. Форум/Гугл шерстил, ответа не нашел.
Нужна помощь в реализации советника, торгующего от горизонтальных уровней цены. Уровни заведомо известны. Советник должен открывать сделки при касании этих уровней.
Уровней много(больше 100), поэтому через оператор if все писать не правильно, как мне кажется.
Была идея собрать все уровни в массив, но тут уже столкнулся с первой проблемой.
Если сравнивать текущую цену с элементами массива - появляется один нюанс:
Ф-ия ArrayBsearch возвращает индекс первого найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего меньшего по значению из элементов, между которыми расположено искомое значение.
Возможно ли сделать так, чтобы ArrayBsearch не возвращала ни какого значения, если текущая цена не соответствует не одному из уровней цены, что хранятся в массиве?
Если я не там копаю, то прошу указать на недочеты и посоветовать, как можно реализовать открытие ордеров от конкретных заданных уровней цены, так, чтобы каждый уровень не писать через if?
Заранее благодарю всех кто откликнется!