期望学习EA编程的朋友,可以参考如下我们供应的源码【带注释】
这个EA例子的策略逻辑是:
N日内新高点 N日低位,胜过高位做空,低过低位做多。
带止损 止盈 及移动止损的处理部分。
假使你能细心研究掌握此EA的设计逻辑,基本可以入门MQL的实战编程了。
依旧那句老话:自己多动脑,多做实验!
源码如下:
#property copyright "Copyright ?2007, FXunion.com." //指标版权信息
#property link. "http://www.FXunion.com" //指标联系的网站链接//=====可调参数部分==============#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 rderTypeNow=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(Ticket<0){Print("多单入场失利"+GetLastError());return(0);//推出此次start函数的实施}}elseif (TradeOrNo(2))//空单入场条件{Ticket=OrderSend(Symbol(),OP_SELL,每单手数,Bid,滑点偏移点数,Bid+SL*Point,0,"",Magic,0,0);if(Ticket<0){Print("空单入场失利"+GetLastError());return(0);}}return;}else//===============持仓阶段==========================={switch(OrderTypeNow){case OP_BUY://多单持仓情形下,满足空单入场条件if (TradeOrNo(2)){if(OrderClose(Tick,OrderLots(),Bid,滑点偏移点数)==false)//平掉多单持仓单{Print("翻转发生 多头平仓失利"+GetLastError());return;}else//平仓后,反手建立空单{Ticket=OrderSend(Symbol(),OP_SELL,每单手数,Bid,滑点偏移点数,Bid+SL*Point,0,"",Magic,0,0);if(Ticket<0){Print("空单反手建仓失利"+GetLastError());return(0);}}}else //分析移动止损{if (Ask>StopLost+2*TrailingStop*Point){OrderModify(Tick,OrderOpenPrice(),StopLost+TrailingStop*Point,0,0,CLR_NONE);return;}}break;case OP_SELL:if (TradeOrNo(1)){if(OrderClose(Tick,OrderLots(),Ask,滑点偏移点数)==false)//平掉空单持仓单{Print("翻转发生 空头平仓失利"+GetLastError());return;}else//平仓后,反手建立多单{Ticket=OrderSend(Symbol(),OP_BUY,每单手数,Ask,滑点偏移点数,Ask-SL*Point,0,"",Magic,0,0);if(Ticket<0){Print("多单反手建仓失利"+GetLastError());return(0);}}}else //分析移动止损{if (Bidreturn(-1);
}//=================自定义函数部分======================================int GetOrderTypeHolding()//从近期持仓单提取订单类型,假使没有持仓单,则觉得是止赢出场或程序刚开始运行返回-1{int Type=-1;//int temptime=0;for(int i=OrdersTotal()-1;i>=0;i--){OrderSelect(i, SELECT_BY_POS, MODE_TRADES);if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic ){Type=OrderType();Tick=OrderTicket();StopLost=OrderStopLoss();}}return(Type);}//======================================================bool TradeOrNo(int Type)//分析目前指定方向的入场条件能否成立{double NHigh=High[iHighest(Symbol(),0,MODE_HIGH,N,2)];double NLow=Low[iLowest(Symbol(),0,MODE_LOW,N,2)];switch(Type){case 1://分析多单入场条件能否成立if (Close[1]>NHigh)//做多条件成立{return(true);}break;case 2:if (Close[1]