#property strict/******************************************************************************/double getLot(double factor = 0.001) {
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
if (minLot > 0) { // Проверка значения от функции MetaQuotes на вменяемостьdouble maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
if (maxLot >= minLot) { // Проверка второго значения от функции MetaQuotes на вменяемостьdouble lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
if (lotStep > 0) { // Проверка третьего значения от функции MetaQuotes на вменяемостьdouble rawLot = AccountBalance() * factor; // Грубо вычисленное значение лота// В процессе "рихтования" грубо вычисленного значения лота подразумевается, что "округление" происходит всегда к меньшемуif (rawLot >= minLot && rawLot < maxLot + lotStep) { // Если грубо вычисленное значение "влезает" в диапазон разрешённых значений лотовint stepNum = int((rawLot - minLot) / lotStep); // Количество step'ов, которое надо "отступить вправо на числовой оси" от минимального значения лота (при преобразовании double -> int как раз и происходит нужный тип округления)return minLot + lotStep * stepNum; // Вычисляем значение лота в "разрядной сетке" разрешённых лотов.
}
}
}
}
return0; // Какие-то обстоятельства не позволили выдать значение в "разрядной сетке" разрешённых лотов; для индикации данного события выдаётся специальное значение 0.
}
/******************************************************************************/voidOnStart() {
Print("AccountBalance() = ", AccountBalance(), ", getLot() = ", getLot());
}
你写错了什么。
是的,这是一个错字,已经改正。还是原则错误?问题是,如果余额除以10而没有余数,那么这批货就被当作最初一批货与余额的1/10的乘积。不是吗?那么如何呢?
虽然瓦迪姆在这里写得比较简单,是的 )))
是的,这是一个错字,已经改正。还是原则错误?问题是,如果余额除以10而没有余数,那么这批货就被当作最初一批货与余额的1/10的乘积。不是吗?那你是怎么做的呢?
虽然瓦迪姆在这里写得比较轻松,但是,是))))
而MarketInfo()呢?
和mode_minlot, mode_maxlot, mode_lotstep?
你仍然需要进入地段价值的允许数位网格。
运行它,得到了与事实类似的东西。
没有错误,我想。
而MarketInfo()呢?
和mode_minlot, mode_maxlot, mode_lotstep?
你仍然需要进入地段价值的允许数字格。
运行它,得到了类似于真相的东西。
我似乎没有犯错。
谢谢,已经有人向我解释过了 :D
很明显,对我自己来说,我写的是所有的支票,因为它应该是,只是有一个大纲,如何把地段的平衡/10比例,但这个想法是不成功的......
但你有很多文字,它可以更简单。
而MarketInfo()呢?
和mode_minlot, mode_maxlot, mode_lotstep?
你仍然需要进入地段价值的允许数位网格。
我运行了它,得到了与事实类似的东西。
我似乎不可能弄错。
为什么当一个天生的程序员接手一项工作时,实现目标所需的一行就会变成半公里长的清单?
为什么当一个天生的程序员接手一项工作时,实现目标所需的一行代码就会变成半公里长的清单?
有些人的步数不是0.01,而是比如说0.03。那么如何呢?所有案件都需要检查,好在不需要太多的时间。
double Min_Lot=MarketInfo(Symbol(), MODE_MINLOT);
为什么当一个天生的程序员接手一项工作时,实现目标所需的一行代码就会变成半公里长的清单?
因为各种各样的狗屎在等待着你,而你必须保护自己。如果你不保护自己,就会有很低的质量,从长远来看,这可能会让你损失惨重。90%的努力都花在防御魔鬼上,只有10%花在解决问题上。在MT4和MQL4++的情况下,这个比例甚至更加不对称。
在阅读文档 时,狗屎开始了。
一切都是。有义务返回有关金融工具的信息,而不是其他。没有其他结果。我们获得有关该仪器的信息。
让我们来看看这个工具的地段参数是什么。
有趣的参数。我不知道为什么文档中没有描述这个函数在出错情况下的行为。我们将不得不使用我们在观察这个函数的行为时发现的未记录的特征。
所以,MarketInfo()函数可能对这些要求的参数返回0,而这些参数的值在本质上必须与0不同,这是一个没有记录的错误情况。代码必须检查在请求每个参数时是否发生错误。仅仅因为这个原因,代码中就提供了3个检查。
下一步。显然,计算出的地段面积可能不符合允许的地段面积范围。我们不检查一下吗?或者我们应该明确地对这种情况进行编程,然后在上层代码中对它的反应进行编程,而不是 "随着它发生"?一个例子是,当不是所有的东西都被编程,并按其本身发生的情况工作时,可能是另一个新发布的MT4,当某处移位,某处奇迹般地出现故障,某处完全停止工作时,它看起来像什么。也许这不是所期望的结果?
对代码进行了扩展和注释,以便可以看到思考过程和使用的计算模型。由于MetaQuotes设置的手数模型是以参数MINLOT、MAXLOT和LOTSTEP定义的 "价差订单值网格 "的形式实现的,因此用这些术语来计算手数的准确值会更合理。这就是为什么计算模型是用这些术语写的。
我没有看到任何 "半公里 "或其他东西。唯一的一点是,当函数被调用一次并将结果值存储在变量中时,代码是以实现最大性能的风格来执行的,而每次调用都是在再次检查后才执行,当发现返回的值不是错误指标,继续计算仍有意义时,才执行。一旦明确发生了错误,计算资源就不会再浪费在无用的调用上。
为了使代码更加紧凑,我们可以一次获得所有3个值,并在一个if中检查所有3个条件。但如果第一次调用出现错误,其他两次调用将是对计算资源的浪费。
请注意,在编程表达式时,使用了除以lotStep,我们特意注意它是在if下使用的,它只是检查lotStep的值是否与0不同,也就是说,除以0不可能发生。原则上,通过将所有变量声明为 "double "和 "int "以及 "const double "和 "const int",在进一步可能的代码修改中保护自己,仍然可以改进代码。特别是,如果在if的代码中,只是检查了lotStep变量的值是否与0不同,不小心在这个地方的一些新加入的代码中,错误地将0值赋给了这个变量,那么在表达式中就会出现进一步除以0的情况。 如果这个变量被声明为 "const double",那么我希望编译器会立即报告一个未经授权试图修改lotStep变量的行为,从而防止出现这种错误。
所以 "半公里 "是由于严重的客观条件,而不是某人的心血来潮。
这个分支叫什么?好吧,如果你要帮忙,就好好做,这样你才能真正学到东西。