专家社区 - 页 3

 
小贴士<br / translate="no">
迅速看了一下(还没有做任何挖掘),发现了你所计算的 参考。
试试 "扔掉",把愚蠢的点。也许这就是问题所在(通过MarketInfo的点可能并不总是按照你想要的方式出来?)

它总是应该...
尽管你也可以尝试使其正常化 =)

而且这并不总是可以接受的--专家可能在几个货币对上进行交易,而且观点可能是不同的...
 
这个问题和第一个计算机芯片一样古老--
当然,这很可悲...但一定有办法绕过它,对吗?我希望雷纳特会说些什么......
 
if ( orderstoploss == 0.0 || (  orderstoploss < ( bid - TrailingStop * point ) ) )


假设orderstoploss=1.29211(小数点后5位) bid=1.29716(也是5位) TrailingStop=50 point=0.001 那么(bid - TrailingStop * point)=1.29216>1.29211 真,这需要




数字 突然变成5 也可以

if ( orderstoploss == 0.0 || (  orderstoploss < ( bid - TrailingStop * point ) ) )


可以用 ,不痛不痒地更换。

if ( orderstoploss < ( bid - TrailingStop * point )) )


我认为在追踪时没有必要检查是否有止损水平。实际上是这样的,我在纠正自己的错误。如果我们只在有利润的时候设置止损,如果没有,我们就愿意等待追加保证金。我没有发现其他东西。你的追踪止损在哪个货币对上运作不正确,是否有任何强烈的运动?



 
你好。
我把所有东西都转换为整数值,以便进行比较。我在任何可以的地方(在数组中)存储和使用给定的值。
使用给定的值(在数组、变量等中)。
即int类型的变量可以取值从-2147483648到2147483647。
这种维度相当适合于十字架。
相应地,1.2999和1.3000可以铸成12999和13000,然后它们可以安全地进行比较。
而不必担心任何周期性的错误。

我在这里勾画了一个例子 :)
int Normalize(double double_value, int digits) - приводит double в int  (1.2999 в 12999)
double Restore(int int_value, int digits) - приводит полученный ранее int в double (12999 в 1.2999)


这里

//+------------------------------------------------------------------+
//|                                                   ShiftPoint.mq4 |
//|                                                            Begun |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Blue
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   return(0);
}
//+------------------------------------------------------------------+
int Normalize(double double_value, int digits)
{
	return (NormalizeDouble(double_value,digits)*MathPow(10,digits));
}
double Restore(int int_value, int digits)
{
	return (NormalizeDouble((int_value/MathPow(10,digits)),digits));
}
//+------------------------------------------------------------------+
int start()
{
	double	Test_Value =  1.29999999;
	int	Test_int;
	double	Test_double;

	Test_int         = Normalize(Test_Value,Digits);
	Test_double   = Restore(Test_int,Digits);
	Print("-----------------------------");
	Print("Restored value    = ",DoubleToStr(Test_double,Digits));
	Print("Shift Point Value = ",Test_int);
	Print("Real Double Value = ",DoubleToStr(Test_Value,8));
}
//+------------------------------------------------------------------+



产出。
shiftpoint EURUSD,H1: Real Double Value = 1.29999999
shiftpoint EURUSD,H1: ShiftPoint Value = 13000
shiftpoint EURUSD,H1: 恢复值=1.3000

 
一般来说,将其替换为
if ( orderstoploss < ( bid - TrailingStop * point )) )



if ( TrailingStop < ( bid -orderstoploss)/ point  )


或者说。

 
感谢大家的参与!
Rosh 17.04.05 22:29 <br / translate="no"> 我不认为拖尾是必要的。
我不同意,尾随应该是明确的--如果打开,就意味着SL是暴露的。

你在哪个货币对上的跟踪没有正常工作,没有强劲的运动?
现在,专家在欧盟上运行 - 偶尔会出现错误...在整个一天中...我不认为是这样的...

一般来说,要替换掉它。
现在我试试,也许会有帮助;)我明天再告诉你......

开始 17.04.05 22:46
你好。
我把一切都变成整数,以便进行比较
嗨 =)这当然是一个选择...但我没想到会有这么多麻烦......我希望能听到开发者的意见,他们比我更清楚......
 
抱歉,没有参与讨论。

2dev:
这个问题和第一个计算机芯片一样古老:

你是对的--这是一个基本问题,比较浮点数是很危险的。
在重要的地方,总是通过Normalize()使数字达到一定的精度。

你用的是哪种算术的实现?

标准化的类型是double(8字节)。 顺便说一下,我们在

交易查询 中强制规范所有通过的价格,以避免错误。你可以发送止损请求为1.2932461,但它将被设置为1.2932。请检查这是否是试图在同一价格上重新设置止损的错误?

 
请检查这是否是试图在同一价格重新设置止损的错误?

3个人在看 =)) 雷纳特来了,只是用手指着错误 =)))
我现在会检查,当然,但很可能是这种情况。我还没有把 "bid - TrailingStop *point"规范化,而这一结构恰恰涉及到订单修改...
我们并不用心,先生们;)
 
在重要的地方,总是通过Normalize()使数字达到一定的精度。

你是指Begun建议的Normalize()吗?
 
В важных местах постоянно приводите числа к определенной точности через Normalize().

你是指Begun建议的Normalize()吗?

对不起,我是指标准的NormalizeDouble