#define DEVIATION 5 // 允许的价格偏差
#define VOLUME 1.0 // 订单交易量
#define EXPERT_MAGIC 123 // 幻数
#define DIRECTION ORDER_TYPE_BUY // 开启的仓位方向 (ORDER_TYPE_BUY 或 ORDER_TYPE_SELL)
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 声明并初始化请求,验证和结果结构
MqlTradeRequest request={};
MqlTradeCheckResult check ={};
MqlTradeResult result ={};
//--- 准备交易请求参数
PrepareRequest(_Symbol, DIRECTION, VOLUME, request);
//--- 检查交易请求的参数
ResetLastError();
bool res=OrderCheck(request, check);
if(!res)
{
PrintFormat("Trade request verification completed with error %d\nServer retcode: %u, comment: %s", GetLastError(), check.retcode, check.comment);
return;
}
//--- 交易请求检查成功 - 显示交易请求验证结构栏位的描述
Print("Trade request verification completed successfully");
MqlTradeCheckResultPrint(check, 14);
//--- 发送交易请求
if(!OrderSend(request, result))
Print("OrderSend error ", GetLastError()); // 如果无法发送请求, 显示错误代码
//--- 有关操作的信息
PrintFormat("Trade request result: retcode=%u, deal=%I64u, order=%I64u", result.retcode, result.deal, result.order);
/*
result with disabled auto trading in the client terminal:
Trade request verification completed with error 4752
Server retcode: 10027, comment: AutoTrading disabled by client
enable auto trading and check again on a closed market:
Experts automated trading is enabled
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 1104.79 USD
Margin free: 9674.71 USD
Margin level: 975.71 %
Comment: Done
OrderSend error 4756
Trade request result: retcode=10018, deal=0, order=0
check on the open market:
Trade request verification completed successfully
Retcode: 0
Balance: 10779.50 USD
Equity: 10779.50 USD
Profit: 0.00 USD
Margin: 110.46 USD
Margin free: 10669.04 USD
Margin level: 9758.74 %
Comment: Done
Trade request result: retcode=10009, deal=2777010968, order=2802818813
*/
}
//+------------------------------------------------------------------+
//| 准备用于交易请求的参数 |
//+------------------------------------------------------------------+
void PrepareRequest(const string symbol, const ENUM_ORDER_TYPE order_type, const double volume, MqlTradeRequest &request)
{
ENUM_ORDER_TYPE type=(DIRECTION !=ORDER_TYPE_BUY ? ORDER_TYPE_SELL : DIRECTION);
double price=(DIRECTION==ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) : SymbolInfoDouble(Symbol(), SYMBOL_BID));
//--- 请求参数
request.action = TRADE_ACTION_DEAL; // 交易操作类型
request.symbol = symbol; // 交易品种
request.volume = volume; // 交易量
request.type = type; // 订单类型
request.price = price; // 开单价格
request.deviation = DEVIATION; // 允许的价格偏差
request.magic = EXPERT_MAGIC; // 订单幻数
}
//+------------------------------------------------------------------+
//| 在日志中打印交易请求 |
//| 验证结果的栏位 |
//+------------------------------------------------------------------+
void MqlTradeCheckResultPrint(const MqlTradeCheckResult &check, const uint header_width=0)
{
//--- 取得账户货币和账户货币的小数点位数
string currency=AccountInfoString(ACCOUNT_CURRENCY);
int digits =(int)AccountInfoInteger(ACCOUNT_CURRENCY_DIGITS);
//--- 定义标题文字和标题栏位的宽度
//--- 如果传给函数的标题宽度为0, 则宽度为标题文字行的大小+1
string header="Retcode:";
uint w=(header_width==0 ? header.Length()+1 : header_width);
//--- 在日志中以指定的标题宽度显示返回代码
PrintFormat("%-*s%-u", w, header, check.retcode);
//--- 在日志中显示执行交易操作后的余额值
header="Balance:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.balance, currency);
//--- 在日志中显示执行交易后的净值数值
header="Equity:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.equity, currency);
//--- 在日志中显示执行了交易操作后的浮动利润值
header="Profit:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.profit, currency);
//--- 在日志中显示必要交易操作所需的保证金金额
header="Margin:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin, currency);
//--- 在日志中显示执行了一项交易操作后剩余的净值数值
header="Margin free:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.*f %s", w, header, digits, check.margin_free, currency);
//--- 在日志中显示在完成所请求的交易操作后的保证金水平
header="Margin level:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-.2f %%", w, header, check.margin_level);
//--- 在日志中显示相应代码的注释和错误描述
header="Comment:";
w=(header_width==0 ? header.Length()+1 : header_width);
PrintFormat("%-*s%-s", w, header, check.comment);
}
|