设为首页 收藏本站 切换语言

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

| 发表于 2025-3-20 13:28:25 | 显示全部楼层 |复制链接
最后由 万元 于 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  所有订单 带正在执行的订单
举报

评论 使用道具

精彩评论1

hwf9898
D
| 发表于 2025-3-23 14:37:19 | 显示全部楼层
高手啊,会代码的都是高手
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)