自行车运营商 "为 "问题 - 页 4

 

西蒙。

好吧,让我试着把止损位也加入到EA中,只是为了更好地衡量。

啊哈!USDJPY的冻结水平 是0,止损水平是30。

我认为30代表3,因为经纪人是5位数。我试着使用MODE_SPREAD,得到了20。很明显,USDJPY的点差不是20,而是;)2.0.也可以说,2点相当于20点。

谢谢你。

 

给你的一条线索.. . .

 

西蒙。

这似乎又是一个选择订单的问题。

OrderClose()函数正试图关闭一个订单(不是USDJPY订单)。它正试图关闭欧元兑美元图表 上的订单。

OrderPrint()函数在执行前已经被选择了,显然与它的目的相似。

围着无效价格的红色一定是表示错误的。

环绕USDJPY的绿色一定表明是正确的。

因此,如果所有这些都是真的,我必须关注红色圆圈,并在执行OrderClose()函数前选择订单。

谢谢你。

 
WhooDoo22:


什么是买入和卖出?

卖出价是当前符号的最新已知卖方价格(卖出价)。

买入价是当前符号的最新已知的买方价格(报价,买入价)。

你已经知道收盘失败的原因了 . . . . 只要仔细想一想。


看看你的代码,你用什么价格来关闭订单?

 

西蒙。

卖出/买入是当前符号的最新已知卖家/买家价格。

EA希望关闭订单的价格是欧元兑美元符号的价格。

为什么EA依赖于被放置在USDJPY图表上来关闭其订单?OrderSelect()函数 的目的是选择票号,一旦票号被选中,EA就可以选择

显然,EA必须在USDJPY符号图上才能关闭订单。


擦掉我刚才说的一切。

这就是解决方案。错误在于第三个参数。我正在考虑指定符号,然后在它的参数(OrderClose()函数的第三个参数的位置)中放置卖价/买价变量。这应该可以消除思想上的任何疑惑。

谢谢你。

 
WhooDoo22:.

这就是解决方案。错误在于第三个参数中。我正在考虑指定符号,然后将卖价/买价变量放在它的参数中(OrderClose()函数的第三个参数的位置)。这应该能消除思想上的任何模糊不清。

谢谢你。

买入价 卖出价 预定义变量 与EA当前所在的图表有关。 如果你想要的买入价或卖出价与EA所在的图表不同,你不能使用买入价和卖出价预定义变量。 不过你可以使用MarketInfo();-)
 

西蒙。

错误在于OrderClose()函数 的第三个参数内,因为;)卖价/买价是当前符号的 最新已知卖家/买家价格。如果"当前符号 " 是指EA所处的当前图表,那么这可能会有点混乱。我应该记得,MQL4已经存在了一段时间,有其独特的说明和表示方法。

解决办法是用另一种方法代替Ask/Bid预定义变量,如...

// solution 1.

MarketInfo("USDJPY",MODE_BID);

// solution 2.

MarketInfo("USDJPY",MODE_ASK);

你对此有何看法?


我添加了这个EA的一个版本,它有能力打印美元指数订单的信息,并关闭它,无论它放在哪个图表上。我还没有确认它是否修改了USDJPY订单的SL和TP,但会在核实后确认。EA产生了一个最后的错误,应该不难解决。我目前正在解决这个问题。以下是错误读数的快照。

无效票据错误

谢谢你。

附加的文件:
 
WhooDoo22:

西蒙。

错误发生在OrderClose()函数的第三个参数中,因为;)Ask/Bid是当前符号的 最新已知卖家/买家价格。如果"当前符号 " 是指EA所处的当前图表,那么这可能有点令人困惑。我应该记住,MQL4已经存在了一段时间,有其独特的说明和表示方法。

解决办法是用一个替代方案来代替Ask/Bid预定义变量,例如......

你对此怎么看?


我添加了这个EA的一个版本,它能够打印美元订单的信息,并关闭它,无论它放在哪个图表上。我还没有确认它是否修改了USDJPY订单的SL和TP,但会在核实后确认。EA产生了一个最后的错误,应该不难解决。我目前正在解决这个问题。这是错误读数的快照。


谢谢你。

现在你看到了你的代码的局限性。...你不再有一个USDJPY订单,所以你的while找到了0号位置的订单,它不是USDJPY,然后它找到了1号位置的下一个订单,它不是USDJPY,然后它查看了2号位置,OrderSelect()失败,这结束了while,但其余的代码被执行,这给出了一个失败的OrderModify(),一个失败的OrderPrint(),一个失败的OrderType()和失败的OrderClose() 。...GetLastError()自己在做什么?
 

西蒙。

循环'while'运算符是这样执行的。如果表达式为真,运算符将被执行,直到表达式变为假。如果表达式为假,控制权将交给下一个运算符。

在下面的SRC框中,代码的目的是要做以下事情。

当变量'i'(包含在OrderSelect()函数 中)不是USDJPY的票面位置号和订单符号不是USDJPY时,变量'i'被增加,直到变量'i'是USDJPY票面位置号和订单符号是USDJPY。 一旦'while'循环变成假的,控制就会被传递到下面,到下一行代码。

我提供了'while'的标题和主体,以提供视觉帮助。

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")

i++;

我相信你明白'while'循环是如何在USDJPY货币对上定位一个票据的,即使目前没有票据在该货币对上,但是;)恐怕我不明白。

如果USDJPY图表上没有订单需要定位,'while'循环怎么能定位USDJPY图表上的票呢?

我相信你写了一些关于将订单定位在0号位置的内容,你能解释一下吗,或者提供一个链接供学习?

谢谢你。

 
WhooDoo22:


我相信你明白 "while "循环是如何定位美元兑日元货币对的票据的,即使目前没有票据在该货币对上,但是;)恐怕我不明白。

如果USDJPY图表上没有订单需要定位,那么'while'循环如何在USDJPY图表上定位一个票据?

我相信你写了一些关于将订单定位在0位置的内容。

如果你想自己为自己写代码,那么你需要执行3个人的任务,甚至是4个人的任务。起草需求文件的人,软件工程师和测试工程师。仅仅知道语法倒背如流和能够写代码是不够的.你必须了解你要解决的问题以及你将如何解决它,你还必须知道如何测试代码 以确保它满足需求。

在一个基本水平上,这意味着逐行检查你的代码,并确保它做你想做的事情,通常这是每个变量的值范围,从它们的最小值,通过典型值到最大值。


让我们用你的while循环来做这件事。

当你声明一个int 变量而不设置它的值时,它的起始值是0,所以当你声明 i 时(为什么不使用一个更具描述性的变量名?),它的值是0,所以第一次循环时i 是0,所以OrderSelect()试图选择0 位置的订单,如果成功的话,OrderSymbol()调用将返回0位置订单的正确符号名称,如果它不是 "USDJPY",那么表达式(OrderSymbol() !="USDJPY")将导致一个真值 ,如果OrderSelect()为,符号检查为真=,下一行代码(这是在while循环中)被执行。

现在i 是1,OrderSelect()选择了位置1的订单,所以它的值是true
,符号检查没有找到USDJPY的符号,所以返回true。符号检查没有找到USDJPY的符号,所以返回true,又是true true = true ,所以再次执行i++

现在i
是2,OrderSelect()试图选择位置2的订单,但是失败了。...只有2个订单,在0和1的位置,所以OrderSelect()返回false,OrderSymbol()会做什么?但即使它因为一些奇怪的原因返回,OrderSelect()已经返回真= ......while循环已经结束,i 被设置为2

现在通过代码的其余部分,牢记i 的值为2......