void PartClose(double dpartclose_profit,double dpartclose_procent) { if(dpartclose_profit==0) return; for(int i=OrdersTotal()-1;i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS)) continue; if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1) && OrderType()<6) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { double stop=OrderStopLoss(); double pr=OrderProfitPoint(OrderTicket()); double lot=NLot(OrderLots()*dpartclose_procent/100); //часть лота if(OrderLots()<=MarketInfo(OrderSymbol(),MODE_MINLOT)) continue; //пропуск если остаток меньше минимального лота или равен ему double lots[]; int part=get_part(OrderTicket(),lots); if(part==0 && pr>=dpartclose_profit) { Print("Close part order and safe stoploss: ",lot); OrderClose(OrderTicket(),lot,clrNONE); } } } } }
/* lot - суммарный лот, определение частей примитивное но работает исправно */ int GOrders::get_part(int ticket,double &dlot[]) { int part=0; ArrayResize(dlot,1); dlot[0]=0; datetime tOpen=0; int iimagic; double open; string name; if(!OrderSelect(ticket,SELECT_BY_TICKET)) return (-1); open=OrderOpenPrice(); tOpen=OrderOpenTime(); iimagic=OrderMagicNumber(); name=OrderSymbol(); dlot[0]=OrderLots(); //Print("get_part: ",lot); for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; if((OrderMagicNumber()==iimagic || iimagic==-1) && (OrderSymbol()==sname || sname==NULL) && NormalizeDouble(OrderOpenPrice(),Digits)==NormalizeDouble(open,Digits) && OrderOpenTime()==tOpen) { dlot[0]+=OrderLots(); part++; } } if(!OrderSelect(ticket,SELECT_BY_TICKET)) return (-1); //Print("get_part: ",part," ",lot," == ", OrderLots()); return(part); //вернем сколько раз уже закрывались }

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день!
Прошу подсказать.
Ищу готового советника в свободном доступе, с открытым кодом, чтобы переделать под себя, который умеет:
1. Войти в сделку по условию A - на покупку, B - на продажу. Допустим, каждая сделка открывается на 1 лот.
2. Проверяем количество пунктов, пройденных ценой в направлении сделки. Если цена прошла X пунктов, закрыть 0,5 лота (частичный фикс прибыли).
3. Сигналы докупки/допродажи игнорировать, даже если они отвечают условию входа (А или B). Ждем встречного (обратного) сигнала и закрываем сделку текущую (целиком 1 лот или оставшиеся 0,5, если уже была сработка п.2), открываем сделку в обратном направлении.
Я думаю, велосипед по 10 раз изобретать не стоит, нового в написанного мною ничего нет, кто-то уже данную вещь реализовывал в виде робота. Я писал индюки, роботов ни разу. Переделать мне будет проще. Прошу помочь.