|
本帖最后由 frlin2003 于 2016-6-21 23:13 编辑
- #property copyright "Shawn Yau"
- extern double Lots = 0.1; //默认交易单位
- extern int StopLoss = 30; //止损
- extern int TakeProfit = 30; //止赢
- extern int Magic_Number = 8899; //Magic_Number是用来标识这个EA的唯一性的,简单来说,就是这个EA的身份证
- extern int FasterMA = 5; //均线1的周期
- extern int SlowerMA = 25; //均线2的周期
- extern int Trade_Bar = 0; //下单的时机,如果为1,表示等待当前的K线完成,下一根K线刚出现的时候才下单;如果为0表示只要当前的价格
- //满足条件了就马上下单
- int last_t = 0; //这个是用来避免重复下单
-
- int init() //这个是初始化函数,只会在EA刚加载到图表上的时候运行一次,之后就不起作用了
- {
- return(0);
- }
- int deinit() //反初始化函数,用处是在删除EA的时候运行一次,做一些清理性的工作,例如把所画的线、箭头等从图表上删除掉
- {
- return(0);
- }
- int start()
- {
- //定义几个变量,从名字也可以很容易看出其代表的含义了: FasterMANow表示均线1当前的值、SlowerMANow表示均线2当前的值、
- ///FasterMAPrevious表示均线1的前值、SlowerMAPrevious表示均线2的前值;均线金叉,其实就是表示当均线1的前值小于均线2的前值,
- //且均线1的当前值大于均线2的当前值。这样描述我想应该能明白了吧 :-)
- double FasterMANow, SlowerMANow, FasterMAPrevious, SlowerMAPrevious;
- //下面是给各个变量赋值,iMA就是均线函数,里面的各个参数可以在我在论坛发的中文文档上查到说明的
- FasterMANow = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar);
- SlowerMANow = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar);
- FasterMAPrevious = iMA(NULL, 0, FasterMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar+1);
- SlowerMAPrevious = iMA(NULL, 0, SlowerMA, 0, MODE_SMA, PRICE_CLOSE, Trade_Bar+1);
- //下面开始判断是否发生金叉了
- if ((FasterMANow > SlowerMANow) && (FasterMAPrevious <= SlowerMAPrevious)) {
- if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t)) ///如果当前的EA还没有下单
- {
- RefreshRates(); ///刷新市场报价
- ///下单都是用OrderSend()函数来进行的,这是个系统函数,详细说明可以在文档里面查到
- OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask,Digits), 3, NormalizeDouble(Ask-StopLoss*Point,Digits),
- NormalizeDouble(Ask+TakeProfit*Point,Digits), "", Magic_Number, 0, Blue);
- last_t = Time[0];
- return (0);
- }
- }
- //如果没有发生金叉,则下面开始判断是否发生死叉
- else if ((FasterMANow < SlowerMANow) && (FasterMAPrevious >= SlowerMAPrevious)) {
- if ((TotalOrders(Magic_Number)==0) && (Time[0]>last_t))
- {
- RefreshRates();
- OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid,Digits), 3, NormalizeDouble(Bid+StopLoss*Point,Digits),
- NormalizeDouble(Bid-TakeProfit*Point,Digits), "", Magic_Number, 0, Blue);
- last_t = Time[0];
- return (0);
- }
- }
- return(0);
- }
- //TotalOrders()函数的作用是返回Magic_Number为magic的EA所下的单子的总数
- int TotalOrders(int magic){
- int rez=0;
- for (int i=0;i<OrdersTotal();i++){ ///这里做一个循环,OrderTotal()是系统函数,作用是返回当前帐户下所有尚未平仓的单子总数
- OrderSelect(i,SELECT_BY_POS); ///OrderSelect()是系统函数,具体说明可以在文档里面查到
- if (OrderMagicNumber()==magic){ ///如果这个订单是当前EA所下的单
- rez++;
- }
- }
- return(rez); ///返回循环计算后得到的当前EA所下的单子的总数
- }
复制代码 来源: EA代码学习探索五---几款EA解说 |
|