myeatrade

Posts Tagged ‘MQL4’

MQL4 Basics:Preprocessor

对不起,此内容只适用于English

MQL4 Basics:Variables

对不起,此内容只适用于English

MQL4 Basics:Functions

对不起,此内容只适用于English

MQL4 Basics:Operators

对不起,此内容只适用于English

MQL4 Basics:Operations & Expressions

对不起,此内容只适用于English

MQL4 Basics:Data types

对不起,此内容只适用于English

MQL4 Basics:Syntax

对不起,此内容只适用于English

MQL4 Summary

对不起,此内容只适用于English

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

任何交易相关操作(OrderSend(), OrderClose(), OrderCloseBy(), OrderDelete()OrderModify()函数)都会因为些原因导致失败,返回负的订单号或FALSE,我们通过调用GetLastError()函数能找出失败的原因。每一个错误必须以不同的方式加以处理,最常见的错误和处理建议如下:

常数 描述
ERR_NO_ERROR 0 交易成功。
ERR_NO_RESULT 1 OrderModify()试图用个同样的值替换原先已设定好的值。应该修改其中一个或多个值,再反复尝试修改。
ERR_COMMON_ERROR 2 常规错误。直到查清错误为止,所有交易必须停止运行。 如果需要客户端和交易系统必须重启。
ERR_INVALID_TRADE_参量 3 无效参量, 例如, 货币对错误,未知交易业务, 不存在订单号等等。程序逻辑必须修改。
ERR_SERVER_BUSY 4 交易服务器忙。稍后请重新尝试。
ERR_OLD_VERSION 5 客户端的旧版本。需要安装客户端的最新版本。
ERR_NO_CONNECTION 6 交易服务器没有连接。需要确认连接没有断开(例如,应用IsConnected函数) 过一段时间(5秒之后)重试。
ERR_TOO_FREQUENT_REQUESTS 8 交易请求过于频繁。过于频繁的交易请求必须减少,程序逻辑需要修改。
ERR_ACCOUNT_DISABLED 64 账户被禁用。所有运行交易必须停止。
ERR_INVALID_ACCOUNT 65 账号无效。所有运行交易必须停止。
ERR_TRADE_TIMEOUT 128 交易超时。在重试前(至少1分钟)必须确认交易业务确实没有成功(存在未修改或未删除的定单)
ERR_INVALID_PRICE 129 无效开价或报价格。稍后必须刷新数据,应用RefreshRates函数重试。 如果错误没有消失,尝试停止所有运行交易,修改程序逻辑。
ERR_INVALID_STOPS 130 止损止盈离现价太近或是价格计算错误。一般修改止损止盈距离。
ERR_INVALID_TRADE_VOLUME 131 无效交易量。 尝试停止所有运行交易,改变程序逻辑。
ERR_MARKET_CLOSED 132 市场关闭。稍后重新尝试。
ERR_TRADE_DISABLED 133 交易被禁止。所有运行交易必须停止。
ERR_NOT_ENOUGH_MONEY 134 资金不足无法交易。稍后用小额的资金重试,确定有足够的资金完成交易。
ERR_PRICE_CHANGED 135 价格已经改变,应用RefreshRates()函数重试。
ERR_OFF_QUOTES 136 没有报价没有报价。由于有多种原因,交易商不提供价格或拒绝提供价格(比方说,本场交易价格未启动,价格不确定,市场变化太快)。延时5秒后,有必要用RefreshRates函数更新数据,再重试。
ERR_REQUOTE 138 请求的报价已过时,或者买价和卖价混淆。延时5秒后,有必要使用RefreshRates()函数刷新数据再次重试。如果错误依然没有消失,尝试停止所有运行交易,修改程序。
ERR_ORDER_LOCKED 139 交易定单被锁住,正在处理中。尝试停止所有运行交易,修改程序逻辑。
ERR_LONG_POSITIONS_ONLY_ALLOWED 140 只允许买进。禁止卖出。
ERR_TOO_MANY_REQUESTS 141 请求过多。必须减少请求次数,程序逻辑需要修改。
  142 定单按次序排列。它不是一个错误,而是客户端和交易服务器之间一个代码。在交易执行期间,碰巧连接断开或重新连接时,这种代码的出现次数非常少。此代码和错误代码128一样处理。
  143 定单已经被执行交易商接受。它不是一个错误,而是客户端和交易服务器之间一个代码。它和代码142出现的原因一样,处理方法参照错误128。
  144 在手动确认期间,定单已经被客户放弃。它不是一个错误,而是客户端和交易服务器之间一个代码。
ERR_TRADE_MODIFY_DENIED 145 由于定单太接近市价或被锁定,修改被否定。延时15秒后,用RefreshRates函数更新数据再次重试。
ERR_TRADE_CONTEXT_BUSY 146 交易线程忙。只有在IsTradeContextBusy()函数返回FALSE后重试。
ERR_TRADE_EXPIRATION_DENIED 147 交易商否定挂单过期使用。如果期限为零,交易可以重试。
ERR_TRADE_TOO_MANY_ORDERS 148 开仓和挂单交易总数已经达到经纪商设定的限度。只有在现有仓位平单或挂单删除之后才可以新开仓或挂单。
ERR_TRADE_HEDGE_PROHIBITED 149 当对冲功能被关闭时,尝试开仓一个和现有仓位相反的订单。首先必须平掉现有仓位,停止所有此类交易操作或者修改程序逻辑。
ERR_TRADE_PROHIBITED_BY_FIFO 150 尝试关闭一个违反FIFO规则的订单。 首先平掉之前的仓位,停止所有此类交易操作或者修改程序逻辑。

MQL4交易处理函数(二)

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

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

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

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

 

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());
第 4 页,共 9 页« 最新...23456...最旧 »
menu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loader