Будьте любезны подскажите код автоматического перемещения отложенного ордера в одном направлении за ценой, отстоящего от нее на определенное количество пунктов
- Два вопроса.
- Автоматическое определение открытых и отложенных ордеров
- Работа с файлами?
Будьте любезны подскажите код автоматического перемещения отложенного ордера в одном направлении за ценой, отстоящего от нее на определенное количество пунктов
Да к стати интересный вопрос??? Если можно подрообнее, как сделать так чтоб отложник полз за ценой на определённом растоянии от неё)))
Вот-вот! Давно об этом мечтаю. Я уже как-то запрашивал помощь по данному вопросу. Ответа не получил. А хотелось бы, как трейллинг: движение ордера строго в одну из сторон за ценой на установленном расстоянии и его остановка при движении цены в сторону ордера. Думаю, такое разработчики всё же могли бы замутить через правый клик мыши.
Насколько я помню, торговая система "Подмышки", как раз этим и занимается:
//+------------------------------------------------------------------+ //| e-Armpits.mq4 | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //| 21.09.2005 Торговая система ПОДМЫШКИ | //+------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" #define MAGIC 20050921 //------- Внешние параметры советника -------------------------------- extern string _Parameters_Trade = "----- Параметры торговли"; extern bool UseOneAccount = True; // Торговать только на одном счёте extern int NumberAccount = 71597; // Номер торгового счёта extern string Name_Expert = "e-Armpits"; extern bool UseSound = True; // Использовать звуковой сигнал extern string NameFileSound = "expert.wav"; // Наименование звукового файла extern color clOpenBuy = Blue; // Цвет открытия покупки extern color clOpenSell = Red; // Цвет открытия продажи extern color clModiBuy = Blue; // Цвет модификации покупки extern color clModiSell = Red; // Цвет модификации продажи extern color clCloseBuy = Aqua; // Цвет закрытия покупки extern color clCloseSell = Violet; // Цвет закрытия продажи extern bool UseHourTrade = False; // Использовать время торговли extern int HourBegTrade = 7; // Время начала торговли extern int HourEndTrade = 18; // Время конца торговли extern int Slippage = 7; // Проскальзывание цены extern double Lots = 0.1; // Размер торгуемого лота extern int TrailingStop = 10; // Размер трала extern int TrailingStep = 2; // Шаг трала extern string _Parameters_Expert = "----- Параметры советника"; extern int ClearanceSet = 10; // Зазор установки ордеров extern int ClearanceStop = 5; // Зазор установки ордеров extern int MaxStopLoss = 20; // Максимальный StopLoss extern int DeltaPrice = 7; // Изменение цены //---- Глобальные переменные советника ------------------------------- int ms[5]; int prevBar; // Предыдущее количество баров string mess; // Текст сообщения, комментария //------- Подключение внешних модулей -------------------------------- //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ void deinit() { Comment(""); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { if (UseOneAccount && AccountNumber()!=NumberAccount) { Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!"); return; } else Comment(""); if (UseHourTrade && (Hour()<HourBegTrade || Hour()>=HourEndTrade)) { Comment("Время торговли ещё не наступило!"); return; } else Comment(""); if (prevBar!=Bars && prevBar!=0) { CheckForSetOrders(); CheckForModify(); } TrailingPositions(); prevBar=Bars; } //+------------------------------------------------------------------+ //| Проверка условий установки ордеров | //+------------------------------------------------------------------+ void CheckForSetOrders() { // Ордер на покупку if (High[2]-High[1]>DeltaPrice*Point) { if (!ExistBuy()) SetOrderBuyStop(High[1]+ClearanceSet*Point); } // Ордер на продажу if (Low[1]-Low[2]>DeltaPrice*Point) { if (!ExistSell()) SetOrderSellStop(Low[1]-ClearanceSet*Point); } } //+------------------------------------------------------------------+ //| Проверка условий модификации установленных ранее ордеров | //| или открытых позиций | //+------------------------------------------------------------------+ void CheckForModify() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUYSTOP) { if (OrderOpenPrice()>High[1]+ClearanceSet*Point) { OrderModify(OrderTicket(),High[1]+ClearanceSet*Point,GetStopLoss(OP_BUYSTOP),0,0,clModiBuy); } } if (OrderType()==OP_SELLSTOP) { if (OrderOpenPrice()<Low[1]-ClearanceSet*Point) { OrderModify(OrderTicket(),Low[1]-ClearanceSet*Point,GetStopLoss(OP_SELLSTOP),0,0,clModiSell); } } } } } } //+------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //+------------------------------------------------------------------+ void TrailingPositions() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUY) { if (CurTime()-OrderOpenTime()>5400 && OrderProfit()<0) CloseBuy(); if (Bid-OrderOpenPrice()>TrailingStop*Point) { if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) { ModifyStopLoss(Bid-TrailingStop*Point); } } } if (OrderType()==OP_SELL) { if (CurTime()-OrderOpenTime()>5400 && OrderProfit()<0) CloseSell(); if (OrderOpenPrice()-Ask>TrailingStop*Point) { if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) { ModifyStopLoss(Ask+TrailingStop*Point); } } } } } } } //+------------------------------------------------------------------+ //| Закрыть длинную (BUY) позицию по рыночной цене | //+------------------------------------------------------------------+ void CloseBuy() { bool fc; fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); if (fc && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+ //| Закрыть короткую (SELL) позицию по рыночной цене | //+------------------------------------------------------------------+ void CloseSell() { bool fc; fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); if (fc && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+ //| Возвращает флаг существования ордера BUYSTOP или позиции BUY | //+------------------------------------------------------------------+ bool ExistBuy() { bool BuyExist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_BUY || OrderType()==OP_BUYSTOP) BuyExist=True; } } } return(BuyExist); } //+------------------------------------------------------------------+ //| Возвращает флаг существования ордера SELLSTOP или позиции SELL | //+------------------------------------------------------------------+ bool ExistSell() { bool SellExist=False; for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if (OrderType()==OP_SELL || OrderType()==OP_SELLSTOP) SellExist=True; } } } return(SellExist); } //+------------------------------------------------------------------+ //| Установить ордер BUYSTOP | //+------------------------------------------------------------------+ void SetOrderBuyStop(double pAsk) { double ldLot, ldStop; string lsComm; ldLot = GetSizeLot(); ldStop = GetStopLoss(OP_BUYSTOP); lsComm = GetCommentForOrder(); if (pAsk-ldStop<MaxStopLoss*Point) { OrderSend(Symbol(),OP_BUYSTOP,ldLot,pAsk,Slippage,ldStop,0,lsComm,MAGIC,0,clOpenBuy); if (UseSound) PlaySound(NameFileSound); } } //+------------------------------------------------------------------+ //| Установить ордер SELLSTOP | //+------------------------------------------------------------------+ void SetOrderSellStop(double pBid) { double ldLot, ldStop; string lsComm; ldLot = GetSizeLot(); ldStop = GetStopLoss(OP_SELLSTOP); lsComm = GetCommentForOrder(); if (ldStop-pBid<MaxStopLoss*Point) { OrderSend(Symbol(),OP_SELLSTOP,ldLot,pBid,Slippage,ldStop,0,lsComm,MAGIC,0,clOpenSell); if (UseSound) PlaySound(NameFileSound); } } //+------------------------------------------------------------------+ //| Генерирует и возвращает строку коментария для ордера или позиции | //+------------------------------------------------------------------+ string GetCommentForOrder() { return(Name_Expert); } //+------------------------------------------------------------------+ //| Главная функция получения размера лота (вызывается из советника) | //+------------------------------------------------------------------+ double GetSizeLot() { return(Lots); } //+------------------------------------------------------------------+ //| Возвращает уровень StopLoss для ордера или позиции | //| Параметры: | //| op - вид операции | //+------------------------------------------------------------------+ double GetStopLoss(int op) { double ldStop=0, sp=MarketInfo(Symbol(), MODE_SPREAD); if (op==OP_BUYSTOP) ldStop=Low[1]-ClearanceStop*Point; if (op==OP_SELLSTOP) ldStop=High[1]+(ClearanceStop+sp)*Point; return(ldStop); } //+------------------------------------------------------------------+ //| Перенос уровня StopLoss | //| Параметры: | //| ldStopLoss - уровень StopLoss | //+------------------------------------------------------------------+ void ModifyStopLoss(double ldStopLoss) { bool fm; // Флаг модификации позиции fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); if (fm && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+
Порылся у себя в закромах и нашёл ещё одного советника по теме. Он выполняет перемещение всех стоповых ордеров вслед за ценой.
//+------------------------------------------------------------------+ //| e-SOTrailing.mq4 | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //| 03.09.2006 Автоматический Trailing всех стоповых ордеров. | //| Вешать только на один график. | //+------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" //------- Внешние параметры ------------------------------------------ extern bool AllStopOrders = False; // Управлять всеми стоповыми ордерами extern int TrailingStop = 20; // Фиксированный размер трала extern int TrailingStep = 3; // Шаг трала extern bool UseSound = True; // Использовать звуковой сигнал extern string NameFileSound = "expert.wav"; // Наименование звукового файла extern color clModifyBuy = Aqua; // Цвет модификации покупки extern color clModifySell = Tomato; // Цвет модификации продажи //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ void start() { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (AllStopOrders || OrderSymbol()==Symbol()) { TrailingOrders(); } } } } //+------------------------------------------------------------------+ //| Сопровождение ордеров простым тралом | //+------------------------------------------------------------------+ void TrailingOrders() { double pBid, pAsk, pp; pp=MarketInfo(OrderSymbol(), MODE_POINT); if (OrderType()==OP_BUYSTOP) { pAsk=MarketInfo(OrderSymbol(), MODE_ASK); if (OrderOpenPrice()-pAsk>(TrailingStop+TrailingStep-1)*pp) { ModifyOpenPrice(pAsk+TrailingStop*pp, clModifyBuy); } } if (OrderType()==OP_SELLSTOP) { pBid=MarketInfo(OrderSymbol(), MODE_BID); if (pBid-OrderOpenPrice()>(TrailingStop+TrailingStep-1)*pp) { ModifyOpenPrice(pBid-TrailingStop*pp, clModifySell); } } } //+------------------------------------------------------------------+ //| Перенос ордера | //| Параметры: | //| ldOpen - уровень OpenPrice | //| lcColor - цвет модификации | //+------------------------------------------------------------------+ void ModifyOpenPrice(double ldOpen, color lcColor=CLR_NONE) { bool fm; double ldStop=OrderStopLoss(); double ldTake=OrderTakeProfit(); fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, lcColor); if (fm && UseSound) PlaySound(NameFileSound); } //+------------------------------------------------------------------+
Спасибо за ответ, Kim IV. Вбив свой счет в торговую систему "Подмышки", прикрепил к графику, не работает.
В чем может быть дело
В чем может быть дело
Kim IV,проясните принцип работы торговой системы "Подмышки". выставляю отложен.ордера buy , sell- limit,stop--не модифицируются
Kim IV,проясните принцип работы торговой системы "Подмышки".
Что-то типа обнаружения движения на некотором количестве часовых баров. Например, обнаружено движение вверх, под это движение подставляется SellStop. Если движение вниз, то подставляется BuyStop. Отсюда название системы "Подмышки". Сам придумал, гы...
выставляю отложен.ордера buy , sell- limit,stop--не модифицируются
Советник не будет работать с Вашими ордерами. Он свои сам ставит...
Я ведь выложил не готовое решение, а чтобы посмотрели, как в коде организуется модификация ордеров.
Такой интерестный вопрос, а решения так и не нашли?
Зачем тащить отложник за ценой? Чтобы он никогда не исполнился?
Ну раз надо, то OrderModify в помощь
Ну раз надо, то OrderModify в помощь
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь