万元 发表于 2025-3-20 13:28:25

MQL5基础学习(三)交易类 || 交易常数的理解

最后由 万元 于 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所有订单 带正在执行的订单


hwf9898 发表于 2025-3-23 14:37:19

高手啊,会代码的都是高手

PTfish1984 发表于 2025-7-27 22:52:16

谢谢楼主无私分享

cnc0769 发表于 2026-4-4 15:58:12

谢谢楼主无私分享!

marco699 发表于 2026-4-16 01:16:44

代码高手,谢谢分享
页: [1]
查看完整版本: MQL5基础学习(三)交易类 || 交易常数的理解