double MinLot; // минимальный лот по символуdouble MaxLot; // максимальный лот по символуdouble LotStep; // шаг лота по символуint dig; // знаковость лота узнали из функции CountSignedDigitsdouble NL(double lot)
{
if (lot<=MinLot) return(MinLot); // проверка на минимальныйdouble d=MathFloor((lot-MinLot)/StepLot); // сколько ЦЕЛЫХ шагов умещается в проверяемом лоте
lot=MinLot+StepLot*d; // рассчитали по этому целому числу
lot=MathMin(lot, MaxLot); lot=NormalizeDouble(lot, dig);// не забыли проверить на максимальный// нормализовалиreturn(lot); // вернули
}
voidOnStart() {
Print(CountSignedDigits(110.0));
Print(CountSignedDigits(11.0));
Print(CountSignedDigits(1.1));
Print(CountSignedDigits(0.11));
Print(CountSignedDigits(0.011));
Print(CountSignedDigits(0.0011));
Print(CountSignedDigits(0.00011));
}
int CountSignedDigits(double x) {
for (int i = 0; i < 1000; i++, x *= 10)
if (x - MathFloor(x) < DBL_MIN * 2)
return i;
return -1;
}
结果。
2011.07.0313:15:21 test (EURUSD,M5) 52011.07.0313:15:21 test (EURUSD,M5) 42011.07.0313:15:21 test (EURUSD,M5) 18 - Здесь только у меня бяка вылазиет?
2011.07.0313:15:21 test (EURUSD,M5) 22011.07.0313:15:21 test (EURUSD,M5) 12011.07.0313:15:21 test (EURUSD,M5) 02011.07.0313:15:21 test (EURUSD,M5) 0
下一个选项(CountSignedDigits函数是一样的)。
void OnStart() {
doublevalue = 110.0;
int count = 9;
while (count) {
Print(DoubleToString(value), " - ", CountSignedDigits(value));
value /= 10;
count--;
}
}
结果。
2011.07.0313:23:32 test (EURUSD,M5) 0.00000110 - 22 - Почему-то здесь бяка...
2011.07.0313:23:32 test (EURUSD,M5) 0.00001100 - 21 -
2011.07.0313:23:32 test (EURUSD,M5) 0.00011000 - 52011.07.0313:23:32 test (EURUSD,M5) 0.00110000 - 42011.07.0313:23:32 test (EURUSD,M5) 0.01100000 - 3 - Здесь уже все нормально. Почему результаты разные?!
2011.07.0313:23:32 test (EURUSD,M5) 0.11000000 - 22011.07.0313:23:32 test (EURUSD,M5) 1.10000000 - 12011.07.0313:23:32 test (EURUSD,M5) 11.00000000 - 02011.07.0313:23:32 test (EURUSD,M5) 110.00000000 - 0
有没有人有现成的代码来计算一个体积的 有效数字的数量?
类似于SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)的东西,但只针对体积。
例如,对于SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" 的情况 - 答案是 "0",代表 "0.1" - "1",代表 "0.01"- "2 "等。
让我澄清一个细微的差别。对于像 "0.1"、"0.01"、"0.001 "这样的体积步骤,我有。
该代码应该对以下情况起作用,如 "0.2"、"0.11"、0.023 "等。
没有专门针对体积 的代码。有什么都可以。
剧本是为了在预告片中检查。在拖车中检查的脚本。
你是说......,我想我应该在下订单之前检查一下允许的批次。
;)
我真的不知道他想要什么。我们看看他怎么说,我只是在练习我的心灵感应。;)
有没有人有现成的代码来计算一个体积的有效位数?
类似于SymbolInfoInteger(_Symbol, SYMBOL_DIGITS)的东西,但只针对体积。
例如,对于SymbolInfoDouble( _Symbol,SYMBOL_VOLUME_STEP) = "1.0" 的情况 - 答案是 "0",代表 "0.1" - "1",代表 "0.01"- "2 "等。
让我澄清一个细微的差别。对于像 "0.1"、"0.01"、"0.001 "这样的体积步骤,我有。
该代码应该对以下情况起作用,如 "0.2"、"0.11"、0.023 "等。
具体到体积,可以很简单。
sergeev
MetaDriver
Valmars
精心设计的问题是答案的一半。:)对不起,我已经去睡觉了,我没能准确描述任务。我将再次尝试。
我说的是将一个正常化的交易量 传递给一个交易订单。
这是我们对价格所做的事情。
价格正常化--我想大家都很清楚。
在我的时代(从MT4开始),我在MT文章中看到,最好也能将成交量正常化。
实施№2。实际上,我写了GetVolumeDigits(string Symbol)这个函数,以根据经纪人的条件找到可能的最小成交量值。至少有两种实现方式(结果是一样的)。
实施#1。
它们都能完美地适用于最小步长=1.0、0.1、0.01、0.001等的变体。也就是说,如果最小步长是1.0,该函数将返回0;如果步长是0.1,该函数将返回1,等等。
例如,如果最小台阶是1.1,或0.11,或0.011,怎么办?这种算法会错误地显示最小有效数字。
当然,你可以断言,在实践中没有这样的情况。我只想在我的专家顾问中考虑这样一种假设的可能性。我想,也许有人会分享他们在这个问题上的经验......。
这是关于将正常化的交易量 发送到交易单上。
我只是想在我们的专家顾问中考虑这种假设的可能性。
我们谈论的是哪种 "假设的 "工具?
1.MetaDriver 的变体适合你。CountSignedDigits 将显示任何批次中的字符数。
2.知道了数位 的数量,你就可以像这样进行归一化。
sergeev
谢谢你的地段验证功能。我正在使用类似的结构/分支支票。
我的问题集中在寻找地段中最年轻的地方,使其正常化。
特别是,MetaDriver 给出了他对 "一切 "的构建。:)然而,它并非没有缺陷(或者我的编译器有缺陷)。下面是代码和执行结果。
结果。
下一个选项(CountSignedDigits函数是一样的)。
结果。
在OnStart中修改了以下一行。
结果。
要么是我做错了(请纠正),要么是MetaDriver 在理论上犯了错误(设计 算法时)。
我的问题主要是确定地段中最低的地方,以使其正常化。
即使在向手数变量发送交易请求 时,它将得到垃圾(在小数点后第二位),它将被终端本身拒绝。
至少,在使用这种设计的几年中,我没有遇到任何问题。
如果你想再保险,你可以把它规范化到小数点后第8位(有储备金)--如果在 "正确 "的规范化后出现垃圾,它将会更远。