Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 672

 
RichLux:

пишу советник, который работает по мартингейлу.

Как заставить его закрывать все открытые им ордера при достижении максимально допустимого убытка в пунктах на одной валютной паре? 


double GetProfitinCurrency(string order_symbol="",int order_type=-1,int order_magic=-1)
  {
   double profit=0;
   int    i,k=OrdersTotal();

   if(order_symbol=="0") order_symbol=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==order_symbol || order_symbol=="") && (order_type<0 || OrderType()==order_type))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(order_magic<0 || OrderMagicNumber()==order_magic)
                 {
                  profit+=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(profit);
  }


 

функция возвращает профит в октрытых позах, можно фильтровать по символу, типу, магику

 

Далее закрываете все позиции

 

void CPD(string order_symbol="",int order_type=-1,int order_magic=-1)
  {
   int i,k=OrdersTotal();

   if(order_symbol=="0") order_symbol=Symbol();
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==order_symbol || order_symbol=="") && (order_type<0 || OrderType()==order_type))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(order_magic<0 || OrderMagicNumber()==order_magic) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),1,CLR_GREEN);
              }
           }
        }
     }
  }


 

 
Vladislav Andruschenko:

...

функция возвращает профит в октрытых позах, можно фильтровать по символу, типу, магику

 

Далее закрываете все позиции

 

 

Спасибо, но меня интересует закрытие по убытку. Как это можно реализовать?
 

ну в смысле я же Вам выше все дал, 

соответственно профит это понятие общее

-20 это -20

 if(GetProfitinCurrency(Symbol(),-1,-1)<-20)CPD(Symbol(),-1,-1);

 
Vladislav Andruschenko:

double GetProfitinCurrency(string order_symbol="",int order_type=-1,int order_magic=-1)
  {
   double profit=0;
   int    i,k=OrdersTotal();

   if(order_symbol=="0") order_symbol=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==order_symbol || order_symbol=="") && (order_type<0 || OrderType()==order_type))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(order_magic<0 || OrderMagicNumber()==order_magic)
                 {
                  profit+=OrderProfit()+OrderCommission()+OrderSwap();
                 }
              }
           }
        }
     }
   return(profit);
  }

Спасибо теперь я понял.

 В коде еще не ясен такой момент:  (order_type<0 || OrderType()==order_type) ЭТО можно читать примерно как "и ордер на продажу или покупку"?

 
RichLux:

да order_type = OP_BUY OP_SELL -1

 

компилятор еще ругается на ClosePosBySelect.

Эту функцию отдельно надо прописать? 

 
Комментарии, не относящиеся к этой теме, были перенесены в "Вывел на график текущее время".
 

Vladislav Andruschenko

RichLux:

компилятор еще ругается на ClosePosBySelect.

Эту функцию отдельно надо прописать? 

 

void CPD(string order_symbol="",int order_type=-1,int order_magic=-1)
  {
   int i,k=OrdersTotal();

   if(order_symbol=="0") order_symbol=Symbol();
   for(i=k-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderSymbol()==order_symbol || order_symbol=="") && (order_type<0 || OrderType()==order_type))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(order_magic<0 || OrderMagicNumber()==order_magic) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),1,CLR_GREEN);
              }
           }
        }
     }
  }
 
Здравствуйте. Какой код добавить , чтобы  появление алерта любого индикатора определялось в советнике ?

как определить появление алерта через iCustom ? 

Может быть вы знаете уже существующие индикаторы\советники для этого  ?   
 
RichLux:

пишу советник, который работает по мартингейлу.

Как заставить его закрывать все открытые им ордера при достижении максимально допустимого убытка в пунктах на одной валютной паре? 

Если нужно действительно в пунктах, а не в деньгах, то вот функция, применять так-же, как и прошлую

//===============================================================================================
//------------------ Возвращает суммарный профит открытых позиций в пунктах --------------------+
//===============================================================================================
double GetProfitOpenPosInPoint(string symb="0", int type=-1, int mg=-1) {
double p=0, prb=0, prs=0, pr=0;
  if(symb=="0") { symb=Symbol();}
   for(int i=0; i<OrdersTotal(); i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) {
       p=MarketInfo(OrderSymbol(), MODE_POINT)*Sign;
        if(OrderType()==OP_BUY) {
          prb+=((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p);
        }
        if(OrderType()==OP_SELL) {
          prs+=((OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p);
        }
       pr=prb+prs;
     }
}}
  return(pr);
}