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

 

Здравствуйте, я тестирую эту ea и думаю, что закрытие ордеров очень полезно, но в моем случае я не хочу закрывать все открытые ордера, я просто хочу закрывать только прибыльные ордера.

Я изменил значение "CloseProfitableTradesOnly" с false на true, но ордера продолжают закрываться по 1 usd. А я хочу закрыть только прибыльные ордера, когда их сумма достигнет 25 usd. Все закрытые ордера выше 1 usd прибыли.

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

Вот ea и код:

//|$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//|              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 = false; // 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) CloseAllinProfit();
    
    if(BuyProfit+SellProfit >= ProfitTarget) CloseAll(); 

    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()

 


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

Здравствуйте, я тестирую эту ea и думаю, что закрытие ордеров очень полезно, но в моем случае я не хочу закрывать все открытые ордера, я просто хочу закрывать только прибыльные ордера.

Я изменил значение "CloseProfitableTradesOnly" с false на true, но ордера продолжают закрываться по 1 usd. А я хочу закрыть только прибыльные ордера, когда их сумма достигнет 25 usd. Все закрытые ордера выше 1 usd прибыли.


Я думаю, что вы не писали этот код. . .

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

    if(ClosePendingOnly) ClosePendingOrdersOnly();

...но вы должны быть в состоянии прочитать его.

Вы изменили значение "CloseProfitableTradesOnly" с false на true, поэтому, если посмотреть выше, CloseAllinProfit() вызывается ... независимо от общей прибыли.

Попробуйте это изменение:

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

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

    if(ClosePendingOnly) ClosePendingOrdersOnly();
 

Здравствуйте, Raptor, спасибо за ваш ответ.

Я не писал этот код, я просто изменил значение входа "CloseProfitableTradesOnly" с false на true, вот так:

Я пробую с вашими изменениями, но все равно ea не закрывается по цели прибыли, (в данном случае 25 usd.).


Должен ли я также изменить 0.0 на 25.0 в коде?

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

Здравствуйте, Raptor, спасибо за ваш ответ.

Я не писал этот код, я просто изменил значение входа "CloseProfitableTradesOnly" с false на true, вот так:

Я пробую с вашими изменениями, но все равно ea не закрывается по цели прибыли, (в данном случае 25 usd.).


Должен ли я также изменить 0.0 на 25.0 в коде?


Нет, эта строка должна делать то, что вы хотите, вы уверены, что сделали ВСЕ изменения?

    if(CloseProfitableTradesOnly && BuyProfit+SellProfit >= ProfitTarget) CloseAllinProfit();
 
Я изменил
if(CloseAllNow) CloseAll();
    
if(CloseProfitableTradesOnly) CloseAllinProfit();
    
if(BuyProfit+SellProfit >= ProfitTarget) CloseAll(); 

if(ClosePendingOnly) ClosePendingOrdersOnly();

К этому:

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

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

if(ClosePendingOnly) ClosePendingOrdersOnly();


А вход "CloseProfitableTradesOnly" с false, на true.


Но не закрывать. Что еще это может быть?

 
af1:
Я изменил

К этому:


А вход "CloseProfitableTradesOnly" с false, на true.


Но не закрывать. Что еще это может быть?

Возможно, ваша общая прибыль меньше 25,0
 
RaptorUK:
Возможно, ваша общая прибыль меньше 25,0


Если меньше 25, то закрытие должно происходить еще быстрее.

 
af1:


Если меньше 25, то закрытие должно произойти еще быстрее.

Нет, прибыль должна быть больше или равна 25.0, прежде чем она закроется. ...

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

Нет, прибыль должна быть больше или равна 25,0, прежде чем она закроется...


Вот пример Raptor. У меня есть 4 ордера с прибылью 97,9. Если моя цель по прибыли равна 25, а условие "CloseProfitableTradesOnly" true, то эти 4 ордера должны закрыться. Но ни один ордер не закрывается.

 
af1:


Вот пример Raptor. У меня есть 4 ордера с прибылью 97,9. Если моя цель по прибыли 25, а условие "CloseProfitableTradesOnly" true, то эти 4 ордера должны закрыться. Но ни один ордер не закрывается.

Нет, общая прибыль должна быть больше, чем равна 25.0, у вас -59.80.