: | : | :期货程序化 | :期货程序化研究 | :期货量化学习 | :期货量化 |
返回列表 发帖

EA框架模型,大部分地方做了注释

EA框架模型,大部分地方做了注释

  1. 现在我学会了EA基本的东西,并且按照框架思路 建立了EA框架模型,大部分地方做了注释。希望对大家有用;
  2. 程序代码如下:
  3. //+------------------------------------------------------------------+
  4. //|                                             ganendexin's 模板.mq4 |
  5. //|                       Copyright ?2008, MetaQuotes Software Corp. |
  6. //|                                        http://www.520fx.com
  7. //+------------------------------------------------------------------+
  8. #property copyright "ganendexin"
  9. #property link      "http://www.520fx.com"

  10. //---- input parameters
  11. extern double    TakeProfit=250.0;
  12. extern double    Lots=0.1;
  13. extern double    TrailingStop=35.0;
  14. //+------------------------------------------------------------------+
  15. //| expert initialization function                                   |
  16. //+------------------------------------------------------------------+
  17. int init()
  18.   {
  19. //----  
  20.   
  21. //----
  22.    return(0);
  23.   }
  24. //+------------------------------------------------------------------+
  25. //| expert deinitialization function                                 |
  26. //+------------------------------------------------------------------+
  27. int deinit()
  28.   {
  29. //----  
  30.    
  31. //----
  32.    return(0);
  33.   }

  34. //信号部分,下面这部分给出的是买卖信号,这个信号可以是自己编写的,也可以是用iCustom来调用的。以后需要修改的大部分是在这里面改
  35. int Crossed (double line1 , double line2)
  36.    {
  37.       static int last_direction = 0;
  38.       static int current_direction = 0;
  39.       
  40. if(line1>line2)current_direction = 1; //up
  41.       
  42.       if(line1<line2)current_direction = 2; //down



  43.       if(current_direction != last_direction) //changed  
  44.       {
  45.             last_direction = current_direction;
  46.             return (last_direction);
  47.       }
  48.       else
  49.       {
  50.             return (0);
  51.       }
  52.    }  
  53.    
  54.    
  55. //+------------------------------------------------------------------+
  56. //| expert start function                                            |
  57. //+------------------------------------------------------------------+
  58. int start()
  59.   {
  60. //----  

  61.    //程序开始前,先定义变量。
  62.    
  63.    int cnt, ticket, total; //用于检查订单的个数及类型,cnt是按照索引来计算,ticket是按照ticket来计算。在算类型之前,要先OrderSelect
  64.    double shortEma, longEma; //这个地方是定义买卖信号的参数的,根据实际需要来定个数和类型。
  65.    int counted_bars;


  66.    //如果需要控制最低的K线个数,可用下面的
  67.    
  68.    
  69.    
  70.   //提示获利点,这个是有的系统对最小获利点有要求的情况下使用。例如FXDD要求为10.
  71.    if(TakeProfit<10)
  72.      {
  73.       Print("TakeProfit less than 10");
  74.       return(0);  // check TakeProfit
  75.      }
  76.       
  77.   //信号函数里面的,参数的取得    重点
  78.    shortEma = iMA(NULL,0,8,0,MODE_EMA,PRICE_CLOSE,0);
  79.    longEma = iMA(NULL,0,13,0,MODE_EMA,PRICE_CLOSE,0);
  80.    
  81.    
  82.    //把计算过的信号返回,并由这个信号来选择开仓等操作。
  83.    int isCrossed  = Crossed (shortEma,longEma);
  84.    
  85.    //判断持仓状态,
  86.    
  87.       //把仓单总数赋值给一个变量,用于下一步计算仓单情况
  88.        total  = OrdersTotal();  
  89.       
  90.        //空仓情况开始  
  91.        //如果有空仓,则计算
  92.    if(total < 1)  
  93.      {
  94.        //如果出现买的信号
  95.        if(isCrossed == 1)
  96.          {
  97. //建立buy单,即多仓,            
  98. ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
  99. "My EA",12345,0,Green);
  100.             //判断是否建仓成功,建仓成功,ticket被赋值为个数字,不是初始的0
  101.             if(ticket>0)
  102.               {
  103.              //检查是否已经成交,重点是检查不是挂单 注意参数 MODE_TRADES
  104.                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
  105. //打印出开仓价格
  106. Print("已BUY,价格为: ",OrderOpenPrice());
  107.               }
  108.             //如果建仓失败,打印出错误提示
  109.             else Print("建BUY仓失败: ",GetLastError());  
  110. //建仓失败后,立即返回,并进行一下次的计算            
  111. return(0);

  112.       
  113.          }
  114.          
  115.          
  116. //如果卖单信号出现 ,注意,此时仍然是指在空仓状态下      
  117.          if(isCrossed == 2)
  118.          {
  119. //建立SELL单,即空头仓,      

  120.             ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,
  121. Bid-TakeProfit*Point,"My EA",12345,0,Red);
  122.             //如果建仓成功
  123.             if(ticket>0)
  124.               {
  125.               //检查是否已经成交,而不是挂单
  126.                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
  127. Print("SELL order opened : ",OrderOpenPrice());
  128.               }
  129.               //建仓失败,输出提示
  130.             else Print("Error opening SELL order : ",GetLastError());  
  131.             //立即返回,准备下一次的计算。
  132.             return(0);
  133.          }
  134.        //如果买卖条件都没有满足,即if(isCrossed!=1&&isCrossed!=2)则直接返回
  135.          return(0);
  136.       //空仓情结束
  137.      }
  138.      
  139.      
  140.   //如果持仓,注意,这里省略了一个else,即if(ticket>0) else,而程序之所以不写else,是因为,当(ticket>0)时,不执行if(ticket<0);这体现出编程者对语句的熟练和深刻理解。希望看这个程序的新手多用心体会。
  141.   
  142.   //开始计算仓单总数,并对所有已持仓当进行判断 ,这里用cnt=0作为开始,是以仓当的索引值开始判断的,而不是ticket。
  143.    for(cnt=0;cnt<total;cnt++) //从索引值为0的仓单开始,直到计算完所有的仓当int total=OrdersTotal;
  144.      {
  145.      //选择仓当,在使用order相关的函数时,必须先运行一次OrderSelect
  146.       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
  147.      //如果是持有的是买单
  148.      
  149.       if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) //OP_SELL的值为1,OP_BUY的值为0。这里,指如果持有买、卖单,而不是挂单,并且货币兑是当前图表的货币对
  150.         {
  151.         //判断持有buy单即多头单的情况
  152.          if(OrderType()==OP_BUY)   // long position is opened
  153.            {
  154.             // 卖单信号开始 should it be closed? 如果出现了卖的信号
  155.            if(isCrossed == 2)
  156.                 {
  157.                  //平仓buy单
  158.                  OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);  
  159. // close position 之后立即返回,不管平仓是否成功,如果不成功,则重新回到循环里面,并重新判断索引值为0的订单,因为不管成功与否,会一直判断索引值为0的仓单,当仓单被平后,就没有索引值了。另外,这里说的是,在有卖信号下,对buy单的处理,sell单的索引不会被这个if语句里的OrderClose所执行
  160.                  return(0); // exit
  161.                 }
  162.             
  163.             // check for trailing stop 如果没有出新新信号,注意(此时已经是持有buy单了)检查移动止损,并修改止损和和获利点
  164.             
  165.             if(TrailingStop>0)   //如果追踪止损大于0,
  166.               {                  
  167.                if(Bid-OrderOpenPrice()>Point*TrailingStop) //如果获利(现在的买价减去开仓价格)大于 追踪止损的值
  168.                  {
  169.                   if(OrderStopLoss()<Bid-Point*TrailingStop) //如果单子的止损点比追踪止损点小
  170.                     {
  171.                      //修改订单的止损点为追踪止损点
  172.                      OrderModify(OrderTicket(),OrderOpenPrice(),Bid-
  173. Point*TrailingStop,OrderTakeProfit(),0,Green);
  174.                      //修改完后立刻返回
  175.                      return(0);
  176.                     }
  177.                  }
  178.               }
  179.        // 卖单信号结束
  180.            }
  181.          else // go to short position
  182.            {
  183.             // 买buy单信号开始 should it be closed? 注意,此时仍处于,所有仓单的检查和循环中,即操作完成后,立刻返回到仓位检查状态,并开始执行
  184.             if(isCrossed == 1) //出现买单信号
  185.               {
  186.                //平仓卖单
  187.                OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);  
  188. // close position
  189.                //立刻返回,不管是否成功,并重新进行下一次的运算
  190.                return(0); // exit
  191.               }
  192.             // check for trailing stop 检查止损点
  193.             if(TrailingStop>0)   //如果止损价大于0
  194. {                  
  195.               
  196.                if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) //如果获利点(开仓价格-现在的卖价)大于追踪止损价
  197.                  {                   if((OrderStopLoss()>(Ask+Point*TrailingStop)) ||(OrderStopLoss()==0)) //如果止损点大于止损假
  198.                     {
  199.                      //修改订单的止损价个为现在的追踪止损价格
  200. OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
  201. OrderTakeProfit(),0,Red);
  202.                      //修改后,立刻返回
  203.                      return(0);
  204.                     }
  205.                  }
  206.               }
  207.            }
  208.         }
  209.      }
  210.    return(0);
  211.   }
  212. //+------------------------------------------------------------------+
复制代码

论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
 
期货论坛 - 版权/免责声明   1.本站发布源码(包括函数、指标、策略等)均属开放源码,用意在于让使用者学习程序化语法撰写,使用者可以任意修改语法內容并调整参数。仅限用于个人学习使用,请勿转载、滥用,严禁私自连接实盘账户交易
  2.本站发布资讯(包括文章、视频、历史记录、教材、评论、资讯、交易方案等)均系转载自网络主流媒体,内容仅为作者当日个人观点,本网转载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网不对该类信息或数据做任何保证。不对您构成任何投资建议,不能依靠信息而取代自身独立判断,不对因使用本篇文章所诉信息或观点等导致的损失承担任何责任。
  3.本站发布资源(包括书籍、杂志、文档、软件等)均从互联网搜索而来,仅供个人免费交流学习,不可用作商业用途,本站不对显示的内容承担任何责任。请在下载后24小时内删除。如果喜欢,请购买正版,谢谢合作!
  4.龙听期货论坛原创文章属本网版权作品,转载须注明来源“龙听期货论坛”,违者本网将保留追究其相关法律责任的权力。本论坛除发布原创文章外,亦致力于优秀财经文章的交流分享,部分文章推送时若未能及时与原作者取得联系并涉及版权问题时,请及时联系删除。联系方式:http://www.qhlt.cn/thread-262-1-1.html
如何访问权限为100/255贴子:/thread-37840-1-1.html;注册后仍无法回复:/thread-23-1-1.html;微信/QQ群:/thread-262-1-1.html;网盘链接失效解决办法:/thread-93307-1-1.html

返回列表