15评论

0收藏

求助:修改下单量

avatar hwq597 | 4189 人阅读 | 15 人评论 | 2017-07-02

本帖最后由 hwq597 于 2017-7-3 07:51 编辑

如何把固定的下单量改成下面用公式表示的下单量(只用到小数点后2位,附合下单要求)

下单量=(资金*10/100)/(市场价格/500)  

extern double 下单量=0.1;
extern int 止损点数=0;
extern int 止盈点数=0;
extern int 移动止损点数=500;
extern int magic=52142;
datetime buytime=0;
datetime selltime=0;
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {   
  }
void OnTick()
{              
     double k0=iCustom(Symbol(),0,"KD",0,0);
     double d0=iCustom(Symbol(),0,"KD",1,0);
     double k1=iCustom(Symbol(),0,"KD",0,1);
     double d1=iCustom(Symbol(),0,"KD",1,1);
                                                           
     if(k0>d0 && k1<d1)//buy
        {
          closesell(Symbol()+"sell",magic);
          if(buytime!=Time[0])
           {
           
             if(buy(下单量,止损点数,止盈点数,Symbol()+"buy",magic)>0)
             {
               buytime=Time[0];
             }
          }
       }      
     if(k0<d0 && k1>d1)//sell
       {
         closebuy(Symbol()+"buy",magic);        
         if(selltime!=Time[0])
          {
            if(sell(下单量,止损点数,止盈点数,Symbol()+"sell",magic)>0)
              {
                selltime=Time[0];
              }
          }
       }         
      yidong();
  }
void yidong()
  {
     for(int i=0;i<OrdersTotal();i++)//移动止损通用代码,次代码会自动检测buy和sell单并对其移动止损
         {
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
              {
                if(OrderType()==0 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
                  {
                     if((Bid-OrderOpenPrice())>=Point*移动止损点数)
                      {
                         if(OrderStopLoss()<(Bid-Point*移动止损点数) || (OrderStopLoss()==0))
                           {
                              OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*移动止损点数,OrderTakeProfit(),0,Green);
                           }
                      }      
                  }
                if(OrderType()==1 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
                  {
                    if((OrderOpenPrice()-Ask)>=(Point*移动止损点数))
                      {
                         if((OrderStopLoss()>(Ask+Point*移动止损点数)) || (OrderStopLoss()==0))
                           {
                              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*移动止损点数,OrderTakeProfit(),0,Green);
                           }
                      }
                  }
              }
         }
   }
void closebuy(string com,int magic)
  {
     int t=OrdersTotal();
     for(int i=t-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
          {
            if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderComment()==com && OrderMagicNumber()==magic)
              {
                OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
              }
          }
      }
  }
void closesell(string com,int magic)
  {
     int t=OrdersTotal();
     for(int i=t-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
          {
            if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderComment()==com && OrderMagicNumber()==magic)
              {
                OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),300,Green);
              }
          }
      }
  }
int buy(double lots,double sl,double tp,string com,int buymagic)
  {
    int a=0;
    bool zhaodan=false;
     for(int i=0;i<OrdersTotal();i++)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
          {
            string zhushi=OrderComment();
            int ma=OrderMagicNumber();
            if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && zhushi==com && ma==buymagic)
              {
                zhaodan=true;
                break;
              }
          }
      }
    if(zhaodan==false)
      {
        if(sl!=0 && tp==0)
         {
          a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-sl*Point,0,com,buymagic,0,White);
         }
        if(sl==0 && tp!=0)
         {
          a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,Ask+tp*Point,com,buymagic,0,White);
         }
        if(sl==0 && tp==0)
         {
          a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,0,0,com,buymagic,0,White);
         }
        if(sl!=0 && tp!=0)
         {
          a=OrderSend(Symbol(),OP_BUY,lots,Ask,50,Ask-sl*Point,Ask+tp*Point,com,buymagic,0,White);
         }
      }
    return(a);
  }
int sell(double lots,double sl,double tp,string com,int sellmagic)
  {
    int a=0;
    bool zhaodan=false;
     for(int i=0;i<OrdersTotal();i++)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
          {
            string zhushi=OrderComment();
            int ma=OrderMagicNumber();
            if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && zhushi==com && ma==sellmagic)
              {
                zhaodan=true;
                break;
              }
          }
      }
    if(zhaodan==false)
      {
        if(sl==0 && tp!=0)
         {
           a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,Bid-tp*Point,com,sellmagic,0,Red);
         }
        if(sl!=0 && tp==0)
         {
           a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+sl*Point,0,com,sellmagic,0,Red);
         }
        if(sl==0 && tp==0)
         {
           a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,0,0,com,sellmagic,0,Red);
         }
        if(sl!=0 && tp!=0)
         {
           a=OrderSend(Symbol(),OP_SELL,lots,Bid,50,Bid+sl*Point,Bid-tp*Point,com,sellmagic,0,Red);
         }
      }
    return(a);
  }
  



""
还没有人打赏,支持一下

评论|共 15 个

张玲

发表于 2017-7-2 08:37:07 | 显示全部楼层

这个EA你可以参看下
  1. MT4智能交易系统EA顺势加仓的写法:2个月37000倍的EA

  2. //-------自动加仓(对所有单有效)
  3. void TrailPositions11()
  4. {
  5. int cnt = OrdersTotal();
  6. for (int i=0; i<cnt; i++)
  7. {
  8. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  9. int type = OrderType();
  10. if (type == OP_SELL  )
  11. {
  12. if(CalculateSellOrders()<1  && CalculateSell()<10   && CalculateBuy()<1 && Close[0]<PJ1)
  13. {
  14. OrderSend(Symbol(),OP_SELLSTOP,LotSize() ,Bid-15*Point,3,Bid+15*Point,Bid-360*Point,"顺向挂STOP卖单",MAGICMA33,expire2,Green);
  15. }

  16. else
  17. return (0);
  18. }
  19. }
  20. }

  21. //-------自动加仓(对所有单有效)
  22. void TrailPositions011()
  23. {
  24. int cnt = OrdersTotal();
  25. for (int i=0; i<cnt; i++)
  26. {
  27. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  28. int type = OrderType();
  29. if (type == OP_BUY )

  30. {if (CalculateBuyOrders()<1 && CalculateBuy()<10  && CalculateSell()<1   && Close[0]>PJ1)
  31. {
  32. OrderSend(Symbol(),OP_BUYSTOP,LotSize(),Ask+15*Point,3,Ask-15*Point,Ask+360*Point,"顺向挂STOP买单",MAGICMA33,expire2,Red);
  33. }
  34. else
  35. return (0);
  36. }
  37. }
  38. }
  39. 其中还有子函数限制开仓数:CalculateBuyOrders()买单挂仓单数,CalculateSellOrders()卖单挂仓单数;CalculateBuy()买单数,CalculateSell()卖单数;PJ1是一分钟平均线60;LotSize()按资金量开仓控制;



  40. 1、CalculateBuyOrders()买单挂仓单数:


  41. int CalculateBuyOrders()//计算STOP多挂单的张数
  42. {
  43. int buys=0,sells=0;
  44. for(int i=0;i<OrdersTotal();i++)
  45. {
  46. if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  47. if(OrderType()==OP_BUYSTOP   &&   OrderSymbol()==Symbol()  )    buys++;
  48. }
  49. return(buys);
  50. }

  51. 2、CalculateSellOrders()卖单挂仓单数;


  52. int CalculateSellOrders()// 算STOP空挂单的张数
  53. {
  54. int buys=0,sells=0;
  55. for(int i=0;i<OrdersTotal();i++)
  56. {
  57. if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

  58. if(OrderType()==OP_SELLSTOP    &&   OrderSymbol()==Symbol()  ) sells++;
  59. }
  60. return(sells);
  61. }

  62. 3、CalculateBuy()买单数;


  63. int CalculateBuy()//计算多单的张数
  64. {
  65. int buys=0,sells=0;
  66. for(int i=0;i<OrdersTotal();i++)
  67. {
  68. if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
  69. if(OrderType()==OP_BUY  &&   OrderSymbol()==Symbol()  )    buys++;
  70. }
  71. return(buys);
  72. }
  73. 4、CalculateSell()卖单数;


  74. int CalculateSell()// 算空单的张数
  75. {
  76. int buys=0,sells=0;
  77. for(int i=0;i<OrdersTotal();i++)
  78. {
  79. if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

  80. if(OrderType()==OP_SELL    &&   OrderSymbol()==Symbol()  ) sells++;
  81. }
  82. return(sells);
  83. }

  84. 5、LotSize()按资金量开仓控制;


  85. double LotSize() // 下单数量
  86. { double lot=Lots;
  87. int orders=HistoryTotal(); // history orders total
  88. int losses=0; // number of losses orders without a break
  89. //MarketInfo(Symbol(),MODE_MINLOT); 相关信息
  90. //MarketInfo(Symbol(),MODE_MAXLOT);
  91. //MarketInfo(Symbol(),MODE_LOTSTEP);
  92. lot= AccountEquity()/2000; //开仓量计算
  93. if(lot<0.05) lot=0.01;
  94. if(lot>=0.05 && lot<0.07) lot=0.06;
  95. if(lot>=0.07 && lot<0.09) lot=0.08;
  96. if(lot>=0.09 && lot<0.2) lot=0.1;
  97. if(lot>=0.2 && lot<0.3) lot=0.2;
  98. if(lot>=0.3 && lot<0.5) lot=0.4;
  99. if(lot>=0.5 && lot<0.7) lot=0.6;
  100. if(lot>=0.7 && lot<0.9) lot=0.8;
  101. if(lot>=0.9 && lot<2) lot=1;
  102. if(lot>=2 && lot<3) lot=2;
  103. if(lot>=3 && lot<5) lot=4;
  104. if(lot>=5 && lot<7) lot=6;
  105. if(lot>=7 && lot<9) lot=8;
  106. if(lot>=9  ) lot=10;
  107. return(lot);
  108. }
复制代码


荒原飞鸿

发表于 2017-7-2 08:45:40 | 显示全部楼层

if(MoneyManagement==true){                                      //资金管理开关
   double Lot=NormalizeDouble(AccountEquity()*Point/10/100,1);   
// 最大允许开仓比例占资金总量10%,只允许持有一张单,当持有一张单子时,不允许再开新单

hwq597

发表于 2017-7-2 20:48:05 | 显示全部楼层

{:132_160:}{:132_162:}[s:133]

hwq597

发表于 2017-7-3 08:00:15 | 显示全部楼层

资金和价格函数是什么?

hwq597

发表于 2017-7-3 16:26:03 | 显示全部楼层

顶到大师出手为止

hwq597

发表于 2017-7-4 12:59:39 | 显示全部楼层

???????????????????????????????????????????????????????????????????????????????????????????????????????????

翩翩起舞

发表于 2020-6-12 10:00:09 | 显示全部楼层

写的真的很不错

改变

发表于 2020-7-7 15:47:48 | 显示全部楼层

谢谢楼主分享

omelan

发表于 2020-8-6 18:24:11 | 显示全部楼层

学习了,不错

12下一页
您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则