手机版

MQL4交易处理函数(二)

阅读 :
外_汇_邦 WaiHuiBang.com

从自定义指标中不能调用OrderSend()、OrderClose()、OrderCloseBy()、OrderDelete()和OrderModify()交易函数。

本组交易函数应用于智能交易和脚本中。只有智能交易设置中的“允许实时交易”属性被选中,才能调用交易函数。

为了在智能交易和脚本中进行交易,在程序交易环境(智能交易和脚本的自动交易的环境)中,只能为它提供一个线程。这就是为什么,如果这个交易环境被一个智能交易操作占用,因此会出现146错误(ERR_TRADE_CONTEXT_BUSY),其他智能交易或脚本在此时就不能调用成功。为了能确定是否有交易在进行,可使用 IsTradeAllowed() 函数检测。为了清除交易环境下访问共享,我们能够使用个基于全局变量的交易信号,其值可以使用 GlobalVariableSetOnCondition() 函数改变。

MQL4交易函数常见错误代码及处理意见

  • OrderSelect() – 选择订单
  • OrderClose() – 平仓
  • OrderCloseBy() – 相反头寸平仓
  • OrderClosePrice() – 获取订单平仓价格
  • OrderCloseTime() – 获取订单平仓时间
  • OrderComment() – 获取订单注释
  • OrderCommission() – 获取订单佣金数额
  • OrderDelete() – 删除挂单
  • OrderExpiration() – 获取挂单有效时间
  • OrderLots() – 获取订单交易手数
  • OrderMagicNumber() – 获取订单魔术编号
  • OrderModify() – 修改订单
  • OrderOpenPrice() – 获取订单开仓价格
  • OrderOpenTime() – 获取订单开仓时间
  • OrderPrint() – 打印订单信息
  • OrderProfit() – 获取订单盈利金额
  • OrderSend() – 发出订单
  • OrdersHistoryTotal() – 获取历史订单总数
  • OrderStopLoss() – 获取订单止损值
  • OrdersTotal() – 获取订单总数
  • OrderSwap() – 获取订单掉期值
  • OrderSymbol() – 获取订单交易品种
  • OrderTakeProfit() – 获取订单止盈值
  • OrderTicket() – 获取订单的订单编号
  • OrderType() – 获取订单交易类型

 

OrderOpenPrice() – 获取订单开仓价格

double OrderOpenPrice()

返回当前订单的开仓价格。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(10, SELECT_BY_POS)==true)    Print("对于定单10的开仓价格",OrderOpenPrice());  else    Print("OrderSelect返回错误",GetLastError());

OrderOpenTime() – 获取订单开仓时间

datetime OrderOpenTime()

返回当前订单的开仓时间。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(10, SELECT_BY_POS)==true)    Print("定单10 开仓时间",OrderOpenTime());  else    Print("OrderSelect 返回的错误 ",GetLastError());

OrderPrint() – 打印订单信息

void OrderPrint()

按以下格式打印日志中当前定单信息:

定单编号; 买入时间; 交易业务; 手数总数; 开仓价格; 止损价格; 止盈价格; 平仓时间; 平仓价格; 佣金; 掉期; 盈利; 注释; 魔术编码; 挂单有效日期

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(10, SELECT_BY_TICKET)==true)    OrderPrint();  else   Print("OrderSelect 失败错误代码是",GetLastError());

OrderProfit() – 获取订单盈利金额

double OrderProfit()

返回当前订单的盈利金额(除掉期和佣金外)。对于开仓订单当前为浮动盈利。对于已平仓订单为固定盈利。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(10, SELECT_BY_POS)==true)    Print("定单 10 盈利",OrderProfit());  else    Print("OrderSelect返回的错误",GetLastError());

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)

主要功能用于开仓头寸和挂单交易。

如果成功,由交易服务器返回定单的定单编号,如果失败,返回-1。想要获得额外的错误信息,请调用 GetLastError() 函数。

注:市价定单开始交易时(OP_SELL或OP_BUY),只有最新卖价或买价可以当作开仓价来用。如果执行与当前货币对不同的交易,必须使用带有MODE_BID或MODE_ASK参数的Marketlnfo() 函数获得要买的货币对最新的报价。预测或是不标准的价格不可用。

如果在市场的报价中没有所要的开仓价或者没有按照小数点后位数的要求标准化,将会导致129错误(ERR_INVALID_PRICE)。如果要求的开仓价日期已经过期,将会导致138错误(ERR_REQUOTE)。如果请求的价格过期了,但是还处于市价里,就以现价或仍在price+-slippage(现价+-滑点)范围内现价开仓。

止损价和止盈价不能太靠近市价。最小的止损点数可以使用带MODE_STOPLEVEL参数的 MarketInfo() 函数得到。在出错或止损位设置不正确的情况下,将会导致130错误(ERR_INVALID_STOPS)。

在发出挂单时,开盘价也不能太靠近市价。挂单价和当前市价之间最小的点数可以使用带MODE_STOPLEVEL参数的 MarketInfo() 函数得到。在挂单开盘价错误的情况下,将会导致130错误(ERR_INVALID_STOPS)。

挂单交易的过期时间在一些交易服务器上被禁用。在这种情况下,如果expiration(过期)参数指定了非零值,反而会导致147错误(ERR_TRADE_EXPIRATION_DENIED)产生。

在某些交易服务器上,开仓单和挂单的总数有所限制。如果超出限额,就不能再开仓,或者不能再挂单了。如果还开仓或挂单,交易服务器会返回148错误(ERR_TRADE_TOO_MANY_ORDERS)。

参数:

symbol      - 交易货币对。 cmd         - 交易类型。可以是 交易类型列举 的任意值。 volume      - 交易手数。 price       - 交易价格。 slippage    - 最大允许滑点数。 stoploss    - 止损价格。 takeprofit  - 止盈价格。 comment     - 注释文本。注释的最后部分可以由服务器修改。 magic       - 订单魔术编号。可以作为用户指定识别码使用。 expiration  - 定单有效时间(只限挂单)。 arrow_color - 图表上箭头颜色。如果参数丢失或使用CLR_NONE价格值将不会在图表中画出。 

示例:

  int ticket;  if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25)    {     ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point,"My order #2",16384,0,Green);     if(ticket<0)       {        Print("OrderSend 失败错误 #",GetLastError());        return(0);       }    }

OrdersHistoryTotal() – 获取历史订单总数

int OrdersHistoryTotal()

返回载入到终端账户历史表中已平仓订单数。历史表的范围大小取决于终端”Accounthistory(账户历史)”标签中当前设置。

示例:

  // 来自交易历史的订单信息  int i,hstTotal=OrdersHistoryTotal();  for(i=0;i<hstTotal;i++)    {     //---- 检查选择结果     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)       {        Print("访问历史表失败,错误信息:",GetLastError());        break;       }     // 订单的一些工作

OrderStopLoss() – 获取订单止损值

double OrderStopLoss()

返回当前订单的止损值。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(ticket,SELECT_BY_POS)==true)    Print("对于10 止损值", OrderStopLoss());  else   Print("OrderSelect 失败错误代码是",GetLastError());

OrdersTotal() – 获取订单总数

int 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);

OrderSwap() – 获取订单掉期值

double OrderSwap()

返回当前订单的掉期值。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(order_id, SELECT_BY_TICKET)==true)    Print("对于定单 #", order_id, "掉期", OrderSwap());  else   Print("OrderSelect 失败错误代码是",GetLastError());

OrderSymbol() – 获取订单交易品种

string OrderSymbol()

返回当前订单的交易品种名称。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(12, SELECT_BY_POS)==true)    Print("定单 #", OrderTicket(), " 货币对是", OrderSymbol());  else   Print("OrderSelect 失败错误代码是",GetLastError());

OrderTakeProfit() – 获取订单止盈值

double OrderTakeProfit()

返回当前订单的止盈值。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(12, SELECT_BY_POS)==true)    Print("定单 #",OrderTicket()," 盈利: ", OrderTakeProfit());  else    Print("OrderSelect() 返回错误 - ",GetLastError());

OrderTicket() – 获取订单的订单编号

int OrderTicket()

返回当前订单的订单编号。

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  if(OrderSelect(12, SELECT_BY_POS)==true)    order=OrderTicket();  else   Print("OrderSelect 失败错误代码",GetLastError());

OrderType() – 获取订单交易类型

int OrderType()

返回当前订单的交易类型。可以是 交易类型列表 下的值

注:定单必须用 OrderSelect() 函数提前选定。

示例:

  int order_type;  if(OrderSelect(12, SELECT_BY_POS)==true)    {     order_type=OrderType();     // ...    }  else    Print("OrderSelect() 返回错误 - ",GetLastError());
外_汇_邦 WaiHuiBang.com
本文标题:MQL4交易处理函数(二) - MT4平台MQL4编程学习
本文地址:https://www.waihuibang.com/fxschool/autotrading/mql4/49024.html

相关文章

  • MT4编程初级手册(5):自定义数组

    一、数组是一组同类型变量的集合,可以以一个名称同时存储多个数值,由索引来调用,在实现我们EA的算法时是一个非常重要的工具。 例:int arrai[5]={5,4,3,2,1}; 这是一个数组名为arrai、包含了5个元素的整数型数组(即数...

    MQL4编程学习
  • 外汇自动交易系统堪比交易员

    “当时有个朋友把我研发的一个自动交易系统卖给一家基金公司,居然卖了25万美元,那家公司专门收购各种交易系统进行测试和二次开发,并根据其结果和系统的特性投入不同比例的资金操作,有点像‘基金的基金’(FOF)那种操作模式。”...

    MQL4编程学习
  • 与狼共舞 --- 使用网格EA获得盈利的基本原则!

    近来大部分的趋势EA,剥头皮EA表现很差的情况下,越来越多的赌 博、加仓EA浮出水面了,比如什么Forex Hacked, Forex envy, Grid me up &hellip;之类的,我们把这一类加仓或网格的EA定义为”高风险,危险性“EA。然而,如此危险的...

    MQL4编程学习
  • MQL4程序书写规则

    说实话,我不认为一个连书写都不规范的程序员是个好程序员。MQL4跟C语言规范一致,所以下文具备很高的参考价值。 从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时应遵循以下规则: 1.一个说明或一个语句占一行。 2....

    MQL4编程学习
  • MT4 MQL4学习 --- 自己编写EA总结篇

    MT4外汇交易平台里给我们提供了一套非常完美的交易系统设计语言-MQL4,通过MQL4语言可以设计出我们想要的赚钱模式,一套完美的智能交易系统(EA),让我们躺在睡觉一样能赚钱的程序,iMT4论坛为我们提供了一个能实现我们梦想的MT4专业平台,让你的梦想从这里起飞。...

    MQL4编程学习
你可能感兴趣