利益目標で、利益が出ている取引のみを決済する。 - ページ 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.

以前、デブリーズとラプターから提供されたコードの行を使っても?

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:

以前、デブリーズとラプターから提供されたコードの行を使っても?

願わくば、この行を変更せず、検討していたのですね

もし、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つのextern boolを追加して、「BuyTradesOnly」と「SellTradesOnly」の ような名前で、両方とも初期値をfalseに 設定することができると思うのですが。

では

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

入力パラメータに2つのextern 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;
         }

だから今、私は2つのEAを持っています。一つは買いのクローズ、もう一つは売りのクローズです。それは私にとってはOKです。


私はデモとリアルの両方のアカウントでテストしました。デモでは問題なく動作していますが、リアル口座では、利益目標に達するとポジションを閉じ始めますが、残りの注文が利益目標より下がるとポジションを閉じるのを止めます。これは、クローズの瞬間に価格が変化している場合に起こります。そのため、利益が出ている注文をすべて決済するのではなく、未決済のままにしておく傾向があります(利益が出ている注文)。

私はRaptorUKhttps://www.mql5.com/en/forum/139654 からこのポストを読んだ。それはそのようなものですが、私は本当にこの問題のための最善の解決策である可能性がわからない。


 
af1:


RaptorUKのこの投稿を読みましたhttps://www.mql5.com/en/forum/139654.それはそのようなものですが、私は本当にこの問題のための最良の解決策になる可能性があるのか分からない。

解決策はスレッドで与えられている . ... それが私がそれを作成した理由である。 ループのカウントダウンが上がらない。
 
RaptorUK:
解決策は、スレッドに記載されています ... ... それが私がそれを作成した理由です。 ループの中でカウントダウンするのではなく、アップする。


OK Raptor、私はそのループを作るために試してみますが、その前に、私はちょうど変更する場合はどうなりますか?

これより。
}
      Sleep(1000);
   }
これを
}
      Sleep(5000);
      RefreshRates();
      continue;
   }


これならできるかな?