利益目標で、利益が出ている取引のみを決済する。

 

このEAをテストしていて、注文を閉じるのはとても便利だと思うのですが、私の場合、すべてのオープンオーダーを閉じるのではなく、利益のあるオーダーだけを閉じたいのです。

CloseProfitableTradesOnly」の値をfalseからtrueに変更しましたが、注文は1usdで決済され続けています。そして、私が探しているのは、一緒に25usdに達したときに、利益の出る注文だけをクローズすることです。1usd以上の利益が出ている注文は全て決済されます。

もし何か提案があれば、私は本当にそれを感謝します。あなたの助けのための先に感謝します。

以下は、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に変更しましたが、注文は1usdで決済され続けています。そして、私が探しているのは、一緒に25usdに達したときに、利益の出る注文だけをクローズすることです。1usd以上の利益が出ている注文は全て決済されます。


私はあなたがこのコードを書かなかったと思います。. .

    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米ドル)。


コードも0.0から25.0に変更しなければならないのでしょうか?

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

Raptorさん、回答ありがとうございます。

私はこのコードを書いたわけではなく、このように「CloseProfitableTradesOnly」の入力値をfalseからtrueに変更しただけです。

あなたの変更を試していますが、まだEAは利益目標(この場合は25米ドル)でクローズしません。


コードで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の例です。私は97.9の利益で4つの注文を持っています。もし私の利益目標が25で、条件が "CloseProfitableTradesOnly "が真なら、これらの4つの注文はクローズするはずです。しかし、どの注文も決済されません。

 
af1:


例のRaptorです。97.9の利益を持つ4つの注文を持っています。もし、利益目標が25で、条件が "CloseProfitableTradesOnly" trueなら、これらの4つの注文は閉じるはずです。しかし、どの注文も決済されません。

いいえ、利益の合計が25.0以上でなければなりません、あなたの場合は-59.80です。
理由: