MT4MT5外汇EA编程教程大全之交易函数
- 格式:doc
- 大小:39.50 KB
- 文档页数:13
外汇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章:真正删除不重要的是不是好看一点了?哈哈和。
1、MT4 自带EA(MA)解析与实战分析2、MT4 自带EA(MACD)解析与实战分析1、MT4 自带EA(MA)解析与实战分析一、均线穿越交易系统EA详解MT4 平台自带了一个自动交易的EA 指标,那就是Moving Average ,下面详细解释该系统每条语句的功能说明,以便深入认识EA 的编程内核。
//+------------------------------------------------------------------+//| Moving Average.mq4 |//| Copyright ?2005, MetaQuotes Software Corp. |//| / |//+------------------------------------------------------------------+#define MAGICMA 20050610//定义本EA 操作的订单的唯一标识号码,由此可以实现在同一账户上多系统操作,各操作EA 的订单标识码不同,就不会互相误操作。
凡是EA 皆不可缺少,非常非常重要!extern double Lots = 0.1; //每单的交易量extern double MaximumRisk = 0.02;//本系统最大风险系数,即可以动用总资金的2%extern double DecreaseFactor = 3; //下跌因素个数extern double MovingPeriod = 12; //均线的计算周期=12 根K 线;extern double MovingShift = 6; //均线在K 线图中向右显示的偏移量=6 根K 线;//extern 确定从外部程序输入的变量,会直接显现输入数据窗口。
数列本身不能作为外部变量。
注意:iMA 中的MovingShift(均线偏移量)是指均线指标在图上绘制时向左、右移动的K线个数,主要为了使图中结果更好看,并不会对MA 的计算数值产生变化。
Timeseries access时间序列图表数据任何可见货币对/时间周期的价格数据的一组函数。
如果请求数据(货币对名称/时间周期不同于当前图表)来自其他图表,这种情况可能使相应的图表不能在客户端内打开,并且需要从服务器上请求数据。
这种情况下,错误 ERR_HISTORY_WILL_UPDATED (4066 - 请求历史数据并刷新)将被放置于last_error变量中,并且可以重新请求(查看ArrayCopySeries()范例)。
在测试中,相同货币对但不同时间周期的价格价位被塑造(除成交量外)。
其他货币对的价格数据不被塑造。
这些情况下,在时间数组的柱总数被塑造。
iBars柱的数量int iBars( string symbol, int timeframe)在指定的图表内返回柱的数量。
对于当前图表柱总量的信息在预定义的变量中命名为Bars。
参量:symbol - 需应用到计算指标的货币对数据 NULL 意味当前货币对名称。
timeframe - 时间周期。
可以是时间周期列举的任意值。
0 意味着当前图表的时间周期。
示例:Print("在货币对'EUROUSD'带有PERIOD_H1 柱数",iBars("EUROUSD",PERIOD_H1));iBarShift开始时间的柱int iBarShift( string symbol, int timeframe, datetime time, void exact)搜索柱开始的时间。
函数返回指定开始时间的柱。
如果柱的指定开始时间是省缺值,函数将返回-1或最近的柱exact。
参量:symbol - 需应用到计算指标的货币对数据 NULL 意味当前货币对名称。
timeframe - 时间周期。
可以是时间周期列举的任意值。
0 意味着当前图表的时间周期。
time - 查找值 (柱的开始时间)。
exact - 未发现柱的返回模式。
m t4交易代码Ord erTypeint OrderType( )对于当前选择定单返回定单类型。
可以是以下的任意值:OP_BUY -买进,OP_SELL - 卖出,OP_BUYLIMIT - 挂单买入限定,OP_BUYSTOP - 挂单停止限定,OP_SELLLIMIT - 挂单卖出限定,OP_SELLSTOP - 挂单停止限定。
注解: 定单必须由OrderSelect()函数选择。
示例:int order_type;if(OrderSelect(12, SELECT_BY_POS)==true){order_type=OrderType();// ...}elsePrint("OrderSelect() 返回错误 - ",GetLastError());Ord erSymbolstring OrderSymbol( )对于选择定单返回定单货币对值。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(12, SELECT_BY_POS)==true)Print("定单 #货币对", OrderTicket(), " is ", OrderSymbol());elsePrint("OrderSelect 失败错误代码是",GetLastError());Ord ersTotalint OrdersTotal( )返回市场和挂单的总数示例:int handle=FileOpen("OrdersReport.csv",FILE_WRITE|FILE_CSV,"\t");if(handle<0) return(0);// 写标题FileWrite(handle,"#","开价格","买入时间","货币对","手数");int total=OrdersTotal();// 编写定单命令for(int pos=0;pos<total;pos++){if(OrderSelect(pos,SELECT_BY_POS)==false) continue;FileWrite(handle,OrderTicket(),OrderOpenPrice(),OrderOpenTime(),OrderSymbol(), OrderLots());}FileClose(handle);OrderSend开仓int OrderSend(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, void comment, void magic, void expiration, void arrow_color)参量:symbol - 交易货币对。
创建一简易的人工智能系统举例说明让我们将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轴以下,为向上趋势且与向下趋势的信号线相交。
MT4智能交易(程式的执行)在探讨程序的时候可以拿一个简单的EA可以拿来分析一下其执行的步骤。
这样对EA的执行会有一个更加明确的概念。
下面我就拿一个简单的EA来分析一下它的执行逻辑。
EA程式://--------------------------------------------------------------------int Count=0; // 整体变量//--------------------------------------------------------------------int init() // 特殊函数 init(){Alert ("Function init() triggered at start"); // 警报return; // 退出 init()}//--------------------------------------------------------------------int start() // 特殊函数 start(){double Price = Bid; // 局部变量Count++; // Tick 计数器Alert("New tick ",Count," Price = ",Price);// 警报return; // 退出 start()}//--------------------------------------------------------------------int deinit() // 特殊函数 deinit(){Alert ("Function deinit() triggered at deinitialization");// 警报return; // 退出 deinit()}//--------------------------------------------------------------------以上程式按照下列步骤运行:1. 当EA附到图表上之后,客户终端将控制权传给EA,然后EA开始运行。
MT4MT5外汇EA编程教程大全之交易函数一、交易函数介绍1、 OrderSend(函数OrderSend(函数是EA程序中用于下达交易的核心函数。
它的作用是以市价或限价发出市场位或限价位的指令。
2、 OrderModify(函数OrderModify(函数的作用是修改处于有效状态的交易指令。
3、 OrderClose(函数OrderClose(函数是核心函数,它的作用是把有效的交易指令平仓,它只能关闭有效的市价或限价位交易指令,而不能关闭已经结算的位置交易指令。
4、 OrderDelete(函数OrderDelete(函数的作用是从交易账户中删除尚未执行的交易指令。
它只能删除尚未在市场中执行且处于有效状态的市价或限价位的指令,而不能删除已经在市场中执行的指令。
5、 OrderSelect(函数OrderSelect(函数是一个非常重要的函数,它的作用是从交易账户中调取需要的交易指令。
6、 OrderPrint(函数OrderPrint(函数的作用是将交易账户中的交易指令在终端的列表窗口中显示出来,可以打印出位于市场中的交易指令以及所有的历史交易指令的详细信息。
7、 OrderProfit(函数OrderProfit(函数的作用是返回一个有效交易订单的实际盈利金额。
8、 OrdersTotal(函数OrdersTotal(函数的作用是返回交易账户中当前有效的交易指令总数,该函数通常与OrderStep(函数配合使用,可以快速统计出交易账户当前有效的交易指令总数。
二、OrderSend(函数详解1、函数功能OrderSend(函数是EA程序中用于发出市场位或限价位指令的核心函数,它的作用是以市价或限价发出市场位或限价位的指令。
MT4 MT5外汇EA编程教程大全之交易函数(三)从自定义指标中不能调用OrderSend(), OrderClose, OrderCloseBy, OrderDelete和OrderModify交易函数。
OrderCloseOrderCloseByOrderClosePriceOrderCloseTimeOrderCommentOrderCommissionOrderDeleteOrderExpirationOrderLotsOrderMagicNumberOrderModifyOrderOpenPriceOrderOpenTimeOrderPrintOrderProfitOrderSelectOrderSendOrdersHistoryTotalOrderStopLossOrdersTotalOrderSwapOrderSymbolOrderTakeProfitOrderTicketOrderTypebool 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)用相反定单对打开仓位进行平仓操作。
MT4MT5外汇EA编程教程大全之数组函数数组函数是MetaTrader 4(MT4)和MetaTrader 5(MT5)外汇交易平台中非常重要的一部分。
在编写外汇自动交易程序(EA)时,数组函数能帮助您进行数据的存储、处理和分析。
本篇教程将介绍一些常用的数组函数及其用法。
1. ArrayCopy:这个函数用于将一个数组的数据复制到另一个数组。
它有四个参数,分别是源数组、目标数组、源数组起始位置和目标数组起始位置。
下面是一个例子:```double sourceArray[10];double targetArray[10];ArrayCopy(sourceArray, targetArray, 0, 0);```2. ArrayInitialize:这个函数用于给数组的所有元素赋予一个初始值。
它有两个参数,分别是目标数组和初始值。
下面是一个例子:```double array[10];ArrayInitialize(array, 0);```3. ArrayRange:这个函数用于获取数组的一个子范围。
它有三个参数,分别是源数组、起始索引和结束索引。
下面是一个例子:```double sourceArray[10];double targetArray[5];ArrayRange(sourceArray, 0, 4, targetArray);```4. ArraySetAsSeries:这个函数用于将数组从头到尾翻转。
它有一个参数,即目标数组。
下面是一个例子:```double array[10];ArraySetAsSeries(array, true);```5. ArraySize:这个函数用于获取数组的长度。
它只有一个参数,即目标数组。
下面是一个例子:```double array[10];int size = ArraySize(array);```6. CopyBuffer:这个函数用于将指标缓冲区的数据复制到一个数组中。
MT4 MT5外汇EA编程教程大全之日期时间函数(四)表示时间类型数据的一组函数(从1970年1月1日午夜开始以秒为单位计算)。
DayDayOfWeekDayOfYearHourMinuteMonthSecondsTimeCurrentTimeDayTimeDayOfWeekTimeDayOfYearTimeHourTimeLocalTimeMinuteTimeMonthTimeSecondsTimeYearYearint Day( )返回这个月的当天,最后一次访问服务器的时间。
注解: 在测试中, 时间格式为最后设定的服务器模式。
示例:if(Day()<5) return(0);int DayOfWeek( )返回这周的星期数,(0-星期天,1,2,3,4,5,6 以此类推)来自最后已知的服务器上的时间。
注解: 在测试中, 时间格式为最后设置的服务器模式。
示例:// 假期不工作if(DayOfWeek()==0 || DayOfWeek()==6) return(0);int DayOfYear( )返回年的当天(1 代表1月1 日.., 365(6) 就是12月31 日),最后访问服务器的时间。
注解: 在测试中, 时间格式为最后已知的服务器模式。
示例:if(DayOfYear()==245)return(true);int Hour( )在程序开始以前的片刻,返回小时数(0,1,2,..23) 最后访问的服务器时间(在程序执行之内的时期这个值不会改变) 。
注解: 在测试中, 时间格式为最后设置的服务器模式。
示例:bool is_siesta=false;if(Hour()>=12 || Hour()<17)is_siesta=true;int Minute( )在程序开始以前的片刻,返回当前的分钟(0,1,2,..59)最后访问的服务器时间(在程序执行期间这个值不会改变) 。
MT4 MT5外汇EA编程教程大全之数组函数(五)使用数组的一组函数。
数组的最大维数为四维。
每个维数被索引编为从0 至维度-1。
事实上,第一维数组的50 个,在调用时第一个数组显示为[0], 最后一个数组显示为[49]。
使用这些函数(除那些改变定量和定性的数组外)能够预定义时间系列Time[], Open[], High[], Low[], Close[], Volume[]ArrayBsearchArrayCopyArrayCopyRatesArrayCopySeriesArrayDimensionArrayGetAsSeriesArrayInitializeArrayIsSeriesArrayMaximumArrayMinimumArrayRangeArrayResizeArraySetAsSeriesArraySizeArraySortint ArrayBsearch( double array[], double value, void count, void start, void direction)如果没有发现事件,值会返回到第一个维度的数组或者最近的一个数组。
此函数不能用在字符型或连续数字的数组上(除打开柱的连续数组)。
注解: 双元查找只能够存储数。
存储数字数组使用ArraySort() 函数。
参量:array[] - 需要搜索的数组.value - 将要搜索的值count - 搜索的数量,默认搜索所有的数组.start - 搜索的开始点,默认从头开始.direction - 搜索的方向:MODE_ASCEND 顺序搜索,MODE_DESCEND 倒序搜索.示例:datetime daytimes[];int shift=10,dayshift;// 全部 Time[] 数组被排列在后面的形式ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);if(Time[shift]>=daytimes[0]) dayshift=0;else{dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);if(Period()<PERIOD_D1) dayshift++;}Print(TimeToStr(Time[shift])," corresponds to ",dayshift," day bar opened at ", TimeToStr(daytimes[dayshift]));ArrayCopyint ArrayCopy( void dest[], object source[], void start_dest, void start_source, void count) 复制一个数组到另外一个数组。
MT4智能交易(OrderModify()函数)在外汇交易中,市场的信息瞬息万变。
根据市场的变化,我们往往要及时跟进修改自己交易的策略。
当然这是建立在已有的基础上。
比如EA在市场符合一定的条件之后开了一个单子并设定了止盈止损。
那么如果中途根据市场的改变而想相应地改变止盈止损的设置,就有会用到OrderModify() 函数。
它的完整构成为:bool OrderModify(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)这个函数可以修改即时单和挂单的参数值。
当函数返回TRUE时,表明修改已经成功。
如果返回的值为FALSE,则说明修改失败。
ticket - 这个命令的编号price - 更改后的挂单或市场单的新价位stoploss - 新的止损价位takeprofit - 新的止盈价位expiration - 挂单的过期时间arrow_color - 修改的止损止盈箭头在图表上的颜色。
如果这个参数没有设置或者等于CLR_NONE,箭头将不会在图标上显示。
注意:只有挂单才能修改开仓价位和单子的有效时间。
市场单的修改一个标准的市场单包含止赢和止损价位以用来保护盈利或者控制损失。
如果不用EA,用户也可以随时改变单子的止损。
那就是通过使用平台提供的追踪止损这个功能。
当然,OrderModify()函数很大地拓展了改单的功能。
它不仅可以改变止损止盈价位,还可以取消他们。
但是要注意的是市场单修改时要有范围的限制。
这个限制就是止损价位和现价要有一定的距离。
这个最小的差价是交易商设定的。
可能每个交易商会有不一样。
如果用这个函数设置了一个比交易商规定的最小止损差价还要小的差价,那么这个请求将会被客户终端拒绝,导致修改失败。
挂单的修改修改挂单和市场单有一点区别。
mt4EA编程中的开平仓语句在mt4平台上要编写一个自动交易的ea,那其最基本的策略思路就是根据某种条件开仓。
这就涉及到两个概念:一个条件,一个开仓。
条件是根据不同的交易策略思路而定的,可以比较K线阴阳作为开仓条件,也可以将均线金叉死叉作为开仓条件,等等,也可以说开仓条件是千万种的。
而开仓就是执行开仓语句或者说开仓函数来开新订单。
在mql4语言中,开仓函数是OrderSend()函数,我们可以先看一下OrderSend()的结构:int OrderSend(string symbol, //货币名称int cmd, // 订单类型double volume, // 手数double price, // 价格int slippage, // 偏差double stoploss, // 止损double takeprofit, // 止盈string comment=NULL, // 注释int magic=0, // 订单识别码datetime expiration=0, // 有效期(用于挂单)color arrow_color=clrNONE // 颜色);在原则上,MQL4语言将OrderSend()函数归为int类型。
实际执行当中我们用bool类型也是可以的。
这里不讨论挂单,只以开现价单来说,如果要成功执行OrderSend()函数,那么就需要正确赋值其各个参量所需数值:•货币名称默认Symbol()为当前图表货币;•订单类型多单为OP_BUY,空单为OP_SELL;•手数我们可以定义ea输入变量:input double Lots = 0.03;•价格,开多单是Ask,开空单用Bid;•偏差我们也可以定义个ea输入变量:input int slippage = 10;•止损同样定义输入变量:input int StopLoss = 500;//止损点数•止盈和止损一样定义:input int TakeProfit = 1000;//止盈点数•注释可以根据需要定义,也可以留“”空值;•订单识别码可以定义:input int my_magic = 172583815;//订单识别码•有效期对于挂单有效,现价单用0值代替;•颜色,开仓点位图表上标记箭头颜色,根据需要设置,不需要就复制clrNONE;每个参量的赋值弄好后,我们假设条件是阳线开多单,阴线开空单,那么下面就可以用OrderSend()开仓函数来执行开多单和空单了。
MT4MT5外汇EA编程教程大全之日期时间函数1、Time函数Time函数用于获取当前服务器时间,即GMT时间,这是一个用于时间基衡的,与你的本地时间相差一个时差的时间。
Time函数的语法格式:返回值类型:long,即整数类型,以秒为单位Time函数实例://取得GMT时间long lGMTTime = Time(;2、TimeLocal函数TimeLocal函数用于取得当前本地时间。
TimeLocal函数的语法格式:TimeLocal()返回值类型:long,即整数类型,以秒为单位TimeLocal函数实例://取得本地时间long lLocalTime = TimeLocal(;3、TimeCurrent函数TimeCurrent函数用于取得当前的服务器时间或本地时间等,它可以获取的参数与该函数的返回值规格一样(可选参数TimeLocal(/TimeGMT(/TimeCurrent()。
TimeCurrent函数的语法格式:TimeCurrent([可选参数])返回值类型:long,即整数类型,以秒为单位TimeCurrent函数实例://取得当前时间long lCurrentTime = TimeCurrent(;4、TimeDay函数TimeDay函数用于取得当日的服务器时间,此时间是单经过的秒数,而不是从零点开始的秒数。
TimeDay函数的语法格式:TimeDay([可选参数])返回值类型:long,即整数类型,以秒为单位TimeDay函数实例://取得其中一日的当前时间long lNowTime = TimeDay(;5、TimeWeek函数TimeWeek函数可以取得当前服务器时间的星期几,以数字形式输出,星期一为1,星期日为7TimeWeek函数的语法格式:TimeWeek()返回值类型:int,以数字表示TimeWeek函数实例:。
MT4智能交易(OrderSend()函数)OrderSend() 是EA 里用来下单或者挂单的函数。
这个函数的完整组成为:int OrderSend (string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)Ordersend: 这个函数的名字。
这个函数将返回一个ticket号(ticket号码是一个单子的单号)作为该命令的号码;或者返回-1的值——如果交易请求被终端或服务器拒绝的话。
如果想要知道被拒绝的原因,可以由函数GetLastError() 得出。
symbol: 货币对的名称。
比如欧元美元的名称为EURUSD。
cmd:交易的种类。
比如说买单或者卖单。
volume:交易手数。
price: 价位。
可以为即时变动买卖价位,或者设定固定价位。
slippage: 在开市价单时市场价位的最大允许滑点数。
只对市价单起作用,和挂单无关。
stoploss: 止损价位。
takeprofit: 止盈价位。
comment:对此单的文字叙述。
magic:单子的magic号码。
用于对此单的识别。
expiration: 单子的作废时间。
此日到来时挂单会自动取消。
arrow_color:在图表上的开仓箭头的颜色。
如果没有这个参数或者它的值等于CLR_NONE,则图表上不会显示任何标记。
当然上面的很多参数并不都会用到。
我们可以举一个简化的下单指令的例子://--------------------------------------------------------------------int start() // 特殊函数 start(){ // 开仓买单OrderSend("EURUSD",OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);return; // 退出 start()}//--------------------------------------------------------------------在上面这个例子里,下单指令的分析如下:交易货币对:EURUSD开仓类型:买单手数:0.1手价位:市场卖价滑点:3点止损:市场买价减去15点止盈:市场买价加上15点把这个开单的命令放到EA里,就可以执行开单部分的操作了。
外汇交易MT4编程入门:自定义函数自定义函数与数学函数在本质上是一致的例如:数学函数ft(x,y)=3x+2y (x,y为正整数) 写成程序语句就是:int ft(int x,int y){int temp;temp=3*x+2*y;return(temp);}一、和自定义变量一样,自定义函数在使用前,也必须先设立,以定义其类型、名称、参数和运算语句。
函数类型、名称、参数位于函数头部(参数间以逗号分隔),大括号中的是运算语句,也就是函数体部分。
return语句为函数结束语句,return后面括号中的值为函数返回值,即函数运算结果。
上例中,int为函数类型,表示该函数的返回值(运算结果)是整数;(x,y)为参数,由于自定义变量使用之前都必须先创建,所以要加上类型定义词intft为函数名,有了函数名,我们就可以在别处用ft(2,1)的形式来调用此函数;函数体部分有三句:第一句,定义一个整形变量temp第二句,计算temp的值第三句,函数结束,返回调用点,以temp的值作为本函数返回值。
此函数也可以简写为:int ft(int x,int y) {return(3*x+2*y);}二、函数类型与类型符函数类型就是函数返回值(运算结果)的类型,与自定义变量类型差不多有整型(int)、双精度型(double)、字符串型(string)、逻辑型(bool)等,还有一种函数是以函数运行为目的,运行结束后不需要返回值也没有返回值的,则函数类型可以写成void(无值型)三、函数中如果定义了自定义变量,那么此变量仅在本函数内部存在,函数运行结束时,自定义变量也就自动注销。
上例中,有x、y、temp三个自定义变量,在函数运行时创建,在函数运行结束时自动消失,仅在函数内部有效,与函数外部无关。
四、函数的调用函数调用非常简单,只要函数名正确、参数个数一致、类型相同就能正确调用如我们前面创建了ft(x,y)函数,则别处我们可以用ft(4,5)等样式来调用ft(x,y)函数求值。
MT4 MT5外汇EA编程教程大全之交易函数(三)从自定义指标中不能调用OrderSend(), OrderClose, OrderCloseBy, OrderDelete和OrderModify交易函数。
OrderCloseOrderCloseByOrderClosePriceOrderCloseTimeOrderCommentOrderCommissionOrderDeleteOrderExpirationOrderLotsOrderMagicNumberOrderModifyOrderOpenPriceOrderOpenTimeOrderPrintOrderProfitOrderSelectOrderSendOrdersHistoryTotalOrderStopLossOrdersTotalOrderSwapOrderSymbolOrderTakeProfitOrderTicketOrderTypebool 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 MT5外汇EA编程教程大全之交易函数(三)从自定义指标中不能调用OrderSend(), OrderClose, OrderCloseBy, OrderDelete和OrderModify交易函数。
OrderCloseOrderCloseByOrderClosePriceOrderCloseTimeOrderCommentOrderCommissionOrderDeleteOrderExpirationOrderLotsOrderMagicNumberOrderModifyOrderOpenPriceOrderOpenTimeOrderPrintOrderProfitOrderSelectOrderSendOrdersHistoryTotalOrderStopLossOrdersTotalOrderSwapOrderSymbolOrderTakeProfitOrderTicketOrderTypebool 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)用相反定单对打开仓位进行平仓操作。
如果函数成功,返回的值是真实的。
如果函数失败,返回的值是假的。
获得详细错误信息,请查看GetLastError()函数。
参量:ticket - 定单编号。
opposite - 相对定单编号Color - 图表中标记颜色。
如果参量丢失,CLR_NONE值将不会在图表中画出示例:if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75){OrderCloseBy(order_id,opposite_id);return(0);}double OrderClosePrice( )对于当前选择定单返回收盘价格。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(ticket,SELECT_BY_POS)==true)Print("对于定单 ",定单编号" = ",OrderClosePrice()的收盘价格);elsePrint("OrderSelect 失败错误代码是",GetLastError());datetime OrderCloseTime( )对于当前选择定单返回平仓时间。
如果定单时间不是0,所选定单会从账户历史重新尝试。
开仓和挂单交易平仓时间必须等于 0。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10,SELECT_BY_POS,MODE_HISTORY)==true){datetime ctm=OrderOpenTime();if(ctm>0) Print("定单10 "开仓时间, ctm);ctm=OrderCloseTime();if(ctm>0) Print("定单 10 "平仓时间, ctm);}elsePrint("OrderSelect失败错误代码是",GetLastError());string OrderComment( )返回定单的注释。
注解:定单必须用OrderSelect()函数提前选定。
示例:string comment;if(OrderSelect(10,SELECT_BY_TICKET)==false){ Print("OrderSelect 失败错误代码是",GetLastError());return(0);}comment = OrderComment();// ...double OrderCommission( )返回定单的佣金数。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10,SELECT_BY_POS)==true)Print("定单10 "佣金,OrderCommission());elsePrint("OrderSelect 失败错误代码是",GetLastError());bool OrderDelete( int ticket, void Color)删除先前打开挂单。
如果函数成功,返回的值是真实的。
如果函数失败,返回的值是假的。
获得详细错误信息,请查看GetLastError()函数。
参量:ticket - 定单编号。
Color - 图表中标记颜色。
如果参量丢失,CLR_NONE值将不会在图表中画出。
示例:if(Ask>var1){OrderDelete(order_ticket);return(0);}datetime OrderExpiration( )返回挂单的有效日期。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10, SELECT_BY_TICKET)==true)Print("定单 #10 有效日期为",OrderExpiration());elsePrint("OrderSelect 返回的",GetLastError()错误);double OrderLots( )返回选定定单的手数。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10,SELECT_BY_POS)==true)Print("定单 10 "手数,OrderLots());elsePrint("OrderSelect 返回的 ",GetLastError()错误);int OrderMagicNumber( )返回选定订单的指定编号注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10,SELECT_BY_POS)==true)Print("定单 10 "指定编号, OrderMagicNumber());elsePrint("OrderSelect 返回的 ",GetLastError()错误);bool OrderModify( int ticket, double price, double stoploss, double takeprofit, datetime expiration, void arrow_color)对于先前的开仓或挂单进行特性修改。
如果函数成功,返回的值为 TRUE。
如果函数失败,返回的值为FALSE。
获得详细的错误信息,查看 GetLastError()函数。
注解: 开价格和有效时间的改变只对挂单而言。
如果未改变的值作为函数参量通过,将会生成错误 1 (ERR_NO_RESULT)。
在一些服务器中挂单的有效时间会被隐藏。
这种情况下,当一个非零值在有效参量被指定时,将生成错误 147 (ERR_TRADE_EXPIRATION_DENIED)。
参量:ticket - 定单编号。
price - 收盘价格stoploss - 新止损水平。
takeprofit - 新赢利水平。
expiration - 挂单有效时间。
arrow_color - 在图表中允许对止损/赢利颜色进行修改。
如果参量丢失或存在CLR_NONE 值,在图表中将不会显示。
示例:if(TrailingStop>0){OrderSelect(12345,SELECT_BY_TICKET);if(Bid-OrderOpenPrice()>Point*TrailingStop){if(OrderStopLoss()<Bid-Point*TrailingStop){OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);return(0);}}}double OrderOpenPrice( )对于当前选择定单返回开价格。
定单必须由OrderSelect() 函数首先选定。
示例:if(OrderSelect(10, SELECT_BY_POS)==true)Print("对于定单10 开价格",OrderOpenPrice());elsePrint("OrderSelect返回错误",GetLastError());datetime OrderOpenTime( )对于当前选择定单返回买入时间。
注解:定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10, SELECT_BY_POS)==true)Print("定单10 买入时间",OrderOpenTime());elsePrint("OrderSelect 返回的错误 ",GetLastError());void OrderPrint( )按照以下形式打印选择定单信息:定单编号; 买入时间; 交易业务;手数总数; 开盘价格; 止损; 赢利; 平仓时间; 收盘价格; 佣金; 掉期; 盈利; 注释; 指定编码; 挂单有效日期定单必须用OrderSelect()函数提前选定。
示例:if(OrderSelect(10, SELECT_BY_TICKET)==true)OrderPrint();elsePrint("OrderSelect 失败错误代码是",GetLastError());double OrderProfit( )对于选择定单返回净盈利值 (除掉期和佣金外)。
对于开仓位当前不真实盈利。