Робот - частичное закрытие (фикс профита) при достижении уровня?

 

Добрый день!

 Прошу подсказать.

Ищу готового советника в свободном доступе, с открытым кодом, чтобы переделать под себя, который умеет:

1. Войти в сделку по условию A - на покупку, B - на продажу. Допустим, каждая сделка открывается на 1 лот.

2. Проверяем количество пунктов, пройденных ценой в направлении сделки. Если цена прошла X пунктов, закрыть 0,5 лота (частичный фикс прибыли).

3. Сигналы докупки/допродажи игнорировать, даже если они отвечают условию входа (А или B). Ждем встречного (обратного) сигнала и закрываем сделку текущую (целиком 1 лот или оставшиеся 0,5, если уже была сработка п.2), открываем сделку в обратном направлении.


Я думаю, велосипед по 10 раз изобретать не стоит, нового в написанного мною ничего нет, кто-то уже данную вещь реализовывал в виде робота. Я писал индюки, роботов ни разу. Переделать мне будет проще. Прошу помочь. 

 
Тут искать не пробовали https://www.mql5.com/ru/code
MQL5 Code Base
MQL5 Code Base
  • www.mql5.com
Библиотека исходных кодов на языке MQL5 для MetaTrader 5
 
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); //вернем сколько раз уже закрывались
  }

можете взять за основу функцию и доработать ее под ваши нужды.
Причина обращения: