系统交易 게시글

如何使用EA在MetaTrader 4中根据目标获利或止损平仓

첨부파일
34194.zip (995 bytes, 다운로드 0회)
我们将这个EA作为一个交易工具来使用。

使用此EA需要设置三个输入参数,如下所示:

  • 利润目标
  • 止损金额
  • 魔法数字
extern    double         inTargetProfitMoney     = 10;       //目标利润 ($)
extern    double         inCutLossMoney          = 0.0      //止损金额 ($)
extern    int            inMagicNumber           = 0        //魔法数字


当这个EA被执行时,首先会调用OnInit ()函数。在这里我们将验证输入和变量的初始化。

int OnInit()
  {
//---
   if(inTargetProfitMoney <= 0)
     {
      Alert("输入无效");
      return(INIT_PARAMETERS_INCORRECT);
     }

   inCutLossMoney = MathAbs(inCutLossMoney) * -1;

//---
   return(INIT_SUCCEEDED);
  }


每当价格波动(tick)时,会调用OnTick ()函数。

void OnTick()
  {
//---

   double   tFloating = 0.0;
   int tOrder  = OrdersTotal();
   for(int i=tOrder-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderMagicNumber() == inMagicNumber)
           {
            tFloating   += OrderProfit()+OrderCommission() + OrderSwap();
           }
        }
    }

   if(tFloating >= inTargetProfitMoney || (tFloating <= inCutLossMoney && inCutLossMoney < 0))
     {
      fCloseAllOrders();
    }

  }

在OnTick函数中,它会继续计算总的盈利或亏损,然后关闭所有达到目标或超过最大亏损限制的订单。

void fCloseAllOrders()
  {
   double   priceClose = 0.0;
   int tOrders = OrdersTotal();
   for(int i=tOrders-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderMagicNumber() == inMagicNumber && (OrderType() == OP_BUY || OrderType() == OP_SELL))
           {
            priceClose  = (OrderType()==OP_BUY)?MarketInfo(OrderSymbol(), MODE_BID):MarketInfo(OrderSymbol(), MODE_ASK);
            if(!OrderClose(OrderTicket(), OrderLots(), priceClose, slippage, clrGold))
              {
               Print("警告:平仓失败");
              }
           }
        }
    }
  }


想了解更多详细信息,欢迎加入我们的Telegram交流群,分享MQL4代码的学习经验。t.me/codeMQL




연관 포스트

댓글 (0)