找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 28|回复: 0

【MQL4函数】开仓模块

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-27 21:57:00 | 显示全部楼层 |阅读模式
要实现开仓当然非常简单,只要一个开仓函数就可以了,但是实际交易的时候可没有这么容易,我们会碰到两个问题。第一个问题就是手数的问题,我们的EA计算出来的手数有可能会小于最小手数,也有可能会大于最大手数,当小于最小手数时,我们不做单,当大于最大手数时我们把单子拆开来分成几单来做,这一部分内容可以参考第五节课。第二个问题就是开仓遇到的问题,比如说由于卡顿导致订单没有成交等等,此时我们需要立即再发送开单命令,直到成交为止。根据以上问题我们把程序写出来,代码如下:

int orderopen(string sym,string direction,double lot,double sl,double tp,int mag,string comment)
{
   int check;
   double lot_min=MarketInfo(sym,MODE_MINLOT);
   double lot_max=MarketInfo(sym,MODE_MAXLOT);
   double lot_last=0;
   int err=0;
   int huadian=10;
   double amount;
   int i;
   if(lot<lot_min)
   {
      Print("lot is too small");
      return(1);
   }
   else if(lot>lot_max)
   {
      amount=MathCeil(lot/lot_max);
      lot_last=lot-(amount-1)*lot_max;
      for(i=(int)amount;i>0;i--)
                {
              if (i!=1)
              {
                 if(direction=="BUY")
                 {
                    do
                    {
check=OrderSend(sym,OP_BUY,lot_max,MarketInfo(sym,
MODE_ASK),huadian,sl,tp,comment,mag,0,clrBlue);
                  if(check==-1)
                  {
                     err=GetLastError();
                  }
                  else
                  {
                     break;
                  }
               }while(err==146 || err==135);
            }
            else if(direction=="SELL")
            {
                    do
                    {
check=OrderSend(sym,OP_SELL,lot_max,MarketInfo(sym,
MODE_BID),huadian,sl,tp,comment,mag,0,clrRed);
                  if(check==-1)
                  {
                     err=GetLastError();
                  }
                  else
                  {
                     break;
                  }
               }while(err==146 || err==135);
            }
              }
              else
              {
                 if(direction=="BUY")
                 {
                    do
                    {
check=OrderSend(sym,OP_BUY,lot_last,MarketInfo(sym,
MODE_ASK),huadian,sl,tp,comment,mag,0,clrBlue);
                  if(check==-1)
                  {
                     err=GetLastError();
                  }
                  else
                  {
                     break;
                  }
               }while(err==146 || err==135);
            }
            else if(direction=="SELL")
            {
                    do
                    {
check=OrderSend(sym,OP_SELL,lot_last,MarketInfo(sym,
MODE_BID),huadian,sl,tp,comment,mag,0,clrRed);
                  if(check==-1)
                  {
                     err=GetLastError();
                  }
                  else
                  {
                     break;
                  }
               }while(err==146 || err==135);
            }
              }
      }
   }
   else
   {
      if(direction=="BUY")
      {
              do
              {
check=OrderSend(sym,OP_BUY,lot,MarketInfo(sym,
MODE_BID),huadian,sl,tp,comment,mag,0,clrBlue);
            if(check==-1)
            {
               err=GetLastError();
            }
            else
            {
               break;
            }
         }while(err==146 || err==135);
      }
      if(direction=="SELL")
      {
              do
              {
check=OrderSend(sym,OP_SELL,lot,MarketInfo(sym,
MODE_BID),huadian,sl,tp,comment,mag,0,clrRed);
            if(check==-1)
            {
               err=GetLastError();
            }
            else
            {
               break;
            }
         }while(err==146 || err==135);
      }
   }
   return(0);
}      

复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-9 16:53 , Processed in 0.389598 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表