Скачать MetaTrader 5

Подскажите почему не закрываются ордера - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
liza
1052
liza  

Пропускает отложенные ордера,

а затем удаляет ордер с наименьши profit'ом. 

Victor Nikolaev
Модератор
15552
Victor Nikolaev  
liza:

Пропускает отложенные ордера,

а затем удаляет ордер с наименьши profit'ом. 

Можно сделать примерно так

int cbd()
  {
   double profit=999999999;
   int ticket=-1;

   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
      if(OrderSymbol()!=Symbol())continue;
      if(OrderProfit()<profit) 
        {
         profit=OrderProfit();
         ticket=OrderTicket();
        }
     }
   OrderSelect(ticket,SELECT_BY_TICKET);
   OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,CLR_NONE);
   return(0);
  }
liza
1052
liza  
А что значит OrderClosePrice()?
Victor Nikolaev
Модератор
15552
Victor Nikolaev  
liza:
А что значит OrderClosePrice()?

Если работать не будет, то подставите нужную цену.

На самом деле недокументированная возможность, пока работает, но в любой момент может прекратить. 

liza
1052
liza  

То что Вы предлагаете закрывает один

ордер.  Мре надо чтобы закрылись все

открытые ордера после достижения

общенй суммарной, положительной 

 прибыли.  Вот что я сделала еще.

allprofit() -- возвращает суммарную

прибыль.

lpt() -- возвращает ticket ордера с

наиеньшей прибылью.

cbd()  не работает.

взгляните пожалуйста!

 


double allprofit()

{

double s = 0;

for(int i=OrdersTotal()-1;i>=0;i--)

  {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

    {

      if( OrderSymbol()!=Symbol() || OrderType() == OP_BUY ||

    OrderType() == OP_SELL)

      {

      s += OrderProfit();

      }

    }

  }

return(s);

}


int lpt()

  {

int pr;

double oct = EMPTY_VALUE;

int j=-1;


for(int i=OrdersTotal()-1;i>=0;i--){

   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;  

   if(OrderSymbol()!=Symbol())continue;

   { 

   if(OrderType() == OP_SELL || OrderType() == OP_BUY) 

   { 

   if (oct > OrderProfit()) { oct=OrderProfit(); j=i;}           

   if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) 

      {

      pr = OrderTicket();

      }}}}

      return(pr);

      }


     

int cbd()

{

double oct = EMPTY_VALUE, a = allprofit()*10;

int j=-1, t = lpt();


for(int i=OrdersTotal()-1;i>=0;i--){

 if(a > profit*lot*10) {

  if(OrderType() == OP_BUY || OrderType() == OP_SELL) 

   { 

   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;  

   if(OrderSymbol()!=Symbol())continue;

   { 

   if (OrderTicket() == t) 

      {

      if(OrderType() == OP_BUY)

      {

        OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);

      }

     else if (OrderType() == OP_SELL)

      { 

      OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);

      }

      }}}}}

 return(0);

 }      

keekkenen
1135
keekkenen  

про cbd()

вот тут

if(a > profit*lot*10) {

не ясно что есть profit и lot 

и не ясно зачем этот if(a > profit*lot*10) {

вставлять в цикл for и каждый раз его проверять ?

 и следующая строка

 if(OrderType() == OP_BUY || OrderType() == OP_SELL) 

не на своем месте, она должна быть после  

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;   

 

и далее

if (OrderTicket() == t) 

никогда не сработает, потому что  lpt() всегда будет возвращать 0

почему ?

вот,  

oct = EMPTY_VALUE; 

поэтому  

if (oct > OrderProfit()) { oct=OrderProfit(); j=i;}   

никогда (почти никогда) не сработает, т.к. EMPTY_VALUE=2147483647

а отсюда следует, что j так и останется -1, и как следствие pr так и останется 0
liza
1052
liza  

Переделала

int oct = 10000000;

lpt() -- возвращает ticket . 

 profit -- количество пунктов

больше которого дожно быь

сумарное количество всех пунктов

во всех ордерах по данному символу

что выдает функция allprofit(). 

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий