Попробуйте так (пример для байстопа, для др. типа по аналогии сделаете сами)):
extern int MAGIC = 1000; extern int Шаг = 15; //Расстояние между ордерами В пунктах extern double lot = 0.1; //Размeр лота extern string Name_Expert = "Хи-Хи, тра-ля-ля"; // Комментарий в терминале мт4 int ticket; //-- Подключаемые модули -- #include <stdlib.mqh> #include <stderror.mqh> //------------------------------------- void start() { //---------------------------------------- double pAsk=Ask+(Шаг)*Point;// задаем цену установки ордера байстоп if (!ExistOPNearMarket(NULL,OP_BUYSTOP,MAGIC, (2*Шаг) )) { //если на расстоянии (2*Шаг) от текущ. цены нет байстоп-отложек if (!ExistOPNearMarket(NULL,OP_BUY,MAGIC, (2*Шаг) )) { // и нет открытых позиций c заданным магиком // выствляем ордер байстоп на раст. Шаг от текущ.цены ticket= OrderSend(Symbol(),OP_BUYSTOP,lot,pAsk,Slippage, 0,0, Name_Expert ,MAGIC, 0, DarkBlue); if(ticket<0){Print("Ошибка установки ордера BUYSTOP ",GetLastError());return(0);} }} //------------------------------------------------ }//--------------- конец функции СТАРТ -------- //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь // Игорю - низкий поклон и уважение ! | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает флаг существования позиции или //| ордера около рынка | //+----------------------------------------------------------------------------+ //| Параметры: | //|sy - наименование инструмента ("" или NULL - текущийсиммвол) | //| op - торговая операция ( -1 - любая операция) | //| mn - MagicNumber ( -1 - любой магик) | //|ds - расстояние в пунктах от рынка(1000000 - по умолчанию) | //+----------------------------------------------------------------------------+ bool ExistOPNearMarket(string sy="", int op=-1, int mn=-1, int ds=1000000) { int i, k=OrdersTotal(), ot; if (sy=="" || sy=="0") sy=Symbol(); double p=MarketInfo(sy, MODE_POINT); if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01; for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { ot=OrderType(); if ((OrderSymbol()==sy) && (op<0 || ot==op)) { if (mn<0 || OrderMagicNumber()==mn) { if (ot==OP_BUY || ot==OP_BUYLIMIT || ot==OP_BUYSTOP) { if (MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())<ds*p) return(True); } if (ot==OP_SELL || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) { if (MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))<ds*p) return(True); }}}}} return(False); }
/Функция ExistOPNearMarket().
//Данная функция возвращает флаг существования ордера или позиции около рынка
// (на заданном расстоянии в пунктах от рынка). Более точный отбор проверяемых
//ордеров или позиций задаётся внешними параметрами:
//sy - Наименование инструмента. Если задать этот параметр, то функция проверит
// ордера или позиции только заданного инструмента. "" или NULL означает
//текущий инструмент.
//op - Торговая операция, тип ордера или позиции. Допустимые значения: OP_BUY,
// OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP или -1.
//Значение по умолчанию -1 означает любую торговую операцию.
//mn - Идентификатор ордера или позиции (MagicNumber). Значение по умолчанию -1
// - любой идентификатор.
//ds - Расстояние от рынка в пунктах. Значение по умолчанию 1000000.
Попробуйте так (пример для байстопа, для др. типа по аналогии сделаете сами)):
/Функция ExistOPNearMarket().
//Данная функция возвращает флаг существования ордера или позиции около рынка
// (на заданном расстоянии в пунктах от рынка). Более точный отбор проверяемых
//ордеров или позиций задаётся внешними параметрами:
//sy - Наименование инструмента. Если задать этот параметр, то функция проверит
// ордера или позиции только заданного инструмента. "" или NULL означает
//текущий инструмент.
//op - Торговая операция, тип ордера или позиции. Допустимые значения: OP_BUY,
// OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP, OP_SELLSTOP или -1.
//Значение по умолчанию -1 означает любую торговую операцию.
//mn - Идентификатор ордера или позиции (MagicNumber). Значение по умолчанию -1
// - любой идентификатор.
//ds - Расстояние от рынка в пунктах. Значение по умолчанию 1000000.
Большое спасибо. Разбираюсь. Получится-похвалюсь.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я не пишу программ потому, что не умею (о чём сожалею). Иногда очень хочется что нибудь изменить или добавить, но ....как говориться не дано. Поэтому обращаюсь к тем кому не в тягость поправить мои ошибки если они не глобальны. Или если я ошибаюсь в принципе, то буду рад услышать мнения и готов к продолжению разговора с тем кто видит правильное решение моей задачи. Кому то моя задача покажется очень знакомой. И это правильно. Многие начинают с изучения и попыток улучшить (в своём понимании) того, что уже написано и я не исключение.
Задача такая:
Необходимо выставлять отложенный ордер BUYSTOP или SELLSTOP на определённом расстоянии (шага-N) от текущей цены. TP SL выставлю самостоятельно.
Условие:
Если: (цена установки предыдущего BUYSTOP) - Ask(текущей цены) >=N
выставлять отложенный ордер BUYSTOP
или
Если: Bid(текущей цены) - (цена установки предыдущего SELLSTOP) >=N
выставлять отложенный ордер SELLSTOP
Спасибо всем кто примет участие и окажет помощь.