Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2374

 
234      
Tretyakov Rostyslav #:

Большое спасибо! Но пока не могу решить проблему! На скрине изображено то чего добиваюсь. Словами это выглядит так. Если имеет место ситуация когда общий профит всех ордеров "sell" плюс профит самого убыточного ордера "buy"(отрицательная величина!!!) на определенное количество $$$ больше, тогда закрываем все "sell"   и  самый убыточный "buy". Иными словами :  если профит всех sell превышает убыток самого убыточного buy на определенное количество $$$,  тогда закрываем все "sell"   и  самый убыточный "buy". 

Количество ордеров  на скрине cхематично может быть любое, главное чтобы выполнялось условие. Ну и симметричная ситуация buy-sell естесств. может быть.


Вобщем кто может помогите!

 
Volodymyr Zubov #:

Обойдитесь без всяких циклов, используя общий профит счета и если условие закрытия устраивает то закрывайте всё и неважно кто там был самый убыточный)

Ну или если нужно более тонкий отбор, по символу, открытым позициям, магик номеру, тогда вычисляйте общий профит следующей функцией и определяйте что с этим профитом делать)

Большое спасибо! Выше я объяснил почему так мне нужно.
 
!!! Наполовину решил

 

int GetOrderTicket() //тикет
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(ticket);
  }
double GetOrderProfit() // профит
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(prf);
  }


 if((AllProfit(1)+GetOrderProfit())>1) CloseAll(1);// закрытие всех sell - работает

    if((AllProfit(1)+GetOrderProfit())>1) 

    OrderClose(GetOrderTicket(),Lots,Bid,30,Red);   // закрытие самого убыточного buy - не работает, требует проверки (return value of "OrderClose" should be checked)

    {        

      return;

    }

 
int GetOrderTicket() //тикет
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(ticket);
  }
double GetOrderProfit() // профит
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)




              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();

               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}

              }
           }



        }
     }
   return(prf);

  }

 
vova1122 #:

 

int GetOrderTicket() //тикет
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(ticket);
  }
double GetOrderProfit() // профит
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(prf);
  }


 if((AllProfit(1)+GetOrderProfit())>1) CloseAll(1);// закрытие всех sell - работает

    if((AllProfit(1)+GetOrderProfit())>1) 

    OrderClose(GetOrderTicket(),Lots,Bid,30,Red);   // закрытие самого убыточного buy - не работает, требует проверки (return value of "OrderClose" should be checked)

    {        

      return;

    }


bool res=false;

res=OrderClose(GetOrderTicket(),Lots,Bid,30,clrRed);   // закрытие самого убыточного buy
if(res)
              {
               break;
              }
            else
              {
               int err=GetLastError();
               if(err==146)
                  while(IsTradeContextBusy())
                     Sleep(1000);
               Print("Close Error(",err,") ",OrderType()==0?"Buy=":"Sell=",OrderSymbol(),", Ticket: ",OrderTicket(), ", Price: ",
                     DoubleToStr(p,(int)MarketInfo(OrderSymbol(), MODE_DIGITS)),", Lot: ",OrderLots(),", Profit: ",DoubleToStr(pr,2));
               Sleep(1000*5);
              }
 
vova1122 #:
не работает, требует проверки
if(OrderClose(GetOrderTicket(),Lots,Bid,30,Red)) Print("Ордер закрыт"); else Print("Ошибка закрытия");
 
vova1122 #:

 

int GetOrderTicket() //тикет
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(ticket);
  }
double GetOrderProfit() // профит
  {
   double prf=0,_prf=0;
   int ticket=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType()==OP_SELL||OrderType()==OP_BUY)
              {
               prf=OrderProfit()+OrderSwap()+OrderCommission();
               if(prf<_prf) {_prf=prf; ticket=OrderTicket();}
              }
           }
        }
     }
   return(prf);
  }

Вам надо сравнить один самый убыточный OP_BUY, со всеми OP_SELL? Так?

Тогда, их надо считать раздельно. Сейчас они в кучу, вместе взятые.

Например так:

int GetOrderTicket() //тикет
  {
   double prf=0,_prf_sell=0,_prf_buy=0;
   int ticket_sell=0;
   int tiket_buy=0;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
           {
            prf=OrderProfit()+OrderSwap()+OrderCommission();
            
            if(OrderType()==OP_SELL)
              {
               if(prf<_prf_sell) {_prf_sell=prf; ticket_sell=OrderTicket();}
              }
            if(OrderType()==OP_BUY)
              {
               if(prf<_prf_buy) {_prf_buy=prf; ticket_buy=OrderTicket();}
              }
           }
        }
     }
   if(_prf_sell < _prf_buy)return(ticket_sell);   
     else return(ticket_buy);
  }
 

Для

double GetOrderProfit() // профит

тоже разделить, и считать сумму профитов. (Дальше не знаю, как вам требуется, общую сумму, или сумму только убыточных.)

 

Добрый день. Подскажите пожалуйста почему пользовательский звук не воспроизводится функцией PlaySound(); Звуковой файл добавил в папку \Sounds

extern string SoundFile  =  "sound.wav";

...

PlaySound(SoundFile);

Играет какой-то стандартный звук. Почему так?

 
mt1002 #:

Добрый день. Подскажите пожалуйста почему пользовательский звук не воспроизводится функцией PlaySound(); Звуковой файл добавил в папку \Sounds

extern string SoundFile  =  "sound.wav";

...

PlaySound(SoundFile);

Играет какой-то стандартный звук. Почему так?

Возвращаемое значение true?

 
Putnik #:

Возвращаемое значение true?

Как это проверить? Там другой звук играет.