最后由 万元 于 2025-3-20 14:59 编辑
#property copyright "wang"
#property link "https://www.mql5.com"
#property version "1.00"
int OnInit()
{
//--- create timer
EventSetTimer(60);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
//开单函数的封装,必填参数,我们要思考在开单的时候需要什么参数,这时封装好参数传入 OrderSendAsync()方法
//两个开单函数 一个OrderSend() 在当前进程开单 , 一个OrderSendAsync()用异步的方式开单。
/* MqlTradeRequest mq= {};
MqlTradeResult re= {};
mq.action=TRADE_ACTION_DEAL;
mq.magic=123;
mq.symbol=Symbol();
mq.volume=0.01;
mq.type=ORDER_TYPE_BUY;
mq.price=SymbolInfoDouble(Symbol(),SYMBOL_ASK); // 持仓价格
mq.deviation=5; // 允许价格偏差
mq.type_filling=ORDER_FILLING_FOK;
//开单
bool b = OrderSendAsync(mq,re);
*/
/*
//交易函数
//Position系列 获取当前持仓数据
//返回持仓量
int toTal = PositionsTotal();
Print(toTal);
for(int i = 0 ; i<toTal;i++){
//获取当前持仓订单币种
string position_symbol = PositionGetSymbol(i);
//获取当前订单号
string position_ticket = (string)PositionGetTicket(i);
PositionGetDouble(POSITION_VOLUME);
//获取当前持仓的基本信息
Print("币种----->",position_symbol,"\n",
"订单号----->",position_ticket,"\n",
"方位成交量----->",(string)PositionGetDouble(POSITION_VOLUME),"\n",
"方位开盘价格----->",(string)PositionGetDouble(POSITION_PRICE_OPEN),"\n",
"开仓止损水平----->",(string)PositionGetDouble(POSITION_SL),"\n",
"开仓获利水平----->",(string)PositionGetDouble(POSITION_TP),"\n",
"开仓当前价位----->",(string)PositionGetDouble(POSITION_PRICE_CURRENT),"\n",
"积累交换----->",(string)PositionGetDouble(POSITION_SWAP),"\n",
"当前利润----->",(string)PositionGetDouble(POSITION_PROFIT),"\n",
"每个新持仓分配唯一的号码通常用于持仓的订单价格是匹配的----->",(string)PositionGetInteger(POSITION_TICKET),"\n",
"开盘时间位置----->",(string)PositionGetInteger(POSITION_TIME),"\n",
"以毫秒为单位计算01.01.1970以来持仓的时间----->",(string)PositionGetInteger(POSITION_TIME_MSC),"\n",
"以秒为单位计算01.01.1970以来持仓更改的时间----->",(string)PositionGetInteger(POSITION_TIME_UPDATE),"\n",
"以毫秒为单位计算01.01.1970以来持仓更改的时间----->",(string)PositionGetInteger(POSITION_TIME_UPDATE_MSC),"\n",
"位置类型----->",(string)PositionGetInteger(POSITION_TYPE),"\n",
"位置幻数----->",(string)PositionGetInteger(POSITION_MAGIC),"\n",
"位置标识符是独一的数字,对于每个新的开仓位来说是制定的且在整个使用期内是不可更改的,翻转位置不能改变它的标识符----->",(string)PositionGetInteger(POSITION_IDENTIFIER),"\n",
"持仓的原因----->",(string)PositionGetInteger(POSITION_REASON),"\n"
);
}
*/
/*
//orders系类 获取当前挂单数据
//获取当前挂单数量
int o_total = OrdersTotal();
//循环获取挂单属性
for(int i=0;i<o_total;i++)
{
Print(
"订单编号----->",(string)OrderGetTicket(i),"\n",
"订单最初交易量----->",OrderGetDouble(ORDER_VOLUME_INITIAL),"\n",
"订单当前交易量----->",OrderGetDouble(ORDER_VOLUME_CURRENT),"\n",
"订单中的规定价格----->",OrderGetDouble(ORDER_PRICE_OPEN),"\n",
"斩仓值----->",OrderGetDouble(ORDER_SL),"\n",
"盈利值----->",OrderGetDouble(ORDER_TP),"\n",
"交易品种订单的当前价格----->",OrderGetDouble(ORDER_PRICE_CURRENT),"\n",
"限制停止订单的限制价格订单----->",OrderGetDouble(ORDER_PRICE_STOPLIMIT),"\n",
"integer",
"每个订单分配唯一的号码----->",(string)OrderGetInteger(ORDER_TICKET),"\n",
"订单设置时间----->",(string)OrderGetInteger(ORDER_TIME_SETUP),"\n",
"订单类型----->",(string)OrderGetInteger(ORDER_TYPE),"\n"
"订单陈述----->",(string)OrderGetInteger(ORDER_STATE),"\n",
"订单终结时间----->",(string)OrderGetInteger(ORDER_TIME_EXPIRATION),"\n"
,
"订单执行或取消时间----->",(string)OrderGetInteger(ORDER_TIME_DONE),"\n",
"以毫秒为单位计算01.01.1970以来下订单执行的时间----->",(string)OrderGetInteger(ORDER_TIME_SETUP_MSC),"\n",
"以毫秒为单位计算01.01.1970以来订单执行/取消的时间----->",(string)OrderGetInteger(ORDER_TIME_DONE_MSC),"\n",
"订单填满类型----->",(string)OrderGetInteger(ORDER_TYPE_FILLING),"\n",
"订单使用期----->",(string)OrderGetInteger(ORDER_TYPE_TIME),"\n",
"EA交易的ID安置在订单之中(为确保每个EA交易安置都有独特的代码)----->",(string)OrderGetInteger(ORDER_MAGIC),"\n",
"下单的原因或源----->",(string)OrderGetInteger(ORDER_REASON),"\n",
"一旦执行,位置指标马上建立一个订单。每个执行订单结果都使订单公开或修改已经存在的位置,明确指出指标的位置同时执行订单----->",(string)OrderGetInteger(ORDER_POSITION_ID),"\n"
);
// ----->52272469671 //5 buy
// ----->52272376889 //2 sell
*/
/*
// 检索历史订单
datetime date_01 = TimeCurrent()-3600000;
datetime date_02 = TimeCurrent();
//订单号是唯一的,成交号是多个
//一个订单号 可以对应多个成交号
// 将数据读入到内存当中
HistorySelect(date_01,date_02);
//获取历史订单总数
int toTal = HistoryOrdersTotal();
Print(toTal);
for(int i=0;i<toTal;i++)
{
ulong his_string = HistoryOrderGetTicket(i);
Print(
"订单编号----->",his_string,"\n",
"订单最初交易量----->",HistoryOrderGetDouble(his_string,ORDER_VOLUME_INITIAL),"\n",
"订单当前交易量----->",HistoryOrderGetDouble(his_string,ORDER_VOLUME_CURRENT),"\n",
"订单中的规定价格----->",HistoryOrderGetDouble(his_string,ORDER_PRICE_OPEN),"\n",
"斩仓值----->",HistoryOrderGetDouble(his_string,ORDER_SL),"\n",
"盈利值----->",HistoryOrderGetDouble(his_string,ORDER_TP),"\n",
"交易品种订单的当前价格----->",HistoryOrderGetDouble(his_string,ORDER_PRICE_CURRENT),"\n",
"限制停止订单的限制价格订单----->",HistoryOrderGetDouble(his_string,ORDER_PRICE_STOPLIMIT),"\n",
"integer","\n",
"每个订单分配唯一的号码----->",(string)HistoryOrderGetInteger(his_string,ORDER_TICKET),"\n",
"订单设置时间----->",(string)HistoryOrderGetInteger(his_string,ORDER_TIME_SETUP),"\n",
"订单类型----->",(string)HistoryOrderGetInteger(his_string,ORDER_TYPE),"\n",
"订单陈述----->",(string)HistoryOrderGetInteger(his_string,ORDER_STATE),"\n"
"订单终结时间----->",(string)HistoryOrderGetInteger(his_string,ORDER_TIME_EXPIRATION),"\n",
"订单执行或取消时间----->",(string)HistoryOrderGetInteger(his_string,ORDER_TIME_DONE),"\n",
"以毫秒为单位计算01.01.1970以来下订单执行的时间----->",(string)HistoryOrderGetInteger(his_string,ORDER_TIME_SETUP_MSC),"\n",
"以毫秒为单位计算01.01.1970以来订单执行/取消的时间----->"(string)HistoryOrderGetInteger(his_string,ORDER_TIME_DONE_MSC),"\n",
"订单填满类型----->",(string)HistoryOrderGetInteger(his_string,ORDER_TYPE_FILLING),"\n",
"订单使用期----->",(string)HistoryOrderGetInteger(his_string,ORDER_TYPE_TIME),"\n",
"EA交易的ID安置在订单之中(为确保每个EA交易安置都有独特的代码)----->",(string)HistoryOrderGetInteger(his_string,ORDER_MAGIC),"\n",
"下单的原因或源----->",(string)HistoryOrderGetInteger(his_string,ORDER_REASON),"\n"
);
}
*/
// HistoryDealSelect();
// 检索历史订单
datetime date_01 = TimeCurrent()-60;
datetime date_02 = TimeCurrent();
//订单号是唯一的,成交号是多个
//一个订单号 可以对应多个成交号
// 将数据读入到内存当中
HistorySelect(date_01,date_02);
int his_deal_total = HistoryDealsTotal();
//获取历史订单总数
int toTal_his_01 = HistoryOrdersTotal();
int toTal_posi_01 = PositionsTotal()
int tolal_order_01 = OrdersTotal();
Print("历史成交订单数(不包含取消的挂单):---->",his_deal_total,"\n", //买入算一笔 in ,卖出算一笔 out、
"历史订单数(包含取消未执行的挂单)---->"toTal_his_01,"\n",
"持仓订单数---->",toTal_posi_01,"\n"
"当前挂单数---->",tolal_order_01,"\n"
);
for(int i = 0; i < his_deal_total; i ++)
{
//Position 持仓订单
//orders 挂单
}
}
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
void OnTimer()
{
}
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
}
=================================================================
规律的总结:
//首先需探索到那个函数是充当select查询函数。讲数据封装到内存的函数。
//函数一般形参无需传入标识变量,甚至只需要下标即可。 PositionsTotal() OrdersTotal()
//调用完成后,内存当中已经填充了对应数据,这时我们在调用传入数值函数可以正常的获取数据。
//重点在于找到拉取服务器数据的函数。 若没找到则后续访问基本都无效。
//根据类名要做到见名知意, double 基本上就是数字类信息的封装 string 类基本上是类型 品种这类 integer也就是时间类数字类函数 不会涉及金额类的东西,
//因为金额类的东西需要高精度的 double来存放
//定义的架构常量都是公用的且可复用---> 标准常量,列举和架构--->交易常数 可以看到
//交易类
//Position 持仓订单
//orders 挂单
//HistoryDealsTotal 历史成交单
//HistoryOrderSelect 所有订单 带正在执行的订单 |