Как начинающему кодеру советую внимательно прочесть вот эту ветку: https://www.mql5.com/ru/forum/107476.
На многие вопросы найдете ответы, в том числе и на тот, который здесь задали.
Не могу сделать проверку при открытии сделки, на существование
сделки с такой же ценой открытия. На сколько понял для меня ключевым
является openeorderprice() И ordertype().
Нашел на форуме такой код:
Вроде бы с ним разобрался. Но как перед заключением сделки обращаться к массиву данных?
Я вижу логику исполнения программы так:
1) получен торговый сигнал
2) проверка на отсутвие таких же позиций
а) нет таких. заключение сделки.
б) есть такие. обнуление сигнала.3) добваление новой информации с массив.
Работать будет только с рынком. Никакх отложенных ордеров. Одновременное количество сделок может быть весьма большим...
А зачем вы проверяете на существование позиций с такой же ценой открытия? И стоит ли при "первой пробе" сразу связываться с массивами?
А если уже открытые есть позиции, но их цена открытия отличается от заданной на 1-2 пипса? Да ещё и ваша тож откроется рядышком...
Наверное, логичнее проверить "на отсутвие таких же позиций" проще, используя готовую ф-ю (по ссылке выше):
//+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) kp++; }}}}} return(kp); }
Иначе говоря, задаем условие:
if ( NumberOfPositions(NULL, OP_BUY, MagicNumber ) <1 ) {
//если нет открытых бай-позиций с заданным магиком, то продолжаем ..
//-----------------------
Но если вам важна именно цена открытия, то могу рекомендовать ф-и:
Функция PriceOpenLastPos(). Стр.24
Эта функция возвращает цену открытия последней открытой позиций.
Функция DistMarketAndPos(). Стр.15
которая возвращает расстояние в пунктах между рынком и ближайшей позицей
Функция ExistOPNearMarket(). Стр.16
Данная функция возвращает флаг существования ордера или позиции около рынка (на заданном расстоянии в пунктах от рынка).
Используя эти функции, - достаточно легко построить простейший гридер.
спасибо огромное. понял что и как работает теперь.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день форумчане.
Пробую себя в експертописательстве.
Не могу сделать проверку при открытии сделки, на существование сделки с такой же ценой открытия. На сколько понял для меня ключевым является openeorderprice() И ordertype().
Нашел на форуме такой код:
Вроде бы с ним разобрался. Но как перед заключением сделки обращаться к массиву данных?
Я вижу логику исполнения программы так:
1) получен торговый сигнал
2) проверка на отсутвие таких же позиций
а) нет таких. заключение сделки.
б) есть такие. обнуление сигнала.3) добваление новой информации с массив.
Работать будет только с рынком. Никакх отложенных ордеров. Одновременное количество сделок может быть весьма большим...