//+------------------------------------------------------------------+ //| MR.mq4 | //| Copyright © 2007 Олег Слободян | //| olegplus@yandex.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Oleg Slobodjan " #property link "mailto: olegplus@yandex.ru" #include <stderror.mqh> #include <stdlib.mqh> extern int MAGIC = 308; // extern double MinLot=0.01; //Самый маленький лот, с которого начинает торговлю любой процесс extern int LotDigit = 2; // возможных знаков после запятой extern int HourBegin = 8; extern int MinuteBegin = 0; extern int TP=500;//Профит int Ticket[1000]; double lots; int nBuystop, nSellstop; double tBuy, tSell; int CountAllOrders(int dir, int SysID) { int total=OrdersTotal(), i, c=0; if (total<=0) return (0); for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) {c=c+1;} } return (c); } int CreatTicketArray(int dir, int SysID) { int total=OrdersTotal(), i, c=1; if (total<=0) return (0); for(i=0;i<total;i++) { OrderSelect(i, SELECT_BY_POS); if ((OrderType()==dir) && (OrderMagicNumber()==SysID)) { Ticket[c] = OrderTicket(); c++; } } return (c-1); } int init() { } int deinit() { return(0); } void start() { Process(); // экспертом рассчитывается ТП для всех открытых Бай ордеров = ТП в параметрах, // чтобы при закрытии всех Бай ордеров – общий ТП равнялся TP. Trailing(MAGIC, Green, Red); } void Process() { int i,k, total; datetime time; //В 00:00 удаляем старые отложки nBuystop = CountAllOrders(OP_BUYSTOP, MAGIC); nSellstop = CountAllOrders(OP_SELLSTOP, MAGIC); i = TimeHour(TimeCurrent()); k = TimeMinute(TimeCurrent()); if (i>=0 && i<=HourBegin-1) { total = CreatTicketArray(OP_BUYSTOP, MAGIC); for (i=1; i<=total; i++) OrderDelete(Ticket[i], Green); total = CreatTicketArray(OP_SELLSTOP, MAGIC); for (i=1; i<=total; i++) OrderDelete(Ticket[i], Green); tBuy = 0; tSell = 0; return; } i = TimeHour(TimeCurrent()); k = TimeMinute(TimeCurrent()); if(i>=0 && i==HourBegin && k==MinuteBegin) { // если уже TimeBegin то lots = AccountFreeMargin()*0.1*0.00001; //начальный лот lots = NormalizeDouble(lots, LotDigit); //округлили до знаков минимального лота if (MinLot>lots) lots = MinLot;// если текущйи баланс меньше минимального if(MinuteBegin>=10) time = StrToTime((HourBegin-1)+":"+MinuteBegin);//нашли свечку для Low и High if(MinuteBegin<10) time = StrToTime((HourBegin-1)+":0"+MinuteBegin);//нашли свечку для Low и High i = iBarShift(NULL, 0, time); // выставляются отложенные ордера БайСтоп над свечой и СеллСтоп под свечой (TimeBegin-1) на H+1 и L-2 пунктах if (nBuystop<=0 && tBuy<=0) { if (Ask>=(High[i]+5*Point)) tBuy = OrderSend(Symbol(), OP_BUY, lots, Ask, 2, 0, High[i]+Point*TP, "BuyMR", MAGIC, 0, CLR_NONE); else tBuy = OrderSend(Symbol(), OP_BUYSTOP, lots, High[i]+5*Point, 2, 0, High[i]+Point*TP, "BuyMR", MAGIC, 0, CLR_NONE); // Sleep (3000);//подождали 3 сек } if (nSellstop<=0 && tSell<=0) { if (Bid<=(Low[i]-1*Point)) tSell = OrderSend(Symbol(), OP_SELL, lots, Bid, 2, 0, Low[i]-Point*TP, "SellMR", MAGIC, 0, CLR_NONE); else tSell = OrderSend(Symbol(), OP_SELLSTOP, lots, Low[i]-1*Point, 2, 0, Low[i]-Point*TP, "SellMR", MAGIC, 0, CLR_NONE); // Sleep (3000);//подождали 3 сек
} } } void Trailing(int SysID, color ClrBuy, color ClrSell) { int i, total = OrdersTotal(); if (total<=0) return; double Profit, price, nTP=0.0; int pos, pp; double m, m2, avgLevel, lots, lot1, newPrice, dSLPre; total = CreatTicketArray(OP_BUY, SysID); Profit=0.0; if (total>0) //Заглушка для OP_BUY {//1. Подсчитали прибыль по всем ордерам открытым в направлении dir for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); Profit = Profit+(Bid-OrderOpenPrice())*OrderLots(); } //Находим середину всех сделок (точка, когда все + и - позы дают прибыль=0) m=0.0; m2=0.0; avgLevel=0.0; OrderSelect(Ticket[1], SELECT_BY_TICKET); avgLevel=OrderOpenPrice(); m = OrderLots(); for (i=2; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); m2 = OrderLots(); avgLevel = avgLevel-(m2*(avgLevel-OrderOpenPrice()))/(m2+m); m = m+m2;} if (total>1) for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); // if (OrderTakeProfit()<avgLevel) OrderModify(Ticket[i],0, OrderStopLoss(), avgLevel+Point*(TP/total), 0, ClrBuy); } } total = CreatTicketArray(OP_SELL, SysID); Profit=0.0; if (total>0) //Заглушка {//1. Подсчитали прибыль по всем ордерам открытым в направлении dir for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); Profit = Profit + (OrderOpenPrice()-Ask)*OrderLots(); } //Находим середину всех сделок (точка, когда все + и - позы дают прибыль=0) m=0.0; m2=0.0; avgLevel=0.0; OrderSelect(Ticket[1], SELECT_BY_TICKET); avgLevel=OrderOpenPrice(); m = OrderLots(); for (i=2; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); m2 = OrderLots(); avgLevel = avgLevel+(m2*(OrderOpenPrice()-avgLevel))/(m2+m); m = m+m2; } if (total>1) for (i=1; i<=total; i++) { OrderSelect(Ticket[i], SELECT_BY_TICKET); // if (OrderTakeProfit()>avgLevel) OrderModify(Ticket[i],0, OrderStopLoss(), avgLevel-Point*(TP/total), 0, ClrSell); } } return; } //+------------------------------------------------------------------+

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Здравствуйте.
В приложении советник.
Необходимо убрать в советнике участок кода, открывающего по текущей цене и
поставить вместо этого отложенный ордер максимально близко от текущей цены, с повтором попытки,
если не удалось в первый раз.
Кратко о стратегии, по которой работает эксперт:
При закрытии предыдущей свечи, определяется Лоу и Хай этой свечи и
выставляются отложенные ордера над Хай и под Лоу.
Беда в том, что если текущая цена слишком близко от экстремума, то точно выставить ордер не удавалось,
поэтому было принято решение - открывать с текущих, когда цена достигала точки, преодолевающей экстремум.
На данный момент это решение признано ошибочным и требуется исключить участок кода, открывающего с текущих,
вместо этого - просто выставлять только и исключительно отложенные ордера, просто максимально близко к
необходимой точке.
Эта Стратегия обсуждалась здесь: https://forum.mql4.com/ru/15958
Спасибо!