EA的基本框架.doc_第1页
EA的基本框架.doc_第2页
EA的基本框架.doc_第3页
EA的基本框架.doc_第4页
EA的基本框架.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

EA的基本框架/+-+/| Designed by bull, China |/| Copyright 2007, bull |/| |/+-+#propertycopyright Copyright 2007 , bull, China.#propertylink #define MAGICMA /+-+/| 注意没有指标文件那些property |/+-+extern int whichmethod = 1; /14 种下单方式1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损extern double TakeProfit = 100; /止赢点数extern double StopLoss = 20; /止损点数extern double MaximumRisk = 0.3; /资金控制,控制下单量extern double TrailingStop =25; /跟踪止赢点数设置extern int maxOpen = 3; /最多开仓次数限制 extern int maxLots = 5; /最多单仓持仓量限制 extern int bb = 0; /非零就允许跟踪止赢extern double MATrendPeriod=26;/使用26均线 开仓条件参数本例子int i, p2, xxx,p1, res;double Lots; datetime lasttime; /时间控制, 仅当一个时间周期完成才检查条件int init() /初始化 Lots = 1;lasttime = NULL;return(0); int deinit() return(0); /反初始化/主程序int start()CheckForOpen(); /开仓 平仓 条件检查 和操作if (bb0) CTP(); /跟踪止赢return(0);/+-下面是各子程序-+double LotsOptimized() /确定下单量,开仓调用 资金控制double lot=Lots;int orders=HistoryTotal(); / history orders totalint losses=0; / number of losses orders without a break/MarketInfo(Symbol(),MODE_MINLOT); 相关信息/MarketInfo(Symbol(),MODE_MAXLOT);/MarketInfo(Symbol(),MODE_LOTSTEP);lot=NormalizeDouble(MaximumRisk * AccountBalance()/AccountLeverage(),1); /开仓量计算if(lotmaxLots) lot=maxLots;return(lot);/平仓持有的买单void CloseBuy()if (OrdersTotal( ) 0 ) for(i=OrdersTotal()-1;i=0;i-)if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)=false) break;if(OrderType()=OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); Sleep(5000); /平仓持有的卖单void CloseSell()if (OrdersTotal( ) 0 ) for(i=OrdersTotal()-1;i=0;i-)if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)=false) break;if(OrderType()=OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); Sleep(5000); /判断是否买或卖或平仓int buyorsell() /在这个函数计算设置你的交易信号这里使用MACD 和MA 做例子double MacdCurrent, MacdPrevious, SignalCurrent;double SignalPrevious, MaCurrent, MaPrevious;MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);if(MacdCurrentSignalCurrent & MacdPreviousMaPrevious)return (1); / 买 Ma在上升,Macd在0线上,并且两线上交叉if(MacdCurrent0 & MacdCurrentSignalPrevious & MaCurrentMaPrevious)return (-1); / 卖return (0); /不交易int nowbuyorsell = 0;void CheckForOpen()if (Time0 = lasttime ) return; /每时间周期检查一次时间控制lasttime = Time0;nowbuyorsell = buyorsell(); /获取买卖信号if (nowbuyorsell = 1) /买先结束已卖的CloseSell();if (nowbuyorsell = -1) /卖先结束已买的 CloseBuy();if (TimeDayOfWeek(CurTime() = 1)if (TimeHour(CurTime() 19 ) return; /周五晚11点后不做if (OrdersTotal( ) = maxOpen) return ; /如果已持有开仓次数达到最大,不做if (nowbuyorsell=0) return; /不交易TradeOK(); /去下单交易void TradeOK() /去下单交易int error ;if (nowbuyorsell = 1) /买 switch (whichmethod) case 1: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,MAGICMA,0,Blue);break; case 2: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,0,MAGICMA,0,Blue); break; case 3: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+TakeProfit*Point,MAGICMA,0,Blue);break; case 4: res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MAGICMA,0,Blue);break; default : res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,MAGICMA,0,Blue);break; if (res =0) error=GetLastError(); if(error=134)Print(Received 134 Error after OrderSend() ! ); / not enough money if(error=135) RefreshRates(); / prices have changed Sleep(5000); return ; if (nowbuyorsell = -1) /卖 switch (whichmethod) case 1: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,MAGICMA,0,Red); break; case 2: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,0,MAGICMA,0,Red); break; case 3: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-TakeProfit*Point,MAGICMA,0,Red); break; case 4: res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MAGICMA,0,Red); break; default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,MAGICMA,0,Red); break; if (res =0) error=GetLastError(); if(error=134) Print(Received 134 Error after OrderSend() ! ); / not enough money if(error=135) RefreshRates(); / prices have changed Sleep(5000); return ; void CTP() /跟踪止赢bool bs = false;for (int i = 0; i (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT) /开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置 if (OrderStopLoss() (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)/开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置 if (OrderStopLoss() (Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT) bs = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Tan); 华丽的分割线=EA中文注释原帖由 白色流星 于 2007-12-1 20:58 发表 首先我们先解读一下系统自带的MACDEA这个相对简单/+-+/| MACD Sample.mq4 |/| . extern double TakeProfit = 50;盈利目标点数extern double Lots = 0.1; 每单入场的手数extern double TrailingStop = 30; 追踪止损的点数extern double MACDOpenLevel=3; MACD开仓的参考位置extern double MACDCloseLevel=2; MACD出场的参考位置extern double MATrendPeriod=26; 条件中使用的MA均线的周期数程序最上面extern开始的这些数据都是程序参数,也就是在使用者调用的时候可以修改的部分。这个EA是个常见的技术指标条件入场,条件出场 同时又移动止损功能的完成示意,很适合初学者研究。先总结这个程序的基本条件的意思 以方便大家对号入座,尽快理解。多头入场条件:MACD小于0 并且 小于指定的参数MACDOpenLevel并且 MACD讯号下下穿基准线(死叉) 并且 MA向上趋势多头出场条件:MACD大于0 并且 大于指定的参数MACDCloseLevel 并且 MACD信号线上传基准线(金叉)空头入场条件:MACD大于0 并且 大于指定的参数MACDOpenLevel并且 MACD讯号线上穿基准线(金叉) 并且 MA向下趋势空头出场条件:MACD小于0 并且 小于制定的参数MACDCloseLevel并且 MACD讯号线下穿基准线(死叉)=有了以上的初步了解,下面开始进行EA程序基本结构的分析:1、start()函数是最重要的执行部分,每来一个价格 此函数都自动执行一次,所以主要的逻辑结构都在这个函数里2、程序的基本流程都是按照以下步骤进行,我们先牢牢记住这个结构,然后再对号入座去理解程序。 先判断当前自身的仓位状态,因为start函数式循环运行的,所以中间的每个步骤都会使用start函数,因此,当函数开始的时候我们首先要通过MT4的仓位操作函数获得当前的仓位状态,并进一步根据状态进行不同分支的计算。 程序开始的以下两个部分不重要 简单说一下:if(Bars100) Print(bars less than 100); return(0); 以上是说如果当前图形的K线个数少于100 则不进行运算 直接返回。这种情况一般不会出现,所以我们自己写程序的时候可以不写这部分。 if(TakeProfit10) Print(TakeProfit less than 10); return(0);/ check TakeProfit 以上这段意思是参数TakeProfit移动止损点数的设定如果小于10点,则发出报警,并返回不进行运算。这是为了防止乱设数值,引起后面计算的错误。这部分,如果程序只是我们自己使用,估计不会犯这种低级错误,所以写程序的时候也可以忽略不写。下面这段: MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);这部分是变量赋值部分,等于提前计算出为后面用到的当前MACD数值以及MA数值,这样提前写出来在后面直接使用赋值后的变量就很清楚了。是很好的编程习惯。再下面开始最主要的程序逻辑部分,首先遇到的就是我们上面说过的通过仓位函数获得当前状态的部分。total=OrdersTotal(); 通过函数获得当前持仓单的个数,如果持仓单个数小于1,则说明是空仓状态,那末就进行多头和空头的入场条件判断,如果满足条件则进行入场。代码如下:if(total1) / no opened orders identified if(AccountFreeMargin()(1000*Lots)这句诗判断保证金余量是否够下单,如果不够则直接返回,并不进行后续入场判断 Print(We have no money. Free Margin = , AccountFreeMargin(); return(0); / check for long position (BUY) possibility if(MacdCurrentSignalCurrent & MacdPrevious(MACDOpenLevel*Point) & MaCurrentMaPrevious) 这句就是多头入场条件的判断,可以看到2个技巧,1、交叉 的数学意思是“前面再下后面在上”或反之 2、MA向上趋势 的数学意思是当前K线的MA大于上一K线的MA数值 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,macd sample,16384,0,Green); 这是入场语句 记得一定要判断入场是否成功,因为很多服务器由于滑点或者服务器价格变动而不能入场成功,所以,要判断入场不成功后作出提示。ticket就是定单入场是否成功的标记。 if(ticket0) 大于0说明入场成功 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(BUY order opened : ,OrderOpenPrice(); else Print(Error opening BUY order : ,GetLastError(); 入场不成功,输出不成功的系统原因。 return(0); 这里为什麽使用了返回呢。因为一种情况是入场成功,那末直接返回等待下一个价格到来的时候再执行start函数,另一种情况是入场不成功,则返回也是等待下一个价格到来的时候在此执行入场操作。 下面就是空单入场的判断了,大家自己对照观看即可 / check for short position (SELL) possibility if(MacdCurrent0 & MacdCurrentSignalPrevious & MacdCurrent(MACDOpenLevel*Point) & MaCurrent0) if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) Print(SELL order opened : ,OrderOpenPrice(); else Print(Error opening SELL order : ,GetLastError(); return(0); return(0); 华丽的分割线=EA中文注释2#property copyright Copyright ?2007, 520FX Corp. /指标版权信息#property link /指标联系的网站链接/=可调参数部分=#define Magic 20090101 /预定义的常量 Magic用于后面程序里的开仓动作时标记在订单里面的一个符号,用于区别其他EA程序下的单 防止混乱extern int N=50; /参数 后面程序里用它作为N根K线的数量extern int SL=100;/参数 后面程序里下单的时候用这个设置的点数作为入场时订单的止损价格。extern int TrailingStop=30;/参数 后面程序里用这个作为移动止损的点数设置extern double 每单手数=0.1;/参数 表示后面下单的仓位的大小extern int 滑点偏移点数=3;/参数 表示下单时 服务器端的价格与当前看到的价格相差的范围,如果在此范围内,则允许以服务器端的价格成交/-全局变量=int Tick;/用于记录订单的唯一编号double StopLost;/用于记录止损/=主函数部分开始=int start()/主函数 没来一个价格这个函数就运行一次int Ticket; /局部变量 用于记录每次下单后的状态,用于判断下单动作是否成功,如果不成功则做相应处理和提示 int OrderTypeNow=GetOrderTypeHolding();/通过自定义函数得到当前持仓单的交易类型 买 卖/自定义函数中做了处理,如果没有发现当前有持仓 则返回-1if (OrderTypeNow=-1)/空仓阶段 -1表示没有持仓的状态 if (TradeOrNo(1)/多单入场条件 自定义函数TradeOrNo(1)参数1 表示针对多单的方向进行判断是否满足入场条件 Ticket=OrderSend(Symbol(),OP_BUY,每单手数,Ask,滑点偏移点数,Ask-SL*Point,0,Magic,0,0);/多单入场/Ticket表示入场动作的执行结果,如果小于0表示入场动作失败 if(Ticket0)Print(多单入场失败+GetLastError(); return(0); /推出本次start函数的执行 elseif (TradeOrNo(2)/空单入场条件 Ticket=OrderSend(Symbol(),OP_SELL,每单手数,Bid,滑点偏移点数,Bid+SL*Point,0,Magic,0,0); if(Ticket0)Print(空单入场失败+GetLastError(); return(0); return;else/=持仓阶段= switch(OrderTypeNow)case OP_BUY:/多单持仓情况下,满足空单入场条件if (TradeOrNo(2)if(OrderClose(Tick,OrderLots(),Bid,滑点偏移点数)=false)/平掉多单持仓单 Prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论