欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

X 到时间、Y 到价格的函数,反之亦然 - MetaTrader 5 的脚本

author emer | 458 人阅读 | 0 人评论 |

标准 API 函数 ChartXYToTimePrice 和 ChartTimePriceToXY 有明显的缺点。例如,仅当输入参数为 ChartXYToTimePrice 时,ChartXYToTimePrice 才能正常工作X 和 Y 位于图表窗口的可见区域内,在窗口之外函数返回零。ChartTimePriceToXY 在某些情况下也无法正常工作。这两个功能都很慢。

我介绍了在所有输入参数范围内都能正常工作的函数:

整数从时间获取X(日期时间时间)
  {
  整数每条像素数 = (整数图表获取整数0,CHART_WIDTH_IN_PIXELS) / (整数图表获取整数0,CHART_WIDTH_IN_BARS) +1;
  双倍的每时间像素数 = (双倍的)pixels_per_bar /周期秒数();
  整数第一个栏 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
  日期时间时间_第一_栏 =爱时象征(),时期()、first_bar);
  日期时间时间_0 =爱时象征(),时期(),0);
  如果(时间<=时间_0)
     {
      整数最近的栏 =iBarShift象征(),时期(), 时间);
      日期时间最近的时间栏 =爱时象征(),时期()、nearest_bar);
      日期时间time_remaining = 时间 - time_nearest_bar;
      剩余时间 -= (整数数学地板(剩余时间/周期秒数()) *周期秒数();
      返回(第一个栏 - 最近的栏) * 每个栏的像素数 + (整数数学轮(剩余时间 * 每时间像素数);
     }
  别的      返回第一个栏 * 每个栏的像素数 + (整数数学轮((时间 - time_0) *pixels_per_time);
  }//+------------------------------------------------------------------+
整数从价格获取Y(双倍的价格)
  {
  双倍的最高价格 =图表获取双精度0,CHART_PRICE_MAX);
  双倍的最低价格 =图表获取双精度0,CHART_PRICE_MIN);
  双倍的每价格像素 =图表获取整数0,CHART_HEIGHT_IN_PIXELS) / (最大价格 - 最小价格);
  返回整数数学轮((最大价格 - 价格) * 每价格像素);
  }//+------------------------------------------------------------------+
日期时间从X获取时间(整数x_距离)
  {
  整数第一个栏 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
  日期时间时间_第一_栏 =爱时象征(),时期()、first_bar);
  整数每条像素数 = (整数图表获取整数0,CHART_WIDTH_IN_PIXELS) / (整数图表获取整数0,CHART_WIDTH_IN_BARS) +1;
  双倍的每个像素的时间 = (双倍的周期秒数()/pixels_per_bar;
  日期时间剩余时间 = (整数)(((双倍的)x_dist / 每条像素数 - (整数)(x_dist / 每条像素数)) * 每条像素数 * 每像素时间);
  整数最近的栏 = 第一个栏 - (整数)(x_dist / 每条像素数);
  日期时间time_nearest_bar = {};
  如果(最近的栏 <0)
     {
      日期时间时间_0 =爱时象征(),时期(),0);
      日期时间delta_time_start = time_0 - time_first_bar;
      日期时间增量时间停止 = (0- 最近的_栏)*周期秒数();
      time_nearest_bar = time_first_bar + delta_time_start + delta_time_stop;
     }
  别的      最近的时间栏 =爱时象征(),时期()、nearest_bar);
  返回time_nearest_bar + time_remaining;
  }//+------------------------------------------------------------------+
双倍的从 Y 获取价格(整数y_距离)
  {
  双倍的每像素价格 = (图表获取双精度0,CHART_PRICE_MAX)--图表获取双精度0,CHART_PRICE_MIN)) /图表获取整数0,CHART_HEIGHT_IN_PIXELS);
  双倍的最高价格 =图表获取双精度0,CHART_PRICE_MAX);
  返回最大价格 - 每像素价格 * y_dist;
  }//+------------------------------------------------------------------+

演示函数工作正确性的脚本。其工作的本质就是将生成的X、Y坐标转换为时间和价格,然后再返回X和 Y。如果输入X 和 Y 坐标与输出的不同,这意味着函数有问题,脚本将打印差异。如果一切顺利,脚本在工作过程中不会打印任何内容,但在最后它会打印结果

空白 启动时()
  {
  整数Generation_total = {};
  整数偏差_总计 = {};
  单位时间开始脚本=获取刻度数();
  尽管(!已停止())
     {
      整数x_输入=16383-数学兰德();
      整数y_输入=16383-数学兰德();
      整数第一个栏_下载 =终端信息整数TERMINAL_MAXBARS)--1;
      日期时间time_first_bar_downloaded =爱时象征(),时期()、first_bar_downloaded);
      双倍的最高价格开始 =图表获取双精度0,CHART_PRICE_MAX);
      双倍的最低起始价格 =图表获取双精度0,CHART_PRICE_MIN);
      整数第一个栏开始 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
      整数图表比例开始 = (整数图表获取整数0,CHART_SCALE);
      整数x_0 = GetXFromTime(time_first_bar_downloaded);
      整数y_0 = GetYFromPrice(0);
      如果(x_输入 < x_0)
         x_输入 = x_0;
      如果(y_输入 > y_0)
         y_输入 = y_0;
      日期时间时间 = GetTimeFromX(x_input);
      双倍的价格 = GetPriceFromY(y_input);
      整数x_output = GetXFromTime(时间);
      整数y_output = GetYFromPrice(价格);
      双倍的价格_最大_停止=图表获取双精度0,CHART_PRICE_MAX);
      双倍的最低止损价格 =图表获取双精度0,CHART_PRICE_MIN);
      整数第一个栏停止 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
      整数图表比例停止 = (整数图表获取整数0,CHART_SCALE);
      如果(price_max_start ==price_max_stop &&price_min_start ==price_min_stop &&first_bar_start ==first_bar_stop &&chart_scale_start ==chart_scale_stop)//检查坐标从一个系统转移到另一个系统并返回时,图表的比例和位置不会改变        {
         ++代数总数;
        如果(x_输入!= x_输出 || y_输入!= y_输出)
           {
            ++偏差_总计;
            打印“!!!检测到偏差!!!”);
            打印“x_输入=”, x_输入,“y_输入=”,y_输入);
            打印“x_输出=”, x_输出,“y_输出=”,y_输出);
           }
        }
     }
  打印“测试结束了”, 偏差_总计,“偏差”);
  如果(偏差_总计 ==0)
      打印“一切都好”);
  打印“世代总数=”,代数_总计);
  整数代数率 = 代数总数 / ((双倍的)(获取刻度数() - time_start_script) /1000);
  打印“生成率=”, 代数率,“世代/秒”);
  }//+------------------------------------------------------------------+
整数从时间获取X(日期时间时间)
  {
  整数每条像素数 = (整数图表获取整数0,CHART_WIDTH_IN_PIXELS) / (整数图表获取整数0,CHART_WIDTH_IN_BARS) +1;
  双倍的每时间像素数 = (双倍的)pixels_per_bar /周期秒数();
  整数第一个栏 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
  日期时间时间_第一_栏 =爱时象征(),时期()、first_bar);
  日期时间时间_0 =爱时象征(),时期(),0);
  如果(时间<=时间_0)
     {
      整数最近的栏 =iBarShift象征(),时期(), 时间);
      日期时间最近的时间栏 =爱时象征(),时期()、nearest_bar);
      日期时间time_remaining = 时间 - time_nearest_bar;
      剩余时间 -= (整数数学地板(剩余时间/周期秒数()) *周期秒数();
      返回(第一个栏 - 最近的栏) * 每个栏的像素数 + (整数数学轮(剩余时间 * 每时间像素数);
     }
  别的      返回第一个栏 * 每个栏的像素数 + (整数数学轮((时间 - time_0) *pixels_per_time);
  }//+------------------------------------------------------------------+
整数从价格获取Y(双倍的价格)
  {
  双倍的最高价格 =图表获取双精度0,CHART_PRICE_MAX);
  双倍的最低价格 =图表获取双精度0,CHART_PRICE_MIN);
  双倍的每价格像素 =图表获取整数0,CHART_HEIGHT_IN_PIXELS) / (最大价格 - 最小价格);
  返回整数数学轮((最大价格 - 价格) * 每价格像素);
  }//+------------------------------------------------------------------+
日期时间从X获取时间(整数x_距离)
  {
  整数第一个栏 = (整数图表获取整数0,CHART_FIRST_VISIBLE_BAR);
  日期时间时间_第一_栏 =爱时象征(),时期()、first_bar);
  整数每条像素数 = (整数图表获取整数0,CHART_WIDTH_IN_PIXELS) / (整数图表获取整数0,CHART_WIDTH_IN_BARS) +1;
  双倍的每个像素的时间 = (双倍的周期秒数()/pixels_per_bar;
  日期时间剩余时间 = (整数)(((双倍的)x_dist / 每条像素数 - (整数)(x_dist / 每条像素数)) * 每条像素数 * 每像素时间);
  整数最近的栏 = 第一个栏 - (整数)(x_dist / 每条像素数);
  日期时间time_nearest_bar = {};
  如果(最近的栏 <0)
     {
      日期时间时间_0 =爱时象征(),时期(),0);
      日期时间delta_time_start = time_0 - time_first_bar;
      日期时间增量时间停止 = (0- 最近的_栏)*周期秒数();
      time_nearest_bar = time_first_bar + delta_time_start + delta_time_stop;
     }
  别的      最近的时间栏 =爱时象征(),时期()、nearest_bar);
  返回time_nearest_bar + time_remaining;
  }//+------------------------------------------------------------------+
双倍的从 Y 获取价格(整数y_距离)
  {
  双倍的每像素价格 = (图表获取双精度0,CHART_PRICE_MAX)--图表获取双精度0,CHART_PRICE_MIN)) /图表获取整数0,CHART_HEIGHT_IN_PIXELS);
  双倍的最高价格 =图表获取双精度0,CHART_PRICE_MAX);
  返回最大价格 - 每像素价格 * y_dist;
  }//+------------------------------------------------------------------+


在开发库的过程中编写的源代码,用于创建结合不同交易策略的多个实例的多货币 EA 交易。

该指标允许您估计价格达到最高或最低的概率。

DeltaFusion Lite 是 MT4 DeltaFusionPro 指标的简化版本。它计算并显示累积 Delta 和净 Delta,使交易者可以清楚地了解每根蜡烛内的买卖压力。通过分析买入价和卖出价之间的交易量分布,它有助于识别市场情绪变化、潜在逆转以及价格和交易量之间的各种类型的背离。

为顾问添加按钮的示例。在此示例中,已实现一个按钮来关闭所有工具的所有活动头寸。除了按钮事件处理功能之外,还实现了相对于交易品种名称的平仓方法以及计算相对于交易品种名称的持仓数量的方法。


附件下载

📎 check_coord_convertion.mq5 (11.17 KB)

Source: MQL5 #48325

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录