Закрывайте только прибыльные сделки, достигая цели по прибыли - страница 3

 
af1:

Hi GumRai, thanks for your time. I've already tried with your changes, but orders keep closing at 1. In other words, profitable orders are not waiting to reach 25.

Даже используя строку кода, ранее предоставленную DeVries и Raptor?

if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll(); 

    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit();

    if(ClosePendingOnly) ClosePendingOrdersOnly();

Надеюсь, вы не изменили эту строку, а рассматривали ее.

if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();

Если вы изменили ее на 25.00, то у вас будут закрыты все прибыльные сделки на $1+.

 
GumRai:

Даже используя строку кода, ранее предоставленную DeVries и Raptor?

Надеюсь, вы не изменили эту строку, а рассматривали ее.

Если вы изменили ее на 25.00, то у вас будут закрыты все прибыльные сделки на $1+.


Я попробовал все предложения, но все еще не закрывается правильно.

 
af1:


Я попробовал все предложения, но все еще не закрывается правильно.


Может быть, вы можете показать полный код, который вы используете в настоящее время
 
GumRai:

Возможно, вы можете показать полный код, который вы используете в настоящее время

//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//|              Close 
//|   Last Updated 12-12-2006 10:00pm
//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
#define     NL    "\n" 

extern int    ProfitTarget     = 25;             // closes all orders once Float hits this $ amount
extern bool   CloseAllNow      = false;          // closes all orders now
extern bool   CloseProfitableTradesOnly = true; // closes only profitable trades
extern double ProftableTradeAmount      = 1;     // Only trades above this amount close out
extern bool   ClosePendingOnly = false;          // closes pending orders only
extern bool   UseAlerts        = false;

//+-------------+
//| Custom init |
//|-------------+
int init()
  {

  }

//+----------------+
//| Custom DE-init |
//+----------------+
int deinit()
  {

  }

//+------------------------------------------------------------------------+
//| Closes everything
//+------------------------------------------------------------------------+
void CloseAll()
{
   int i;
   bool result = false;

   while(OrdersTotal()>0)
   {
      // Close open positions first to lock in profit/loss
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType() == OP_BUY)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 15, Red );
         if ( OrderType() == OP_SELL)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 15, Red );
         if (UseAlerts) PlaySound("alert.wav");
      }
      for(i=OrdersTotal()-1;i>=0;i--)
      {
         if(OrderSelect(i, SELECT_BY_POS)==false) continue;

         result = false;
         if ( OrderType()== OP_BUYSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_BUYLIMIT)  result = OrderDelete( OrderTicket() );
         if ( OrderType()== OP_SELLLIMIT)  result = OrderDelete( OrderTicket() );
         if (UseAlerts) PlaySound("alert.wav");
      }
      Sleep(1000);
   }
}
   
//+------------------------------------------------------------------------+
//| cancels all orders that are in profit
//+------------------------------------------------------------------------+
void CloseAllinProfit()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType() == OP_BUY && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
        if ( OrderType() == OP_SELL && OrderProfit()+OrderSwap()>ProftableTradeAmount)  result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
        if (UseAlerts) PlaySound("alert.wav");
 }
  return; 
}

//+------------------------------------------------------------------------+
//| cancels all pending orders 
//+------------------------------------------------------------------------+
void ClosePendingOrdersOnly()
{
  for(int i=OrdersTotal()-1;i>=0;i--)
 {
    OrderSelect(i, SELECT_BY_POS);
    bool result = false;
        if ( OrderType()== OP_BUYSTOP)   result = OrderDelete( OrderTicket() );
        if ( OrderType()== OP_SELLSTOP)  result = OrderDelete( OrderTicket() );
  }
  return; 
  }

//+-----------+
//| Main      |
//+-----------+
int start()
  {
   int      OrdersBUY;
   int      OrdersSELL;
   double   BuyLots, SellLots, BuyProfit, SellProfit;

//+------------------------------------------------------------------+
//  Determine last order price                                       |
//-------------------------------------------------------------------+
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            BuyProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
         if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots();
            SellProfit += OrderProfit() + OrderCommission() + OrderSwap();
         }
      }               
   
    if(CloseAllNow) CloseAll();
    
    if(CloseProfitableTradesOnly && ProfitTarget == 0.0) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget && !CloseProfitableTradesOnly) CloseAll();
    
    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit(); 

    if(ClosePendingOnly) ClosePendingOrdersOnly();
       
   
   Comment("                            Comments Last Update 12-12-2006 10:00pm", NL,
           "                            Buys    ", OrdersBUY, NL,
           "                            BuyLots        ", BuyLots, NL,
           "                            Sells    ", OrdersSELL, NL,
           "                            SellLots        ", SellLots, NL,
           "                            Balance ", AccountBalance(), NL,
           "                            Equity        ", AccountEquity(), NL,
           "                            Margin              ", AccountMargin(), NL,
           "                            MarginPercent        ", MathRound((AccountEquity()/AccountMargin())*100), NL,
           "                            Current Time is  ",TimeHour(CurTime()),":",TimeMinute(CurTime()),".",TimeSeconds(CurTime()));
 } // start()

 


 

Пожалуйста, вернитесь к моему сообщению

https://forum.mql4.com/56959/page2#822980

Вы не суммируете только прибыльные сделки. Вы вычисляете чистую прибыль или убыток

 
GumRai:

Пожалуйста, вернитесь к моему сообщению

https://forum.mql4.com/56959/page2#822980

Вы не суммируете только прибыльные сделки. Вы вычисляете чистую прибыль или убыток.



GumRai, я сделал изменения в коде, предложенные Raptor и вами:

https://www.mql5.com/en/forum/146091
https://www.mql5.com/en/forum/146091/page2#822980

И теперь он, кажется, закрывается правильно. Спасибо за это!


Еще один вопрос. Если я хочу вычислять только прибыльные сделки на покупку или только прибыльные сделки на продажу, вместо того, чтобы вычислять все прибыльные сделки, что я должен изменить?

Я думаю, что это изменение для расчета только покупок, но я не уверен. Это правильно?

от этого:

if(OrderType()==OP_SELL) 
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

к этому:

//if(OrderType()==OP_SELL) 
         {
            //OrdersSELL++;
            //SellLots += OrderLots(); 
            //ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            //if(ThisTradeProfit>0)
            //BuyProfit += ThisTradeProfit;
         }
 

Я полагаю, что вы можете добавить 2 внешних bool к входным параметрам, названных чем-то вроде "BuyTradesOnly" и "SellTradesOnly", оба из которых изначально установлены в false

затем

if(OrderType()==OP_SELL && BuyTradesOnly == false)
         {
            OrdersSELL++;
            SellLots += OrderLots(); 
            ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }
 
GumRai:

Я полагаю, что вы можете добавить 2 внешних bool к входным параметрам, названных чем-то вроде "BuyTradesOnly" и "SellTradesOnly", оба из которых изначально установлены в false

затем


Я не добавлял 2 extern bool, я просто изменил это, чтобы закрыть "только ордера на покупку".

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_BUY)  
         {
            OrdersBUY++;
            BuyLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

и изменить это на закрытие "только ордера на продажу".

for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
         if(OrderType()==OP_SELL)  
         {
            OrdersSELL++;
            SellLots += OrderLots();
            double ThisTradeProfit=OrderProfit() + OrderCommission() + OrderSwap();
            if(ThisTradeProfit>0)
            BuyProfit += ThisTradeProfit;
         }

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


Я тестировал на обоих счетах, демо и реальном. На демо все работает нормально, но на реальном счете, как только цель прибыли достигнута, он начинает закрывать позиции, но затем он прекращает закрывать позиции, когда оставшиеся ордера падают ниже цели прибыли. Это происходит, если цена меняется в момент закрытия. Поэтому он склонен оставлять открытыми прибыльные ордера, вместо того чтобы закрыть их все (прибыльные ордера).

Я читал этот пост от RaptorUK https://www.mql5.com/en/forum/139654. Это что-то вроде этого, но я действительно не знаю, что может быть лучшим решением для этой проблемы.


 
af1:


Я прочитал этот пост от RaptorUK https://www.mql5.com/en/forum/139654. Это что-то вроде этого, но я действительно не знаю, что может быть лучшим решением для этой проблемы.

Решение приведено в этой теме ... поэтому я и создал ее. Отсчет в цикле не вверх.
 
RaptorUK:
Решение приведено в теме ... поэтому я и создал ее. Отсчет в цикле идет вниз, а не вверх.


Хорошо, Raptor, я попробую сделать этот цикл, но прежде чем сделать это, что если я просто изменю

из этого:
}
      Sleep(1000);
   }
к этому:
}
      Sleep(5000);
      RefreshRates();
      continue;
   }


Может ли это сделать работу?

Причина обращения: