外汇mt4编程:ea编写中级(第2版)
外汇mt4编程:ea编写中级(第2版)外汇MT4编程:MT4 EA编写中级(第2版共十六课)原创:李沂鸿(柒侠伍义)国家:马来西亚第1章:初级EA以下是初级EA////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本" datetime 限制一根柱子下注一次=0; //自定义extern double下注数量=0.1; //自定义extern double止损=200; //自定义extern double止盈=200; //自定义extern double 滑点=30; //自定义externbool 使用音乐=true; //true=要用false=不要用externbool 使用弹出提示=false; //true=要用false=不要用string ea名字="柒侠伍义_初级EA教程";extern double开始交易时间=3; //自定义交易时间extern double结束交易时间=23; //自定义交易时间double魔术号码=16384; //自定义魔术号码double 死亡日期年=2009; //自定义ea终止日期double 死亡日期月=12; //自定义ea终止日期double 死亡日期日=12; //自定义ea终止日期double 死亡日期时=12; //自定义ea终止日期double 用户账户=90240764; //自定义指定用户帐号double 赢钱目标=10000;//自定义赢太多了不要做单double 输钱目标=500; //自定义输太惨了不要做单string 交易商= "";//自定义交易商extern string 货币对1 ="EURUSD"; //自定义指定货币对extern string 货币对2 ="EURJPY"; //自定义指定货币对extern string 货币对3 ="GBPUSD"; //自定义指定货币对double时间周期1=30,时间周期2=60; //自定义时间周期////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0|| GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0|| GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&&Close[0]-Open[0]>200*Point //判断上升趋势&&Close[1]-Open[1]>200*Point //判断上升趋势&&Close[2]-Open[2]>200*Point //判断上升趋势&&Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek()!=0 //礼拜不要交易&& DayOfWeek()!=6 //星期6不要交易&& DayOfWeek()!=5 //星期5不要交易&&(Hour()>开始交易时间&&Hour()<结束交易时间)//限制交易时间:早上3点到晚上10点可以交易&&Year()==2009 //限制交易时间:只限2009年可以运行&&(Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户//指定用户账户&&(AccountBalance()<赢钱目标&&AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&&AccountCompany()==交易商//指定交易商方可交易&&(Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&&(Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period(),"",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&&Open[0]-Close[0]>200*Point //判断下降趋势&&Open[1]-Close[1]>200*Point //判断下降趋势&&Open[2]-Close[2]>200*Point //判断下降趋势&&Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek()!=0 //礼拜不要交易&& DayOfWeek()!=6 //星期6不要交易&& DayOfWeek()!=5 //星期5不要交易&&(Hour()>开始交易时间&&Hour()<结束交易时间)//限制交易时间:早上3点到晚上10点可以交易&&Year()==2009 //限制交易时间:只限2009年可以运行&&(Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户//指定用户账户&&(AccountBalance()<赢钱目标&&AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&&AccountCompany()==交易商//指定交易商方可交易&&(Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&&(Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period(),"",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if结束如果////////////ea 不读这个注解///////////////////////return(0); //叫ea重复运行每秒大概可能重新运算100次} //startto end 结束主程式第2章:删除不是很重要的自定义为了方便学习1.////////////ea 不读这个注解///////////////////////2.#property copyright "柒侠伍义_初级EA教程_商业版本"3.datetime 限制一根柱子下注一次=0; //自定义4.extern double 下注数量=0.1; //自定义5.extern double 止损=200; //自定义6.extern double 止盈=200; //自定义7.extern double 滑点=30; //自定义8.extern bool 使用音乐=true; //true=要用false=不要用9.extern bool 使用弹出提示=false; //true=要用false=不要用10.string ea名字= "柒侠伍义_初级EA教程";11.//extern double 开始交易时间=3; //自定义交易时间12.//extern double 结束交易时间=23; //自定义交易时间13.double 魔术号码=16384; //自定义魔术号码14.//double 死亡日期年=2009; //自定义ea终止日期15.//double 死亡日期月=12; //自定义ea终止日期16.//double 死亡日期日=12; //自定义ea终止日期17.//double 死亡日期时=12; //自定义ea终止日期18.//double 用户账户=90240764; //自定义指定用户帐号19.//double 赢钱目标=10000;//自定义赢太多了不要做单20.//double 输钱目标=500; //自定义输太惨了不要做单21.//string 交易商= ""; //自定义交易商22.//extern string 货币对1 = "EURUSD"; //自定义指定货币对23.//extern string 货币对2 = "EURJPY"; //自定义指定货币对24.//extern string 货币对3 = "GBPUSD"; //自定义指定货币对25.//double 时间周期1=30,时间周期2=60; //自定义时间周期26.////////////ea 不读这个注解///////////////////////27.int start() //ea 开始运行28.{ //开始主程式29.30.HideTestIndicators(true);//命令ea隐藏ea中的指标31.if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0|| GetLastError()==134) {return;}//命令ea如果保证金不足不要交易32.if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0|| GetLastError()==134){return;}//命令ea如果保证金不足不要交易33.34.////////////ea 不读这个注解///////////////////////35.36.if( //开始如果37.OrdersTotal()==0 //没有单可以下注38.&&Close[0]-Open[0]>200*Point //判断上升趋势39.&&Close[1]-Open[1]>200*Point //判断上升趋势40.&&Close[2]-Open[2]>200*Point //判断上升趋势41.&&Close[3]-Open[3]>200*Point //判断上升趋势42.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次43.//&& IsDemo() //限制模拟户口运行44.//&& DayOfWeek() !=0 //礼拜不要交易45.//&& DayOfWeek() !=6 //星期6不要交易46.//&& DayOfWeek() !=5 //星期5不要交易47.//&&(Hour()>开始交易时间&&Hour()<结束交易时间)//限制交易时间:早上3点到晚上10点可以交易48.//&& Year()==2009//限制交易时间:只限2009年可以运行49.//&&(Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时)//ea死亡日期50.//&& AccountNumber()==用户账户//指定用户账户51.//&&(AccountBalance()<赢钱目标&&AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单52.//&& AccountCompany()==交易商//指定交易商方可交易53.//&&(Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对54.//&&(Period()==时间周期1||Period()==时间周期2) //指定时间周期运行55.){56.OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);57.限制一根柱子下注一次=Time[0];58.if(使用音乐){PlaySound("Conditions.wav");}59.if(使用弹出提示){Alert(" M",Period(),"",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}60.} // end if 结束如果61.62.////////////ea 不读这个注解///////////////////////63.64.65.if( //开始如果66.OrdersTotal()==0 //没有单可以下注67.&&Open[0]-Close[0]>200*Point //判断下降趋势68.&&Open[1]-Close[1]>200*Point //判断下降趋势69.&&Open[2]-Close[2]>200*Point //判断下降趋势70.&&Open[3]-Close[3]>200*Point //判断下降趋势71.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次72.//&& IsDemo() //限制模拟户口运行73.//&& DayOfWeek() !=0 //礼拜不要交易74.//&& DayOfWeek() !=6 //星期6不要交易75.//&& DayOfWeek() !=5 //星期5不要交易76.//&&(Hour()>开始交易时间&&Hour()<结束交易时间)//限制交易时间:早上3点到晚上10点可以交易77.//&& Year()==2009//限制交易时间:只限2009年可以运行78.//&&(Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时)//ea死亡日期79.//&& AccountNumber()==用户账户//指定用户账户80.//&&(AccountBalance()<赢钱目标&&AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单81.//&& AccountCompany()==交易商//指定交易商方可交易82.//&&(Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对83.//&&(Period()==时间周期1||Period()==时间周期2) //指定时间周期运行84.){85.OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);86.限制一根柱子下注一次=Time[0];87.if(使用音乐){PlaySound("Conditions.wav");}88.if(使用弹出提示){Alert(" M",Period(),"",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}89.} // end if 结束如果90.91.92.////////////ea 不读这个注解///////////////////////93.94.return(0); //叫ea 重复运行每秒大概可能重新运算100次95.} //start to end 结束主程式第3章:真正删除不重要的是不是好看一点了?哈哈和。
外汇MT4_EA智能系统MQ4编写详细举例
创建一简易的人工智能系统举例说明让我们将MACD指标同获利能力、支撑移动止损位以及操作安全等因素结合起来考虑以创建人工智能系统。
下面的例子是开立和控制一个单独的头寸。
<BR><BR>交易原则:<BR><BR>. 做多(买入)信号——即当MACD 指针是在0轴在以下,为向上的趋势并与向下的信号线相交(金叉) <BR><BR>. 做空(卖出) 信号——即当MACD 指针是在0轴以上,为向下趋势并与向上的信号线相交(死叉) <BR><BR>. 多头平仓信号——即执行限价平仓指令或移动止损指令以获得利润或者在MACD指针与信号线相交(MACD指针在0轴以上且为向下趋势并与向上趋势的信号线相交)时平仓 <BR><BR>. 空头平仓信号——即执行限价平仓指令或移动止损指令以获得利润或者在MACD指针与信号线相交(MACD指针在0轴以下且为向上趋势并与向下趋势的信号线相交)时平仓 <BR><BR>重要提示: <BR><BR> 在我们分析MACD指标时,为了排除MACD指示中一些并不重要的变化情况(即图表中的细微“小丘”),下面我们另外引荐一种控制“小丘”大小的方法: <BR><BR>指示范围至少为5个最小单位(5点,即USD/CHF=0.0005,USD/JPY=0.05) <BR><BR><BR><BR>第一步:撰写人工智能系统说明 <BR><BR><BR>将鼠标指在导航窗口的人工智能系统,点击鼠标右键在弹出的菜单中CREATE A NEW EXPERT(创建一个智能系统)命令. 正在初始化的WISARD OF EXPERT ADVISOR 会问你是否要输入数据.在弹出的窗口中你得写下NAME名字(人工智能系统的名字) 、AUTHOR作者、与你的网址链接、须知—人工智能系统的测试样本.你也可以设定你想要的Lots(交易单位), Stop Loss(止损点), Take Profit(平仓) 和 Trailing Stop(移动止损)的默认值. <BR><BR><BR><BR>第二步:创立程序的初步结构 <BR><BR>测试系统的代码仅仅为几页纸,即使是这几页纸仍然是难以理解的,特别是在我们这些不是专业的程序员的眼里是非常难的.不然,我们也不必写下这段说明,不是吗? <BR><BR>为了了解标准的人工智能系统的结构,我们来看一下下面的解释: <BR><BR>1.初始资料检查 <BR><BR>.检查图表,图表上棍的数量 <BR><BR>.检查外部变数值:LOTS,S/L,T/P,T/S <BR><BR>2.设置为快速数据存取的内部变量 <BR><BR>3检查交易终端—是否有空间?如果有,然后 <BR><BR>.检查账户中的可用资金 <BR><BR>.是否可以做多(买入) <BR><BR>.建仓买入和平仓 <BR><BR>.是否可以做空(卖出) <BR><BR>.建仓卖出和平仓 <BR><BR>4. 定期控制已开立的头寸<BR><BR>..若是多头合约 <BR><BR> .是否要平仓 <BR><BR>.是否要重新设定移动止损点 <BR><BR>..若是空头合约 <BR><BR>.是否要平仓 <BR><BR>.是否要重新设定移动止损点 <BR><BR>这是相对简单的样板,仅仅只有4个主要单元. <BR><BR>现在我们来试着逐渐将结构表中的每一部分的代码做出来: <BR><BR>1.初始资料检查 <BR><BR>这一块的数据通常是经过稍稍修改后从一个系统移至另一系统的—这实际上是一单元检查. <BR><BR>If Bars<200 Then Exit; // the chart has less than 200 bars - exit <BR><BR>If TakeProfit<10 Then Exit; // wrong takeprofit parameters 收益小于10点退出<BR><BR>2设置为快速数据存取的内部变量 <BR><BR>在程序代码中,有的是经常需要存取的指示值和操做的计算值.为了简化译码和加速存取,数据最初便在内部变数中嵌套进去<BR><BR>.MacdCurrent=iMACD(12,26,9,MODE_MAIN,0); // MACD value on the current bar <BR><BR>MacdPrevious=iMACD(12,26,9,MODE_MAIN,1); // MACD value on the previous bar <BR><BR>SignalCurrent=iMACD(12,26,9,MODE_SIGNAL,0); // Signal Line value on the current bar <BR><BR>SignalPrevious=iMACD(12,26,9,MODE_SIGNAL,1);//Signal Line value on the previous bar<BR><BR>MaCurrent=iMA(MATrendPeriod,MODE_EMA,0); // moving average value on the current bar <BR><BR>MaPrevious=iMA(MATrendPeriod,MODE_EMA,1); // moving average value on the previous bar <BR><BR>现在,我们以在程序中简单的写入字符MacdCurrent代替晦涩难懂的iMACD(12,26,9,MODE_MAIN,0).所有的人工智能系统中的变量都依据MQL II语言进行基本的解释. <BR><BR>var: MacdCurrent(0), MacdPrevious(0), SignalCurrent(0), SignalPrevious(0); <BR><BR>var: MaCurrent(0), MaPrevious(0); <BR><BR>MQL II语言还另外推出一种的用户自定义变量,它可以在程序外设定而无须任何系统程序下的源程序正文的参考.这个特点使程序更具灵活性MATrendPeriod变量就是一个这种类型的用户自定义变量,因此,我们在程序的开头加入这段说明. <BR><BR>defines:MATrendPeriod(56); <BR><BR ><BR ><P>3. 检查交易终端是否有空间?如果有,然后 <BR><BR>在我们的人工智能系统中,我们只能使用现时头寸而不能操作延迟的买卖盘.为了安全起见,我们介绍一种核对过去交易终端已下买卖盘的程序. <BR><BR>If TotalTrades<1 then // no opened orders identified <BR><BR>{ <BR><BR>3.检查: 账户的可用资金……. 在分析市场状况之前最好先检查一下你的账户的资金情况, 以确保账户中有开立头寸的资金. <BR><BR>If FreeMargin<1000 then Exit; // no funds – exit <BR><BR><BR>. 是否可以做多(买入) <BR><BR> 买入的条件信号:MACD指标在0轴以下,为向上趋势且与向下趋势的信号线相交。
【MQL4】外汇MT4EA设计策略80条
【MQL4】外汇MT4EA设计策略80条请仔细研究大腕们使用的80条外汇交易策略,并记住你只需要四样工具:柱图,均线背离,枢轴点和趋势线分析。
不需要更多,简简单单。
不要受人误导而相信别的。
这个世界到处是"怀疑的托马斯",他们指手划脚却从未赚到过一文钱,他们卖铲子但自己不用。
策略1:刚入门时,努力从每个交易时段捕捉20点,然后停住,关掉它,做更多研究。
当你真正擅长了再求更多。
在你变成外汇行业的大师前,设定20点目标并坚持。
我强调行业一词,它不是游戏,关系到你辛苦挣来的钱。
策略2:花主要时间在15分钟图上。
策略3:在开始某个交易时段前,先看1小时图,得出时段过渡时的趋势,以及新时段开始时可能会怎么走。
策略4:只有你绝对需要知道15分钟图后面发生什么时,才看5分钟图,尤其当K线拉长或刚穿越枢轴点,换句话说,是否5分钟图上发生逆转而15分钟图上尚未反映出来?策略5:不要停留在5分钟图上,因为它有太多杂音,会把你折磨至死。
策略6:15分钟图上的均线法则:即便均线在1小时图上是上行,如果在15分钟图上是下行,这就暗示逆转正要到来,但尚未发生。
同时你不想错失15分钟图上反映的正在发生的事情。
策略7:如果均线在15分钟图上下行,但价格却欲上行,价格迟早会下行,比如被枢轴点弹回,或被另外三种工具(柱图,均线背离或趋势线分析)捕捉到的节点所逆转。
均线上行而价格欲下行的情况同理。
策略8:只使用均线的背离,而不用均线做买卖信号,它是延迟指标,对外汇来讲太慢。
策略9:15分钟图上的均线背离比1小时图上更重要。
背离是指均线与价格波动方向相反。
策略10:始终用20-30点止损保护资金。
精神止损也可,但必须有严格的纪律。
做10次你可能错3次,三次的损失应该保持在20-30点以内,你的获利应该远大于小的损失。
不要害怕损失,专业棒球手也会10次失手6次,狮子追杀成功率仅20%,职业扑克选手失败率50%,你的机会比他们要好,人生没有100%确定的事情。
【MQL4】新手快速学会怎样编写外汇EA
【MQL4】新手快速学会怎样编写外汇EA# 什么是MT4?我就当你了解什么是MT4了MT4就是META. TRADER 4# 什么是EA?我也当你了解什么是EA了EA 就是 Expert AdviserEA 就是智能交易系统智能教育系统就是:-软件自己判断下订单-软件自己判断提成利润-软件自己判断砍仓止输# 什么是速成班?就是你在很短很快的时间内就可以学会如何编写EA 是的,快则8个学习小时慢则24个学习小时# 什么叫“易学难精”?就是你很快的就上手,难在成为厉害的高手。
这需要时间慢慢的去研究编写。
久而久之你就可以是EA编写高手了。
第一课::了解EA的形式* 以下就是EA的编写形式//#property copyright "外汇联盟 QQ群144033"#property link ""//+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init(){//----//----return(0);}//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit(){//----//----return(0);}//+------------------------------------------------------------------+//| expert start function |//+------------------------------------------------------------------+int start(){//----//----return(0);}//+------------------------------------------------------------------+#property copyright "外汇联盟 QQ群144033"#property link ""写与不写都无所谓我们也不用理他* //+------------------------------------------------------------------+//| expert initialization function |//+------------------------------------------------------------------+int init(){//----//以后可能有用到//----return(0);}//+------------------------------------------------------------------+//| expert deinitialization function |//+------------------------------------------------------------------+int deinit(){//----//以后可能有用到//----return(0);}这两个很少用到。
MT4 EA编写 中级(第2版共十六课)
第1章:初级EA以下是初级EA////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次 =0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字 = "柒侠伍义_初级EA教程";extern double 开始交易时间=3; //自定义交易时间extern double 结束交易时间=23; //自定义交易时间double 魔术号码=16384; //自定义魔术号码double 死亡日期年=2009; //自定义ea终止日期double 死亡日期月=12; //自定义ea终止日期double 死亡日期日=12; //自定义ea终止日期double 死亡日期时=12; //自定义ea终止日期double 用户账户=90240764; //自定义指定用户帐号double 赢钱目标 =10000;//自定义赢太多了不要做单double 输钱目标 =500; //自定义输太惨了不要做单string 交易商 = ""; //自定义交易商extern string 货币对1 = "EURUSD"; //自定义指定货币对extern string 货币对2 = "EURJPY"; //自定义指定货币对extern string 货币对3 = "GBPUSD"; //自定义指定货币对double 时间周期1=30,时间周期2=60; //自定义时间周期////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek() !=0 //礼拜不要交易&& DayOfWeek() !=6 //星期6不要交易&& DayOfWeek() !=5 //星期5不要交易&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易&& Year()==2009 //限制交易时间:只限2009年可以运行&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户 //指定用户账户&& (AccountBalance()<赢钱目标 && AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&& AccountCompany()==交易商 //指定交易商方可交易&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek() !=0 //礼拜不要交易&& DayOfWeek() !=6 //星期6不要交易&& DayOfWeek() !=5 //星期5不要交易&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易&& Year()==2009 //限制交易时间:只限2009年可以运行&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户 //指定用户账户&& (AccountBalance()<赢钱目标 && AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&& AccountCompany()==交易商 //指定交易商方可交易&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////return(0); //叫 ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式第2章:删除不是很重要的自定义为了方便学习1. ////////////ea 不读这个注解///////////////////////2. #property copyright "柒侠伍义_初级EA教程_商业版本"3. datetime 限制一根柱子下注一次 =0; //自定义4. extern double 下注数量=0.1; //自定义5. extern double 止损=200; //自定义6. extern double 止盈=200; //自定义7. extern double 滑点=30; //自定义8. extern bool 使用音乐=true; //true=要用 false=不要用9. extern bool 使用弹出提示=false; //true=要用 false=不要用10. string ea名字 = "柒侠伍义_初级EA教程";11. //extern double 开始交易时间=3; //自定义交易时间12. //extern double 结束交易时间=23; //自定义交易时间13. double 魔术号码=16384; //自定义魔术号码14. //double 死亡日期年=2009; //自定义ea终止日期15. //double 死亡日期月=12; //自定义ea终止日期16. //double 死亡日期日=12; //自定义ea终止日期17. //double 死亡日期时=12; //自定义ea终止日期18. //double 用户账户=90240764; //自定义指定用户帐号19. //double 赢钱目标 =10000;//自定义赢太多了不要做单20. //double 输钱目标 =500; //自定义输太惨了不要做单21. //string 交易商 = ""; //自定义交易商22. //extern string 货币对1 = "EURUSD"; //自定义指定货币对23. //extern string 货币对2 = "EURJPY"; //自定义指定货币对24. //extern string 货币对3 = "GBPUSD"; //自定义指定货币对25. //double 时间周期1=30,时间周期2=60; //自定义时间周期26. ////////////ea 不读这个注解///////////////////////27. int start() //ea 开始运行28. { //开始主程式29.30. HideTestIndicators(true);//命令ea隐藏ea中的指标31. if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易32. if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易33.34. ////////////ea 不读这个注解///////////////////////36. if( //开始如果37. OrdersTotal()==0 //没有单可以下注38. && Close[0]-Open[0]>200*Point //判断上升趋势39. && Close[1]-Open[1]>200*Point //判断上升趋势40. && Close[2]-Open[2]>200*Point //判断上升趋势41. && Close[3]-Open[3]>200*Point //判断上升趋势42. && 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次43. //&& IsDemo() //限制模拟户口运行44. //&& DayOfWeek() !=0 //礼拜不要交易45. //&& DayOfWeek() !=6 //星期6不要交易46. //&& DayOfWeek() !=5 //星期5不要交易47. //&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易48. //&& Year()==2009 //限制交易时间:只限2009年可以运行49. //&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期50. //&& AccountNumber()==用户账户 //指定用户账户51. //&& (AccountBalance()<赢钱目标 && AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单52. //&& AccountCompany()==交易商 //指定交易商方可交易53. //&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对54. //&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行55. ){56. OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);57. 限制一根柱子下注一次 =Time[0];58. if(使用音乐){PlaySound("Conditions.wav");}59. if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}60. } // end if 结束如果61.62. ////////////ea 不读这个注解///////////////////////64.65. if( //开始如果66. OrdersTotal()==0 //没有单可以下注67. && Open[0]-Close[0]>200*Point //判断下降趋势68. && Open[1]-Close[1]>200*Point //判断下降趋势69. && Open[2]-Close[2]>200*Point //判断下降趋势70. && Open[3]-Close[3]>200*Point //判断下降趋势71. && 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次72. //&& IsDemo() //限制模拟户口运行73. //&& DayOfWeek() !=0 //礼拜不要交易74. //&& DayOfWeek() !=6 //星期6不要交易75. //&& DayOfWeek() !=5 //星期5不要交易76. //&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易77. //&& Year()==2009 //限制交易时间:只限2009年可以运行78. //&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期79. //&& AccountNumber()==用户账户 //指定用户账户80. //&& (AccountBalance()<赢钱目标 && AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单81. //&& AccountCompany()==交易商 //指定交易商方可交易82. //&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对83. //&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行84. ){85. OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);86. 限制一根柱子下注一次 =Time[0];87. if(使用音乐){PlaySound("Conditions.wav");}88. if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}89. } // end if 结束如果90.92. ////////////ea 不读这个注解///////////////////////93.94. return(0); //叫 ea 重复运行每秒大概可能重新运算100次95. } //start to end 结束主程式第3章:真正删除不重要的1.2. ////////////ea 不读这个注解///////////////////////3. #property copyright "柒侠伍义_初级EA教程_商业版本"4. datetime 限制一根柱子下注一次 =0; //自定义5. extern double 下注数量=0.1; //自定义6. extern double 止损=200; //自定义7. extern double 止盈=200; //自定义8. extern double 滑点=30; //自定义9. extern bool 使用音乐=true; //true=要用 false=不要用10. extern bool 使用弹出提示=false; //true=要用 false=不要用11. string ea名字 = "柒侠伍义_初级EA教程";12. double 魔术号码=16384; //自定义魔术号码13. ////////////ea 不读这个注解///////////////////////14. int start() //ea 开始运行15. { //开始主程式16. HideTestIndicators(true);//命令ea隐藏ea中的指标17. if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易18. if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易19. ////////////ea 不读这个注解///////////////////////20.21. if( //开始如果22. OrdersTotal()==0 //没有单可以下注23. && Close[0]-Open[0]>200*Point //判断上升趋势24. && Close[1]-Open[1]>200*Point //判断上升趋势25. && Close[2]-Open[2]>200*Point //判断上升趋势26. && Close[3]-Open[3]>200*Point //判断上升趋势27. && 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次28. ){29. OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);30. 限制一根柱子下注一次 =Time[0];31. if(使用音乐){PlaySound("Conditions.wav");}32. if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}33. } // end if 结束如果34. ////////////ea 不读这个注解///////////////////////35.36. if( //开始如果37. OrdersTotal()==0 //没有单可以下注38. && Open[0]-Close[0]>200*Point //判断下降趋势39. && Open[1]-Close[1]>200*Point //判断下降趋势40. && Open[2]-Close[2]>200*Point //判断下降趋势41. && Open[3]-Close[3]>200*Point //判断下降趋势42. && 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次43. ){44. OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);45. 限制一根柱子下注一次 =Time[0];46. if(使用音乐){PlaySound("Conditions.wav");}47. if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}48. } // end if 结束如果49.50. ////////////ea 不读这个注解///////////////////////51. return(0); //叫 ea 重复运行每秒大概可能重新运算100次52. } //start to end 结束主程式第4章:把复杂变简单-子程式注意变法!把这个ea save as另外一个新的名字,比如:my3ea////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次 =0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字 = "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////策略管理(); //子程式////////////ea 不读这个注解///////////////////////return(0); //叫 ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式////////////ea 不读这个注解///////////////////////void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果} //结束子程式第5章:把复杂变简单-子程式中的子程式////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次 =0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字 = "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////策略管理(); //子程式////////////ea 不读这个注解///////////////////////return(0); //叫 ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式////////////ea 不读这个注解///////////////////////void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){买上();} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果} //结束策略管理子程式/////////////////////////////////////////////////void 买上(){ //买上子程式开始OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}}//结束买上第6章:把复杂变简单-卖下子程式你应当学会把买上变成子程式试一试把卖下变成子程式//---------------------------------------------------------------#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次 =0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字 = "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码//---------------------------------------------------------------int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易策略管理(); //子程式return(0); //叫 ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式//---------------------------------------------------------------void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){买上();} // end if 结束如果if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次 !=Time[0] //限制一根柱子下注一次){卖下();} // end if 结束如果} //结束策略管理子程式//---------------------------------------------------------------void 买上(){ //买上子程式开始OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}}//结束买上子程式//---------------------------------------------------------------卖下(){//卖下子程式开始OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次 =Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}}//结束卖下子程式//---------------------------------------------------------------第7章:macd sample打开你的macd sample找一个叫OrderClose的东西我们来做一个OrderClose的子程式//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright ?2005, MetaQuotes Software Corp. |//| / |//+------------------------------------------------------------------+extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){double MacdCurrent, MacdPrevious, SignalCurrent;double SignalPrevious, MaCurrent, MaPrevious;int cnt, ticket, total;// initial data checks// it is important to make sure that the expert works with a normal// chart and the user did not make any mistakes setting external// variables (Lots, StopLoss, TakeProfit,// TrailingStop) in our case, we check TakeProfit// on a chart of less than 100 barsif(Bars<100){Print("bars less than 100");return(0);}if(TakeProfit<10){Print("TakeProfit less than 10");return(0); // check TakeProfit}// to simplify the coding and speed up access// data are put into internal variablesMacdCurrent=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);total=OrdersTotal();if(total<1){// no opened orders identifiedif(AccountFreeMargin()<(1000*Lots)){Print("We have no money. Free Margin = ", AccountFreeMargin());return(0);}// check for long position (BUY) possibilityif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious){ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);if(ticket>0){if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());}else Print("Error opening BUY order : ",GetLastError());return(0);}// check for short position (SELL) possibilityif(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious){ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);if(ticket>0){if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());}else Print("Error opening SELL order : ",GetLastError());return(0);}return(0);}// it is important to enter the market correctly,// but it is more important to exit it correctly...for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()<=OP_SELL && // check for opened positionOrderSymbol()==Symbol()) // check for symbol{if(OrderType()==OP_BUY) // long position is opened{// should it be closed?if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&MacdCurrent>(MACDCloseLevel*Point)){OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close positionreturn(0); // exit}// check for trailing stopif(TrailingStop>0){if(Bid-OrderOpenPrice()> oint*TrailingStop){if(OrderStopLoss()<Bid-Point*TrailingStop){OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);return(0);}}}}else // go to short position{// should it be closed?if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) {OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close positionreturn(0); // exit}// check for trailing stopif(TrailingStop>0){if((OrderOpenPrice()-Ask)>(Point*TrailingStop)){if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)){OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakePr ofit(),0,Red);return(0);}}}}}}return(0);}// the end.第8章:macd sample 解读版如果你还不知道macd sample讲什么,下面解读你就要仔细的研究一番1.2.11. //这是自定义函数12. extern double TakeProfit = 50; //盈利目标点数13. extern double Lots = 0.1; //每单入场的手数14. extern double TrailingStop = 30; //追踪止损的点数15. extern double MACDOpenLevel=3; //MACD开仓的参考位置16. extern double MACDCloseLevel=2; //MACD出场的参考位置17. extern double MATrendPeriod=26; //条件中使用的MA均线的周期数18. //程序最上面extern开始的这些数据都是程序参数,19. //也就是在使用者调用的时候可以修改的部分。
一步一步解读MT4的例子EA
一步一步解读MT4的例子EA一步一步解读MT4的例子EA关于什么是EA请看此文章(连接到)在MT4安装后,默认会给用户提供几个例子程序,这些程序对于新学习EA开发过程中有很大的帮助,下面我们就来对MACD Sample 这个例子EA来做个解读,来看看别人是如何开发一个EA的。
首先是注释,在MQL语言中所有//的这一行就是注释行,系统本身不会去执行它,它只是用来解释当前代码的含义的,我们在代码中加入这些注释为了是让我们能够清楚的阅读代码的含义,在程序中加入详细的注释是一个很好的编程习惯,我们鼓励大家多加入注释。
很多人觉得注释这东西因为没用在写代码中觉得很麻烦而忽略它,但是即使是自己编写的程序如果不加注释过几天就会忘记意思,还要再一行一行地看这些代码,所以注释是非常重要的。
下面这些就是定义变量,我们发现前面加上了extern关键字,如果在定义变量的前面有这个词说明这个变量将会被作为EA运行的参数,举个例子,比如我要编写一个EA,在使用过程中我想改变它的止盈和止损值,如果我程序都是事先编好的止盈止损,那么以后要改动它必须要改代码,这样不仅麻烦也不灵活,如果我把这些信息作为EA运行参数,那么在EA运行中就可以随时调整它了。
extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MATrendPeriod=26;上面定义了6个变量并且都是当作参数,这里设定变量名称的时候尽量使用用户可以理解的词汇,在EA的参数设置里这些变量名就是参数的名字。
值得注意的是EA里变量名称是可以用中文的。
int start()start()函数是EA运行的核心,MQL语言规定了几个默认函数,其中EA第一次运行时会调用init()函数,在这个函数里我们可以放入一些需要初始化的信息,start()函数中放我们EA的核心代码,每次一个TICK(换句话说就是新报价)来到后,系统会自动调用start()函数。
MT4MT5外汇EA编程教程大全之交易函数word资料12页
MT4MT5外汇EA编程教程大全之交易函数word资料12页MT4 MT5外汇EA编程教程大全之交易函数(三)从自定义指标中不能调用OrderSend(), OrderClose, OrderCloseBy, OrderDelete和OrderModify交易函数。
OrderCloseOrderCloseByOrderClosePriceOrderCloseTimeOrderCommentOrderCommissionOrderDeleteOrderExpirationOrderLotsOrderMagicNumberOrderModifyOrderOpenPriceOrderOpenTimeOrderPrintOrderProfitOrderSelectOrderSendOrdersHistoryT otalOrderStopLossOrdersTotalOrderSwapOrderSymbolOrderTakeProfitOrderTicketOrderTypebool OrderClose( int ticket, double lots, double price, int slippage, void Color)对定单进行平仓操作。
如果函数成功,返回的值是真实的。
如果函数失败,返回的值是假的。
获得详细错误信息,请查看GetLastError()函数。
参量:ticket - 定单编号。
lots - 手数。
price - 收盘价格。
slippage - 最高划点数。
Color - 图表中标记颜色。
如果参量丢失,CLR_NONE值将不会在图表中画出。
示例:if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75){OrderClose(order_id,1,Ask,3,Red);return(0);}bool OrderCloseBy( int ticket, int opposite, void Color)用相反定单对打开仓位进行平仓操作。
MT4-学习自己编写EA总结篇
MT4-学习自己编写 EA 总结篇 学好智能交易系统(EA),让你的梦想从这里起飞
MT4外汇交易平台里给我们提供了一套非常完美的交易系统设计语言-MQL4,通过 MQL4语言可以设计出我们想要的 赚钱模式,一套完美的智能交易系统(EA),让我们躺在睡觉一样能赚钱的程序,iMT4论坛为我们提供了一个能实现 我们梦想的 MT4专业平台,让你的梦想从这里起飞。
Color 类型 颜色类型可以使用以下示例里的几种方式进行定义。
示例:
// symbol constants C'128,128,128' // gray C'0x00,0x00,0xFF' // blue // named color
3
MT4-学习自己编写 EA 总结篇
Red Yellow Black // integer-valued representation 0xFFFFFF // white 16777215 // white 0x008000 // green 32768 // green
int a = 'A'; int b = '$'; int c = '©'; // code 0xA9 int d = '\xAE'; // symbol code ®
李沂鸿原创MT4+EA中级篇
MT4+EA 中级篇第一章:初级EA////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次=0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字= "柒侠伍义_初级EA教程";extern double 开始交易时间=3; //自定义交易时间extern double 结束交易时间=23; //自定义交易时间double 魔术号码=16384; //自定义魔术号码double 死亡日期年=2009; //自定义ea终止日期double 死亡日期月=12; //自定义ea终止日期double 死亡日期日=12; //自定义ea终止日期double 死亡日期时=12; //自定义ea终止日期double 用户账户=90240764; //自定义指定用户帐号double 赢钱目标=10000;//自定义赢太多了不要做单double 输钱目标=500; //自定义输太惨了不要做单string 交易商= ""; //自定义交易商extern string 货币对1 = "EURUSD"; //自定义指定货币对extern string 货币对2 = "EURJPY"; //自定义指定货币对extern string 货币对3 = "GBPUSD"; //自定义指定货币对double 时间周期1=30,时间周期2=60; //自定义时间周期////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 || GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek() !=0 //礼拜不要交易&& DayOfWeek() !=6 //星期6不要交易&& DayOfWeek() !=5 //星期5不要交易&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易&& Y ear()==2009 //限制交易时间:只限2009年可以运行&& (Y ear()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户//指定用户账户&& (AccountBalance()<赢钱目标&& AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&& AccountCompany()==交易商 //指定交易商方可交易&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次&& IsDemo() //限制模拟户口运行&& DayOfWeek() !=0 //礼拜不要交易&& DayOfWeek() !=6 //星期6不要交易&& DayOfWeek() !=5 //星期5不要交易&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易&& Y ear()==2009 //限制交易时间:只限2009年可以运行&& (Y ear()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期&& AccountNumber()==用户账户//指定用户账户&& (AccountBalance()<赢钱目标&& AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单&& AccountCompany()==交易商 //指定交易商方可交易&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////return(0); //叫ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式第2章:删除不是很重要的自定义为了方便学习1.////////////ea 不读这个注解///////////////////////2.#property copyright "柒侠伍义_初级EA教程_商业版本"3.datetime 限制一根柱子下注一次=0; //自定义4.extern double 下注数量=0.1; //自定义5.extern double 止损=200; //自定义6.extern double 止盈=200; //自定义7.extern double 滑点=30; //自定义8.extern bool 使用音乐=true; //true=要用false=不要用9.extern bool 使用弹出提示=false; //true=要用false=不要用10.string ea名字= "柒侠伍义_初级EA教程";11.//extern double 开始交易时间=3; //自定义交易时间12.//extern double 结束交易时间=23; //自定义交易时间13.double 魔术号码=16384; //自定义魔术号码14.//double 死亡日期年=2009; //自定义ea终止日期15.//double 死亡日期月=12; //自定义ea终止日期16.//double 死亡日期日=12; //自定义ea终止日期17.//double 死亡日期时=12; //自定义ea终止日期18.//double 用户账户=90240764; //自定义指定用户帐号19.//double 赢钱目标=10000;//自定义赢太多了不要做单20.//double 输钱目标=500; //自定义输太惨了不要做单21.//string 交易商= ""; //自定义交易商22.//extern string 货币对1 = "EURUSD"; //自定义指定货币对23.//extern string 货币对2 = "EURJPY"; //自定义指定货币对24.//extern string 货币对3 = "GBPUSD"; //自定义指定货币对25.//double 时间周期1=30,时间周期2=60; //自定义时间周期26.////////////ea 不读这个注解///////////////////////27.int start() //ea 开始运行28.{ //开始主程式29.30.HideTestIndicators(true);//命令ea隐藏ea中的指标31.if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 ||GetLastError()==134) {return;}//命令ea如果保证金不足不要交易32.if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易33.34.////////////ea 不读这个注解///////////////////////35.36.if( //开始如果37.OrdersTotal()==0 //没有单可以下注38.&& Close[0]-Open[0]>200*Point //判断上升趋势39.&& Close[1]-Open[1]>200*Point //判断上升趋势40.&& Close[2]-Open[2]>200*Point //判断上升趋势41.&& Close[3]-Open[3]>200*Point //判断上升趋势42.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次43.//&& IsDemo() //限制模拟户口运行44.//&& DayOfWeek() !=0 //礼拜不要交易45.//&& DayOfWeek() !=6 //星期6不要交易46.//&& DayOfWeek() !=5 //星期5不要交易47.//&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易48.//&& Year()==2009 //限制交易时间:只限2009年可以运行49.//&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期50.//&& AccountNumber()==用户账户//指定用户账户51.//&& (AccountBalance()<赢钱目标&& AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单52.//&& AccountCompany()==交易商//指定交易商方可交易53.//&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对54.//&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行55.){56.OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);57.限制一根柱子下注一次=Time[0];58.if(使用音乐){PlaySound("Conditions.wav");}59.if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}60.} // end if 结束如果61.62.////////////ea 不读这个注解///////////////////////63.64.65.if( //开始如果66.OrdersTotal()==0 //没有单可以下注67.&& Open[0]-Close[0]>200*Point //判断下降趋势68.&& Open[1]-Close[1]>200*Point //判断下降趋势69.&& Open[2]-Close[2]>200*Point //判断下降趋势70.&& Open[3]-Close[3]>200*Point //判断下降趋势71.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次72.//&& IsDemo() //限制模拟户口运行73.//&& DayOfWeek() !=0 //礼拜不要交易74.//&& DayOfWeek() !=6 //星期6不要交易75.//&& DayOfWeek() !=5 //星期5不要交易76.//&& (Hour()>开始交易时间&&Hour()<结束交易时间) //限制交易时间:早上3点到晚上10点可以交易77.//&& Year()==2009 //限制交易时间:只限2009年可以运行78.//&& (Year()<=死亡日期年&&Month()<=死亡日期月&&Day()<=死亡日期日&&Hour()<=死亡日期时) //ea死亡日期79.//&& AccountNumber()==用户账户//指定用户账户80.//&& (AccountBalance()<赢钱目标&& AccountBalance()>输钱目标) //赢太多了不要做单输太惨了不要做单81.//&& AccountCompany()==交易商//指定交易商方可交易82.//&& (Symbol()==货币对1||Symbol()==货币对2||Symbol()==货币对3) //指定货币对83.//&& (Period()==时间周期1||Period()==时间周期2) //指定时间周期运行84.){85.OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);86.限制一根柱子下注一次=Time[0];87.if(使用音乐){PlaySound("Conditions.wav");}88.if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}89.} // end if 结束如果90.91.92.////////////ea 不读这个注解///////////////////////93.94.return(0); //叫ea 重复运行每秒大概可能重新运算100次95.} //start to end 结束主程式复制代码第3章:真正删除不重要的1.2.3.////////////ea 不读这个注解///////////////////////4.#property copyright "柒侠伍义_初级EA教程_商业版本"5.datetime 限制一根柱子下注一次=0; //自定义6.extern double 下注数量=0.1; //自定义7.extern double 止损=200; //自定义8.extern double 止盈=200; //自定义9.extern double 滑点=30; //自定义10.extern bool 使用音乐=true; //true=要用 false=不要用11.extern bool 使用弹出提示=false; //true=要用 false=不要用12.string ea名字= "柒侠伍义_初级EA教程";13.double 魔术号码=16384; //自定义魔术号码14.////////////ea 不读这个注解///////////////////////15.int start() //ea 开始运行16. { //开始主程式17.HideTestIndicators(true);//命令ea隐藏ea中的指标18.if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 ||GetLastError()==134) {return;}//命令ea如果保证金不足不要交易19.if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易20.////////////ea 不读这个注解///////////////////////21.22.if( //开始如果23.OrdersTotal()==0 //没有单可以下注24.&& Close[0]-Open[0]>200*Point //判断上升趋势25.&& Close[1]-Open[1]>200*Point //判断上升趋势26.&& Close[2]-Open[2]>200*Point //判断上升趋势27.&& Close[3]-Open[3]>200*Point //判断上升趋势28.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次29.){30.OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);31.限制一根柱子下注一次=Time[0];32.if(使用音乐){PlaySound("Conditions.wav");}33.if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}34.} // end if 结束如果35.////////////ea 不读这个注解///////////////////////36.37.if( //开始如果38.OrdersTotal()==0 //没有单可以下注39.&& Open[0]-Close[0]>200*Point //判断下降趋势40.&& Open[1]-Close[1]>200*Point //判断下降趋势41.&& Open[2]-Close[2]>200*Point //判断下降趋势42.&& Open[3]-Close[3]>200*Point //判断下降趋势43.&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次44.){45.OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);46.限制一根柱子下注一次=Time[0];47.if(使用音乐){PlaySound("Conditions.wav");}48.if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}49.} // end if 结束如果50.51.////////////ea 不读这个注解///////////////////////52. return(0); //叫ea 重复运行每秒大概可能重新运算100次53. } //start to end 结束主程式第4章:把复杂变简单-子程式注意变法!把这个ea save as另外一个新的名字比如:my3ea////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次=0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字= "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////策略管理(); //子程式////////////ea 不读这个注解///////////////////////return(0); //叫ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式////////////ea 不读这个注解///////////////////////void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果} //结束子程式第5章:把复杂变简单-子程式中的子程式////////////ea 不读这个注解///////////////////////#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次=0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字= "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码////////////ea 不读这个注解///////////////////////int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易////////////ea 不读这个注解///////////////////////策略管理(); //子程式////////////ea 不读这个注解///////////////////////return(0); //叫ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式////////////ea 不读这个注解///////////////////////void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){买上();} // end if 结束如果////////////ea 不读这个注解///////////////////////if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}} // end if 结束如果} //结束策略管理子程式/////////////////////////////////////////////////void 买上(){ //买上子程式开始OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}}//结束买上第6章:把复杂变简单-卖下子程式你应当学会把买上变成子程式试一试把卖下变成子程式//---------------------------------------------------------------#property copyright "柒侠伍义_初级EA教程_商业版本"datetime 限制一根柱子下注一次=0; //自定义extern double 下注数量=0.1; //自定义extern double 止损=200; //自定义extern double 止盈=200; //自定义extern double 滑点=30; //自定义extern bool 使用音乐=true; //true=要用 false=不要用extern bool 使用弹出提示=false; //true=要用 false=不要用string ea名字= "柒侠伍义_初级EA教程";double 魔术号码=16384; //自定义魔术号码//---------------------------------------------------------------int start() //ea 开始运行{ //开始主程式HideTestIndicators(true);//命令ea隐藏ea中的指标if(AccountFreeMarginCheck(Symbol(),OP_BUY,下注数量)<=0 || GetLastError()==134) {return;}//命令ea如果保证金不足不要交易if(AccountFreeMarginCheck(Symbol(),OP_SELL,下注数量)<=0 ||GetLastError()==134){return;}//命令ea如果保证金不足不要交易策略管理(); //子程式return(0); //叫ea 重复运行每秒大概可能重新运算100次} //start to end 结束主程式//---------------------------------------------------------------void 策略管理() { //子程式if( //开始如果OrdersTotal()==0 //没有单可以下注&& Close[0]-Open[0]>200*Point //判断上升趋势&& Close[1]-Open[1]>200*Point //判断上升趋势&& Close[2]-Open[2]>200*Point //判断上升趋势&& Close[3]-Open[3]>200*Point //判断上升趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){买上();} // end if 结束如果if( //开始如果OrdersTotal()==0 //没有单可以下注&& Open[0]-Close[0]>200*Point //判断下降趋势&& Open[1]-Close[1]>200*Point //判断下降趋势&& Open[2]-Close[2]>200*Point //判断下降趋势&& Open[3]-Close[3]>200*Point //判断下降趋势&& 限制一根柱子下注一次!=Time[0] //限制一根柱子下注一次){卖下();} // end if 结束如果} //结束策略管理子程式//---------------------------------------------------------------void 买上(){ //买上子程式开始OrderSend(Symbol(),OP_BUY,下注数量,Ask,滑点,Ask-止损*Point,Ask+止盈*Point,""+ea名字+"",魔术号码,0,Green);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"buy开仓,余额资金::",AccountBalance()," ");}}//结束买上子程式//---------------------------------------------------------------卖下(){//卖下子程式开始OrderSend(Symbol(),OP_SELL,下注数量,Bid,滑点,Bid+止损*Point,Bid-止盈*Point,""+ea名字+"",魔术号码,0,Red);限制一根柱子下注一次=Time[0];if(使用音乐){PlaySound("Conditions.wav");}if(使用弹出提示){Alert(" M",Period()," ",Symbol(),"sell开仓,余额资金::",AccountBalance()," ");}}//结束卖下子程式//---------------------------------------------------------------第7章:macd sample打开你的macd sample找一个叫OrderClose的东西我们来做一个OrderClose的子程式//+------------------------------------------------------------------+//| MACD Sample.mq4 |//| Copyright ?2005, MetaQuotes Software Corp. | //| / |//+------------------------------------------------------------------+extern double TakeProfit = 50;extern double Lots = 0.1;extern double TrailingStop = 30;extern double MACDOpenLevel=3;extern double MACDCloseLevel=2;extern double MA TrendPeriod=26;//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int start(){double MacdCurrent, MacdPrevious, SignalCurrent;double SignalPrevious, MaCurrent, MaPrevious;int cnt, ticket, total;// initial data checks// it is important to make sure that the expert works with a normal // chart and the user did not make any mistakes setting external// variables (Lots, StopLoss, TakeProfit,// TrailingStop) in our case, we check TakeProfit// on a chart of less than 100 barsif(Bars<100){Print("bars less than 100");return(0);}if(TakeProfit<10){Print("TakeProfit less than 10");return(0); // check TakeProfit}// to simplify the coding and speed up access// data are put into internal variablesMacdCurrent=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,MA TrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);MaPrevious=iMA(NULL,0,MA TrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);total=OrdersTotal();if(total<1){// no opened orders identifiedif(AccountFreeMargin()<(1000*Lots)){Print("We have no money. Free Margin = ", AccountFreeMargin());return(0);}// check for long position (BUY) possibilityif(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious){ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);if(ticket>0){if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());}else Print("Error opening BUY order : ",GetLastError());return(0);}// check for short position (SELL) possibilityif(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious){ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);if(ticket>0){if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());}else Print("Error opening SELL order : ",GetLastError());return(0);}return(0);}// it is important to enter the market correctly,// but it is more important to exit it correctly...for(cnt=0;cnt<total;cnt++){OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);if(OrderType()<=OP_SELL && // check for opened positionOrderSymbol()==Symbol()) // check for symbol{if(OrderType()==OP_BUY) // long position is opened{// should it be closed?if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&MacdCurrent>(MACDCloseLevel*Point)){OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close positionreturn(0); // exit}// check for trailing stopif(TrailingStop>0){if(Bid-OrderOpenPrice()>oint*TrailingStop){if(OrderStopLoss()<Bid-Point*TrailingStop){OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTak eProfit(),0,Green);return(0);}}}}else // go to short position{// should it be closed?if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&MacdPrevious<SignalPrevious &&MathAbs(MacdCurrent)>(MACDCloseLevel*Point)){OrderClose(OrderTicket(),OrderLots(),Ask,3,V iolet); // close positionreturn(0); // exit}// check for trailing stopif(TrailingStop>0){if((OrderOpenPrice()-Ask)>(Point*TrailingStop)){if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)){OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTa keProfit(),0,Red);return(0);}}}}}}return(0);}// the end.第8章:macd sample 解读版如果你还不知道macd sample讲什么,下面解读你就要仔细的研究一番1.2./*3.MACD Sample详解4.//+------------------------------------------------------------------+5.//| MACD Sample.mq4 |6.//| Copyright ?2005, MetaQuotes Software Corp. |7.//| / |8.//+------------------------------------------------------------------+9.以上是垃圾10.*/11.//这是自定义函数12.extern double TakeProfit = 50; //盈利目标点数13.extern double Lots = 0.1; //每单入场的手数14.extern double TrailingStop = 30; //追踪止损的点数15.extern double MACDOpenLevel=3; //MACD开仓的参考位置16.extern double MACDCloseLevel=2; //MACD出场的参考位置17.extern double MATrendPeriod=26; //条件中使用的MA均线的周期数18.//程序最上面extern开始的这些数据都是程序参数,19.//也就是在使用者调用的时候可以修改的部分。
【MQL4】带注释的完整的外汇EA基础构架
【MQL4】带注释的完整的外汇EA基础构架希望学习EA编程的朋友,可以参考如下我们提供的源码【带注释】这个EA例子的交易逻辑是:N日高点 N日低点,超过高点做空,低过低点做多。
带止损止盈及移动止损的处理部分。
如果你能细心研究掌握此EA的设计逻辑,基本可以入门MQL的实战编程了。
还是那句老话:自己多动脑,多做实验!源码如下:#property copyright "Copyright ?2012, ." //指标版权信息#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 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 (Bid<StopLost-2*TrailingStop*Point){OrderModify(Tick,OrderOpenPrice(),StopLost-TrailingStop*Point,0,0,CLR_NONE);return;}}break;}return;}return(-1);}//=================自定义函数部分====================================== int GetOrderTypeHolding()//从最近持仓单提取订单类型,如果没有持仓单,则认为是止赢出场或程序刚开始运行返回-1 {int Type=-1;//int temptime=0;for(int i=OrdersT otal()-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]<NLow)//做空条件成立{return(true);}break;}return(false);}。
EA编程教程第二讲-数据类型
EA编程教程第⼆讲-数据类型EA编程教程第⼀讲-MQL语法什么是MQL?MetaQuotes Language 4 (MQL4)语⾔是MT4软件为了编写出执⾏交易策略的内置编程语⾔。
我们可以通过编写EA(Expert Advisors)来控制MT4客户端按照我们的预先定义好的交易策略来执⾏外汇交易。
另外,我们可以使⽤mql来编写技术分析指标,脚本和库。
1)MQL的语法MQL的语法与我们平时见到的C语⾔语法极其类似,但仍然有以下不⼀致的地⽅:⼀:没有地址运算符。
⼆:没有do while操作语句三:没有goto语句。
四:没有?::语句。
五:没有结构体。
六:不⽀持复杂的赋值语句,⽐如 val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0;这种复杂语句不被⽀持。
2)注释多⾏注释从/*开始并以*/结束。
注释符不能嵌套,只能头尾各⼀个。
单⾏注释符为//,仅注释⼀⾏。
我们写程序的时候要养成注释的习惯,可以让程序更好理解,同时MQL编译器⾃动忽略掉注释的内容。
注释的内容只给我们⼈看,不是给机器看的。
⽐如:// 这个是单⾏注释/* 这个是多⾏注释int i = 0;注释⾥⾯爱写什么都⾏*/3)标识符标识符是程序⾥⾯变量,函数,数据类型的名称,长度不能超过31个字符,标识符可以由数字,⼤⼩写字母a到z和A到Z,下划线(_),其中第⼀个符号不能是数字,并且标识符不能与保留字⼀样。
什么是保留字请看下⽂。
4)保留字保留字是MQL语⾔定义好的单词,每个单词都有这特殊的意义。
保留字如下:数据类型:bool,color,datetime,double,int,string,void存储类型: extern,static操作符:break,case,continue,default,else,for,if,return,switch,while其他:false,true课程简介:什么是MQL?MetaQuotes Language 4 (MQL4)语⾔是MT4软件为了编写出执⾏交易策略的内置编程语⾔。
