EA编程实训课程 - 图文

发布时间 : 星期五 文章EA编程实训课程 - 图文更新完毕开始阅读

这段标准程序由2个主要自定义函数构成,其中iShowInfo()用来实时更新22个公共变量,iOrderSortTicket()用来计算特定条件下排序(对数组实施冒泡排序法)后的变量,如计算“最值”,详细用法参见源码中注释。 细心的读者会发现,在start()模块调用自定义函数iMain(),iMain()函数中再调用iShowInfo(),为什么不在start()直接使用iShowInfo()呢?原因很简单,为了防止被破解。 众所周知,网上针对MQL4有一个叫做XXX的破解工具(是什么,在哪里下载我就不说了,自己去找吧),能够反编译ex4程序,不过演示版只显示start()、init()、deinit()中的内容,程序中其他自定义函数则仅仅列出函数名称,该破解工具正式版的收费500美元,而MetaTrader公司为了防止EA被破解,经常会通过升级MT4版本方式改变ex4程序加密算法,他们哥俩无休止斗法至今。出现对自己知识产权的保护意识,我建议编程人员应该养成好习惯,最大程度杜绝恶意破解。当然,最佳的加密方法是编写dll,这里就不多说了。

源码1:控单模板

#property copyright“Copyright by --” #property link “http://--” /*

[程序名称及版本号] 控单模板[1.00] 开发记录

*/----程序预设参数

Extern string str1=“----系统预设参数----”; Extern double预设开仓量=0.1 Double Lots;

Extern string MyOrderComment=”demo’//订单注释 +-----------------------------------------------------------------+ String MyOrderComment; Int 订单特征码=0; Int MyMagicMun; //----程序控制参数

Int BuyGroupOrders,SellGroupOrders;//买入、卖出组成交持仓单数量总计 Int BuyGroupFirstTicket,SellGroupFirstTicket;//买入、卖出组第一单单号 Int BuyGroupLastTicket,SellGroupLastTicket;//买入、卖出组最后一单单号

Int BuyGroupMaxProfitTicket, Int SellGroupMaxProfitTicket;//买入、卖出组最大盈利单单号 Int BuyGroupMinProfitTicket, Int SellGroupMinProfitTicket;//买入、卖出组最小盈利单单号 Int BuyGroupMaxLossTicket, Int SellGroupMaxLossTicket;//买入、卖出组最大亏损利单单号 Int BuyGroupMinLossTicket, Int SellGroupMinLossTicket;//买入、卖出组最小亏损单单号 Double BuyGroupLots,SellGroupLots;//买入、卖出组成交持仓单开仓量总计 Double BuyGroupProfit,SellGroupProfit;//买入、卖出组成交持仓单利润总计 Int BuyLimitOrders,SellLimitOrders //买入限制挂单、卖出限制挂单数量总计 Int BuyStopOrders,SellStopOrders //买入停止挂单、卖出停止挂单数量总计

//持仓订单基本信息:0-订单,1-开仓时间,2-订单利润,3-订单类型,4-开仓量,5-开仓价, 6-止损价,7-止赢价,8-订单特征码,9-订单佣金,10-掉期,11-挂单有效日期

Double OrdersArray[][12];//第1维;订单序号;第2维:订单信息

Double TempOrdersArray[][12];//临时数组 Int MyArrayRange;//数组记录数量 Int cnt,i,j;//计数器变量

Int start() {

IMain(); Return(0); } /*

函数:主控程序 输入参数: 输出参数: 算 法: */

Void iMain() {

IShowInfo(); } /*

函数:显示交易信息 输入参数: 输出参数: 算 法: */

Void iShowInfo() {

//初始化变量

BuyGroupOrders=0;SellGroupOrders=0;//买入、卖出组成交持仓单数量总计

BuyGroupFirstTicket=0;SellGroupFirstTicket=0;//买入、卖出组持仓单第1张单订单号 BuyGroupLastTicket=0;SellGroupLastTicket=0;//买入、卖出组最后1张单的订单号

BuyGroupMaxProfitTicket=0; Int SellGroupMaxProfitTicket=0;//买入、卖出组最大盈利单单号 BuyGroupMinProfitTicket=0;Int SellGroupMinProfitTicket=0;//买入、卖出组最小盈利单单号 BuyGroupMaxLossTicket=0; Int SellGroupMaxLossTicket=0;//买入、卖出组最大亏损利单单号 BuyGroupMinLossTicket=0;Int SellGroupMinLossTicket=0;//买入、卖出组最小亏损单单号 BuyGroupLots=0;SellGroupLots=0;//买入、卖出组成交单持仓量 BuyGroupProfit=0;SellGroupProfit=0;//买入、卖出组成交单利润

BuyLimitOrders=0;SellLimitOrders=0;//买入、卖出限制挂单数量总计 BuyStopOrders=0;SellStopOrders=0;//买入、卖出停止挂单数量总计 //初始化订单数组

MyArrayRange=OrdersTotal()+1;

ArrayResize(OrdersArray,MyArrayRange);//重新界定数组 ArrayInintalize(OrdersArray,0.0);//初始化数组

If(OrdersTotal()>0) {

//遍历持仓单,创建数组

For(cnt=0;cnt<=MyArrayRange;cnt++) {

//选中当前货币对相关持仓订单

If(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES

OrderSymbol()==Symbol() && OrderComment()==MyOrderComment)

{

OrdersArray[cnt][0]=OrderTicket();//0订单号

OrdersArray[cnt][1]=OrderOpenTime();//1开仓时间 OrdersArray[cnt][2]=OrderProfit;//2-订单利润 OrdersArray[cnt][3]=OrderType();//3-订单类型 OrdersArray[cnt][4]=OrderLots;//4-开仓量

OrdersArray[cnt][5]=OrderOpenProfit;//5-开仓价 OrdersArray[cnt][6]=OrderStopLoss();//6-止损价 OrdersArray[cnt][7]=OrderTakeProfit();//7-止赢价

OrdersArray[cnt][8]=OrderMagicNumber();//8-订单特征码 OrdersArray[cnt][9]=OrderCommission;//9-订单佣金 OrdersArray[cnt][10]=OrderSwap();//10-掉期

OrdersArray[cnt][11]=OrderExpiration();//11-挂单有效日期 }

//统计基本信息

For(cnt=0;cnt

//买入持仓单

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_BUY) {

BuyGroupOrders=BuyGroupOrders+1;//买入组订单数量 BuyGroupLots=BuyGroupLots+OrderLots();//买入组开仓量 BuyGroupProfit=BuyGroupProfit+OrderProfit();//买入组利润

}

//卖出持仓单

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_SELL) {

SellGroupOrders=SellGroupOrders+1;//卖出组订单数量 SellGroupLots=SellGroupLots+OrderLots();//卖出组开仓量 sellGroupProfit=SellGroupprofit+OrderProfit();//卖出组利润

}

//买入组限制挂单总计

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_BUYLIMIT) BuyLimitOrders=BuyLimitOrders+1; //卖出组限制挂单总计

&&

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_SELLLIMIT) SellLimitOrders=SellLimitOrders+1; //买入组停止挂单总计

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_BUYSTOP) BuyLimitOrders=BuyStopOrders+1; //卖出组停止挂单总计

If(OrdersArray[cnt][0]!=0 && OrdersArray[cnt][3]==OP_SELLSTOP) SellLimitOrders=SellStopOrders+1;

}

//计算买入、卖出组首尾单号

BuyGroupFirstTicket=iOrderSortTicket(0,0,1);//买入组第1单单号 SellGroupFirstTicket=iOrderSortTicket(1,0,1);//卖出组第1单单号 BuyGroupLastTicket=iOrderSortTicket(0,0,0);//买入组最后1单单号 SellGroupLastTicket=iOrderSortTicket(1,0,0);//卖出组最后1单单号

BuyGroupMinProfitTicket=iOrderSortTicket(0,1,1);//买入组最小盈利单单号 SellGroupMinProfitTicket=iOrderSortTicket(1,1,1);//卖出组最小盈利单单号 BuyGroupMaxProfitTicket=iOrderSortTicket(0,1,0);//买入组最大盈利单单号 SellGroupMaxProfitTicket=iOrderSortTicket(1,1,0);//卖出组最大盈利单单号

BuyGroupMaxLossTicket=iOrderSortTicket(0,2,0);//买入组最大亏损单单号 SellGroupMaxLossTicket=iOrderSortTicket(1,2,0);//卖出组最大亏损单单号 BuyGroupMinLossTicket=iOrderSortTicket(0,2,1);//买入组最小亏损单单号 SellGroupMinLossTicket=iOrderSortTicket(1,2,1);//卖出组最小亏损单单号 }

Return(0); } /*

函数:计算特定条件的订单

输入参数:myOrderTyap:订单类型 0-Buy,1-Sell,2-BuyLimit,3-SellLimit,4-BuyStop,5-SellsTOP MyOrderSort:排序类型 0-按时间,1-按盈利,2-按亏损 MyMaxMin:极值 0-最大值,1-最小值 输出参数:返回订单号 算 法: */

int iOrderSortTicket(int myOrderType,int myOrderSort,int myMaxMin) {

Int myTicket=0; Int myAraaycnt=0; Int myArraycnt1=0; Int myType; //创建临时数组

Double myTempArray[][12];//定义临时数组

联系合同范文客服:xxxxx#qq.com(#替换为@)