EA编程教程大全之交易函数
- 格式:doc
- 大小:46.50 KB
- 文档页数:15
MQL4实例ea教程__连拉3个阴柱或阳柱后做交易代码如下:int MAGIC=35207814;extern double lots=1;//+------------------------------------------------------------------+//| 下面定义start函数,函数会在价格每次波动的时候运行。
//+------------------------------------------------------------------+int start(){if(CalculateCurrentOrders(Symbol())==0) //当前帐户订单为0时,继续下面的代码,也就是说,如果已经成交了,即使出现信号也不会再次成交。
{double StopLoss;double TakeProft;if(Signal()==-1)//卖出信号出现{StopLoss=Open[3];//设定止损第三根k线的开盘价TakeProft=2*(Open[1]-Close[1]+Open[2]-Close[2]+Open[3]-Close[3])/Point;/ /设定止盈为前面三根k线总和的2倍if(OrderSend(Symbol(),OP_SELL,lots,Bid,3,StopLoss,Bid-TakeProft*Point,0, MAGIC,0,Blue)<0)//如果卖出失败Alert("auto sell is failed!---"+GetLastError());//弹窗报警并且显示失败代码else return(0);//交易成功就返回不执行下面的代码。
}if(Signal()==1)//买入信号出现{StopLoss=Open[3];//设定止损第三根k线的开盘价TakeProft=2*(Close[1]-Open[1]+Close[2]-Open[2]+Close[3]-Open[3])/Point;/ /设定止盈为前面三根k线总和的2倍if(OrderSend(Symbol(),OP_BUY,lots,Ask,3,StopLoss,Ask+TakeProft*Point,0,M AGIC,0,Red)<0)//如果买入失败Alert("auto buy is failed!---"+GetLastError());//弹窗报警并且显示失败代码else return(0);//交易成功就返回不执行下面的代码。
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)最后访问的服务器时间(在程序执行期间这个值不会改变) 。
任何可见货币对/时间周期的价格数据的一组函数。
iBarsiBarShiftiCloseiHighiHighestiLowiLowestiOpeniTimeiVolumeint iBars( string symbol, int timeframe)在指定的图表内返回柱的数量。
对于当前图表柱总量的信息在预定义的变量中命名为Bars。
参量:symbol - 需应用到计算指标的货币对数据NULL 意味当前货币对名称。
timeframe - 时间周期。
可以是时间周期列举的任意值。
0 意味着当前图表的时间周期。
示例:Print("在货币对'EUROUSD'带有PERIOD_H1 柱数",iBars("EUROUSD",PERIOD_H1)); int iBarShift( string symbol, int timeframe, datetime time, void exact)搜索柱开始的时间。
函数返回指定开始时间的柱。
如果柱的指定开始时间是省缺值,函数将返回-1或最近的柱exact。
参量:symbol - 需应用到计算指标的货币对数据NULL 意味当前货币对名称。
timeframe - 时间周期。
可以是时间周期列举的任意值。
0 意味着当前图表的时间周期。
time - 查找值(柱的开始时间)。
exact - 未发现柱的返回模式。
false - iBarShift 返回最近。
true - iBarShift 返回-1。
示例:datetime some_time=D'2004.03.21 12:00';int shift=iBarShift("EUROUSD",PERIOD_M1,some_time);Print("带有打开时间平移柱",TimeToStr(some_time)," 是",shift);double iClose( string symbol, int timeframe, int shift)对于带有时间周期和平移指定货币对的柱返回关闭值。
mt4 ea调用指标在MT4平台中,EA(智能交易系统)可以调用指标来进行交易策略的编写和实现。
要实现这一功能,需要了解MT4平台的相关操作和MQL4编程语言。
以下是MT4 EA调用指标的一般步骤:1. 首先,在MT4平台中安装并导入所需指标。
指标文件通常位于“MT4/indicators”文件夹中。
2. 在编写EA时,使用MQL4语言编写一个策略,该策略可以根据指标的信号来进行交易。
例如,如果你想要根据移动平均线交叉信号来进行交易,可以使用以下代码:```mql4input int FastMAPeriod = 5; // 快速移动平均线周期input int SlowMAPeriod = 10; // 慢速移动平均线周期input double TakeProfit = 10; // 止盈设置input double StopLoss = 5; // 止损设置int OnInit(){// 初始化指标FastMA := IndicatorBuilder(FastMAPeriod, 0, 0, 0, 0, 0);SlowMA := IndicatorBuilder(SlowMAPeriod, 0, 0, 0, 0, 0);// 检查指标是否已绘制if (FastMA.IsReady() && SlowMA.IsReady()){// 设置图表上的移动平均线Chart->Plot(FastMA.GetResult(), "FastMA", 0, 0, 0, 1);Chart->Plot(SlowMA.GetResult(), "SlowMA", 0, 0, 0, 1);}return(INIT_SUCCEEDED);}void OnTick(){// 获取指标数据FastMA_Data FastMA_Data = FastMA.GetData();SlowMA_Data SlowMA_Data = SlowMA.GetData();// 检查快速和慢速移动平均线的交叉情况if (FastMA_Data.PeriodCross(SlowMA_Data, 0, 0, 0, 0)){// 创建交易订单OrderSend(OrderType.BUY, 1000, Ask, TakeProfit, StopLoss, 0, 0, 0, 0, clrGreen);}}```3. 在编写完EA后,将其复制到MT4平台的“Experts”文件夹中。
EA智能交易程序编程(一)@ 测试数据次数过多,目录文件胖到走不到时,就减肥:目录:\tester\history和tester\logs里的文件全部删除@如果你下载的是ex4文件,就将它拷贝到experts\indicators目录下,然后重新运行MT4,就可以在导航栏的自定义指标项目下看到新的指标名称,后面的使用和其他指标一样。
如果你下载的是mq4文件,同样你也需要先拷贝的experts\indicators目录下,然后使用MetaEditor打开源文件,点击编写按钮。
这时会在目录下自动生成ex4文件,同时MT4导航栏自定义指标项目下会出现新指标,直接使用即可。
如果还有DLL文件,或者有.set,或者有.tpl等,DLL为库文件,复制到experts\libraries,.set为设置文件复制到experts\presets,.tpl为模板文件,复制到templates@OrdersTotal()函数,可以计算当前账户中一共还没有平仓的单子和挂单的个数@从历史订单选出最后一单int i =0;while (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) )i++;OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)现在就是最后一个平仓的!上面的使用条件是没有使用挂单,没有取消过挂单,因为历史中包含平仓的和取消的.如果历史中有取消的挂单,就麻烦多了,需要判断类型/时间/赢利来剔除取消的挂单,找到最后的平仓.@如何检测一张交易单是否已经被打止损或打止盈答9)OrderCloseTime()这个函数返回的是订单的收盘时间。
如果订单正在交易中而未平仓,此函数返回的是0,如果平仓,此值就会变成平仓当时的服务器时间,是一个很大的正整数。
//-----------------检测是否平仓-----------------+string IsClosed(int tik){OrderSelect(tik, SELECT_BY_TICKET);//--若为未平仓if(OrderCloseTime()<1)return("未平");//--若为买单被止盈if(OrderType()==OP_BUY){if(OrderClosePrice()>=OrderTakeProfit())return("已被止盈");}//--若为卖单被止盈if(OrderType()==OP_SELL){if(OrderClosePrice()<=OrderTakeProfit())return("已被止盈");}//--其它为被止损return("已被止损");}//------------------------------------------------+有的朋友可能会质疑,打止损或打止盈的订单,其OrderComment()会包含sl或tp字样,检测这个不是更方便吗?你要这样说我完全同意,不过上面的函数也完全可以实现功能,这个例子同时说明编程不是死的,我们可以用不同的方式完成同一件任务。
EA编程教程大全之账户函数账户函数是实现账户管理的关键组成部分,它可以对账户进行增删改查等操作。
本教程将介绍如何使用EA编程创建账户函数。
在EA编程中,可以使用MQL4或MQL5语言来编写账户函数。
下面以MQL5为例,介绍如何编写一个简单的账户函数来管理账户信息。
1.创建账户函数模板首先,我们需要创建一个账户函数的模板,它包含了基本的账户信息和操作函数。
可以创建一个新的MQL5脚本,然后在脚本中添加如下代码:```mql5struct Accountdouble balance;double equity;double margin;};void InitAccount(Account &account)account.balance = AccountInfoDouble(ACCOUNT_BALANCE);account.equity = AccountInfoDouble(ACCOUNT_EQUITY);account.margin = AccountInfoDouble(ACCOUNT_MARGIN);void UpdateAccount(Account &account)account.balance = AccountInfoDouble(ACCOUNT_BALANCE);account.equity = AccountInfoDouble(ACCOUNT_EQUITY);account.margin = AccountInfoDouble(ACCOUNT_MARGIN);void PrintAccountInfo(const Account &account)Print("Balance: ", account.balance);Print("Equity: ", account.equity);Print("Margin: ", account.margin);```在上述代码中,我们创建了一个`Account`结构体用于存储账户信息,并定义了`InitAccount`、`UpdateAccount`和`PrintAccountInfo`三个函数来初始化、更新和打印账户信息。
外汇黄金EA智能交易系统使用教程/operations/forex-contest/?a=ody模拟比赛,最高奖励700美金,每个月一期开户网址https:///cs/register/fix-cent/?a=ody所谓EA智能外汇全自动交易系统,就是将您自己或别人的外汇交易策略用特殊的编程语言(MQL)编写成一个电脑软件程序(Expert Advisor), 让电脑按照您事先设定好的条件自动地为您买卖与交易,当然赢亏结果取决于您的自动交易系统设计得好坏。
目前这是外汇交易界的最先进,最具革命性的变革,纽约华尔街上的许多大公司的外汇交易员并不是把主要精力与时间放在人工盯盘与手动操作上,而是放在不断编写与完善自己的交易策略,然后编成自动交易系统让电脑去自动执行。
运用自动交易系统代替人工交易,具有以下几项显著的优点:1.由于智能交易系统综合了众多外汇交易高手的智慧和经验,等于是站在了巨人的肩膀上,其交易的策略选择与行情判断,仓位控制与交易纪律,风险控制和赢利能力都会毫无疑问地大大高于人工的手动操作。
2.由于是电脑自动下单,可以保证更快的下单,平仓速度,可以更敏感地响应价格变动和趋势变动。
3.电脑可以克服人性中的弱点,该买则买,该卖则卖,无犹豫,无贪心,赢则不狂妄,亏也不沮丧,避免了情绪化操作。
4.电脑可以每天24小时不间断地监控行情,并在适当的时机和点位自动进出场,完全不用人工的干预,可以让您夜晚安枕入眠,白天安心从事别的工作。
5.最后也是最重要的,就是赢利的保障。
能赚钱才是硬道理,智能外汇全自动交易系统虽不敢保证百战百胜,但由于融合了众多外汇高手的智慧与经验,加上严格的止损和风险控制,仓位控制,所以绝无过量交易,绝无情绪化交易,绝无人工操盘中无法避免的贪婪与恐惧。
赢利的与否和多少,完全取决于自动交易系统的设计思路与编写水平。
智能交易的历史和现状:程式化交易,即智能交易,起源于美国1975年出现的“股票组合转让与交易”,随着技术的发展和计算机系统的应用,投资经理、经纪人可以实现股票组合的一次性买卖交易;80年代,程式化交易发展很快,交易量急剧增加,因为软件使用的类同和止损功能的引入,加剧了市场的方向效应;进入90年代,出现了把程式化交易作为竞争手段的经纪公司,投资组合的方式丰富多彩。
AccountBalanceAccountCreditAccountCompanyAccountCurrencyAccountEquityAccountFreeMargin AccountFreeMarginCheck AccountFreeMarginMode AccountLeverageAccountMarginAccountNameAccountNumberAccountProfitAccountServerAccountStopoutLevel AccountStopoutModedouble AccountBalance( )返回账户余额(账户中相当数量的价格值金钱) . 示例:Print("账户余额= ",AccountBalance());double AccountCredit( )返回账户信用点数.示例:Print("账户点数", AccountCredit());string AccountCompany( )返回账户公司名。
示例:Print("账户公司名", AccountCompany());string AccountCurrency( )返回账户所用的通货名称。
示例:Print("账户货币对", AccountCurrency());double AccountEquity( )对于当前账户返回资产净值。
资产净值取决于交易服务器的设置。
示例:Print("账户净值= ",AccountEquity());double AccountFreeMargin( )返回当前帐户的免费保证金价格值。
示例:Print("账户免费保证金= ",AccountFreeMargin());double AccountFreeMarginCheck( string symbol, int cmd, double volume)当前账户的当前价格上在指定开仓的仓位返回自由保证金。
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,OrderTakePro fit(),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( )对于选择定单返回净盈利值(除掉期和佣金外)。
对于开仓位当前不真实盈利。
对于平仓为固定盈利。
对于当前选择定单返回盈利。