找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
首页论坛EAHub 外汇论坛
查看: 31|回复: 0

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

[复制链接]

4万

主题

54

回帖

4万

积分

管理员

积分
45954
发表于 2026-8-27 19:15:00 | 显示全部楼层 |阅读模式
最后由 万元 于 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  所有订单 带正在执行的订单
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EAHub外汇论坛

GMT+8, 2026-10-9 18:13 , Processed in 0.106490 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表