任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 640

 

同志们好!

MT5有这样奇妙和非常有用的工具 "脉冲艾略特波"和 "纠正艾略特波"。

问题是:我可以将这些工具从MT5整合到MT4吗?

我在MT4上交易,转到MT5上进行分析不是很方便。

或者:有什么其他方法可以解决这个问题?

[删除]  
下午好,该语言有这样一个市场参数:MarketInfo(Symbol(),MODE_TICKVALUE)。你能概括地描述一下这个数值是如何计算的吗?
 
mql_writer:
下午好,该语言有这样一个市场参数:MarketInfo(Symbol(),MODE_TICKVALUE)。你能大致描述一下这个数值是如何计算的吗?

这是在1.00手时存款货币的最小价格变化(1点)的价值!计算非常简单:1.00(手)/1.36030(欧元的当前报价)=0.7351欧元。
 
borilunad:

这是在1.00手时存款货币的最小价格变化(1点)的价值!计算非常简单:1.00(手)/1.36030(欧元的当前报价)=0.7351欧元。

除了通过marketinfo的请求以某种方式返回所有货币对的10,除了日元对))))。


你从哪里得到这个公式的?

 
evillive:

除了通过marketinfo查询,除了日元对,所有货币对都以某种方式返回10 ))))


你从哪里得到这个公式的?


我自己做所有的公式,现在我把它从我的图表中拿出来。

而这个是来自Doki。

mode_tickvalue。

16

符号价格 在存款货币中的最小变化 大小

计算结果不共享。

 
borilunad:


我自己做了所有的公式,现在已经从我的图表中获得了这些公式。

而这是来自码头的。

MODE_TICKVALUE

16

存款货币的最小工具价格变化的大小

计算结果不共享。


虽然对于1欧元的手来说,1个点真的要花10美元,所以它是可以的。

而且计算结果不应该只与那些羞于展示的人分享。

是的,在这种情况下,公式应该是正确的 -MODE_TICKVALUE = MODE_LOTSIZE * MODE_TICKSIZE - 对于欧元, 十字星和日元的公式有点不同。

[删除]  
Top2n:


说实话,我还没有想出如何应用它。还有一毫米的距离,在快完成的时候停下来是很可惜的。

任务,如果对象时间(第二参数+3600秒>当前)||(第一参数时间-第二参数时间)<3600秒,则不将价格写入数组。)

为什么要模拟一个错误?

错误是它的信号,由于与系统限制/故障有关的某些原因,算法未能执行并获得具有某些(自然是有限的,但-)保证的结果。FillAndPrint()函数只是雄辩地显示了错误情况的含义和不含义。当一个错误发生时,它甚至不尝试打印结果。如果没有错误,结果就可以信任。这就是 "出错/不出错 "的逻辑应该如何建立。

但这里我们需要修改算法:我们还需要应用一个额外的过滤器。

所以必须这样做。

/******************************************************************************/
bool AddValueIfFiltered(double &array[], const string name) {
#define MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 3600
#define MAX_SECS_AFTER_PRICE2              3600

  const datetime dt1 = (datetime)ObjectGet(name, OBJPROP_TIME1);
  const datetime dt2 = (datetime)ObjectGet(name, OBJPROP_TIME2);
  const datetime dt = TimeCurrent();

  Print("name = ", name, ", dt = ", dt, ", dt1 = ", dt1, ", dt2 = ", dt2);

  if (dt <= dt2 + MAX_SECS_AFTER_PRICE2 && dt1 + MIN_SECS_BETWEEN_PRICE1_AND_PRICE2 <= dt2) { // Фильтруем, прежде чем попытаться добавить
    if (!AddValue(array, ObjectGetValueByShift(name, 1))) { // Пытаемся добавить
      return false; // Ошибка, значение не добавлено
    }
  }

  return true; // Нет ошибки, значение, если удовлетворило условию фильтра, добавлено к массиву
}

/******************************************************************************/
bool AddValueIfFound(double &array[], const string name) {
  const int type = ObjectType(name);

  if (type == OBJ_TREND) {
    switch ((color)ObjectGet(name, OBJPROP_COLOR)) { // Тип color допустимо использовать в switch
    case Goldenrod:
    case Gainsboro:
    case White:
      if (!AddValueIfFiltered(array, name)) { // Пропускаем через фильтр
        return false;
      }
    }
  }

  return true; // Нет ошибки, значение, если найдено, добавлено к массиву
}

首先,我们通过对象类型和参数进行 "过滤",从所有可用的对象中只选择我们需要的对象,然后我们再应用一个额外的过滤器。这大致是一个人的做法。这就是一个人要做的事,对吗?

对于这些小的子任务,我们需要一个单独的函数。

数字不应该出现在表达式中,除非在非常特殊的情况下,例如,如果有必要进行翻倍,而这种翻倍是在算法的本质上。那么数字2就可以直接在表达式中使用。而在其他这种非常罕见的情况下。

在其他情况下,应使用助记符。首先,它们极大地提高了人们对某一地点发生的事情的理解,因此有助于减少犯错的概率。其次,数值本身设置在一个地方,必要时很容易改变,与在算法中反复使用数字的情况相比,不使用助记符就要在算法的几个地方纠正数字,就不可能出错。

运行的结果。

02:08:46 Script 2 EURUSDm,H1: loaded successfully
02:08:46 2 EURUSDm,H1: initialized
02:08:46 2 EURUSDm,H1: Sell:
02:08:46 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:02, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: Buy:
02:08:46 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:02, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:08:46 2 EURUSDm,H1: Найдено объектов: 0
02:08:46 2 EURUSDm,H1: uninit reason 0
02:08:46 Script 2 EURUSDm,H1: removed

没有发现任何一个物体。将两个助记符的值增加10倍,达到36000(10小时),然后再运行。

02:09:03 Script 2 EURUSDm,H1: loaded successfully
02:09:03 2 EURUSDm,H1: initialized
02:09:03 2 EURUSDm,H1: Sell:
02:09:03 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:14, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 0
02:09:03 2 EURUSDm,H1: Buy:
02:09:03 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:14, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:03 2 EURUSDm,H1: Найдено объектов: 1
02:09:03 2 EURUSDm,H1: Price[0] = 1.35869
02:09:03 2 EURUSDm,H1: uninit reason 0
02:09:03 Script 2 EURUSDm,H1: removed

一个趋势已经 "通过 "了过滤。我们现在将第一个助记符的值恢复到3600,并运行它。

02:09:12 Script 2 EURUSDm,H1: loaded successfully
02:09:12 2 EURUSDm,H1: initialized
02:09:12 2 EURUSDm,H1: Sell:
02:09:12 2 EURUSDm,H1: name = downtrendline1, dt = 2014.06.24 22:09:26, dt1 = 2014.06.24 10:00:00, dt2 = 2014.06.24 17:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.36152
02:09:12 2 EURUSDm,H1: Buy:
02:09:12 2 EURUSDm,H1: name = uptrendline0, dt = 2014.06.24 22:09:26, dt1 = 2014.06.23 09:00:00, dt2 = 2014.06.24 16:00:00
02:09:12 2 EURUSDm,H1: Найдено объектов: 1
02:09:12 2 EURUSDm,H1: Price[0] = 1.35869
02:09:12 2 EURUSDm,H1: uninit reason 0
02:09:12 Script 2 EURUSDm,H1: removed

我们可以看到,现在两条趋势线都已经 "通过 "过滤。顺便说一下,我建议以这种方式调试程序的所有分支(部分),而不仅仅是一个分支。

为了帮助你在某种程度上将其正式化,我将尝试以这种方式解释。一个方案显然像一个计划。

计划中的每个主要项目都可以分解为较小的子计划项目。小的变成更小的。最小的子计划的点被直接执行。

每个计划、子计划,甚至最小的子计划的点都对应着方案中的功能。最小的子计划中的项目对应于只调用系统函数的 "结束 "函数,甚至根本不调用这些函数,例如,AddValue()或DiffInSecs()就是上面讨论的例子。上面的子计划项目对应于调用实现下面子计划项目的函数。在上面讨论的中,这些是MassTrendNumber(), AddValueIfFound(), AddValueIfFiltered()。"低级 "函数不应调用 "高级 "函数,而 "高级 "函数基本上不应向下跳几级,即只应调用基本上在下面一级的函数。这一规则对 "低级 "比对 "高级 "要严格得多。

试着把你的程序组织成由这种树状结构连接的(短)函数,在谁调用谁的意义上建立你的程序。

这个程序有一棵退化的树:一个分支会 "分支 "好几次。而且它的 "分支 "不是两个小分支,而是一个。但可以看到 "高级 "函数持续调用 "低级 "函数这一点。在这次修改中,我在这个结构中又插入了一个层次,即另一个 "非分支分支"--AddValueIfFiltered()。

 
对不起,我没有直接看到这个主题。
https://www.mql5.com/ru/forum/152102 一个问题
 
borilunad:

一切都是正确的!对于4位数的报价,它总是1,而对于5位数的报价,它现在是10,因为有10倍的点(而且更浅)而最小刻度线的值应该从当前价格计算出来

我现在有4位数,在Ewardollar上,1手1个点要10美元,一直都是这样。对于十字架,费用将从8到16,公式在那里有点复杂。

例如,对于欧元英镑,marketinfo已经返回16.984,英镑-美元汇率=1.6984,也就是说,1个点的欧元英镑价值1英镑,乘以英镑-美元的点值,总是10.0(100000*0.0001=10.0或100000*0.00010=10.0--随你喜欢)。


只有当你的账户是美元时,所有这些计算才是正确的。

在这种情况下,对于xUSD(EURUSD,GBPUSD等),tickvalue = lot*point = 100000*0.0001 = 10.0

对于USDx (USDCHF, USDJPY等) tickvalue = lot*point/Bid = 100000*0.01/101.93 = 9.8107

对于xUSD/yUSD (EURGBP) tickvalue = Bid(yUSD)*lot*point = 1.6980*100000*0.0001 = 16.98

对于交叉盘xUSD/USDy (EURJPY) tickvalue = lot*point/Bid(USDy) = 100000*0.01/101.91=9.8126

 
evillive:

我现在有4位数,在Ewardollar上,1手1个点要10美元,一直都是这样。对于十字架,费用将从8到16,公式在那里有点复杂。

例如,对于欧元英镑,marketinfo返回了16.984,evodollar的汇率=1.3604,英镑-美元的汇率=1.6984,也就是说,欧元英镑的1点值1英镑,乘以英镑-美元的点值,总是10.0(100000*0.0001=10.0或100000*0.00010=10.0--随人喜欢)。




我的是简单而实用的!而在有4位数报价的时候,我还没有写程序,所以我无法判断。:)

晚安!