[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 409

 

sss2019



请给我看一个例子,我做了,但没有用。


我做的脚本是这样的

int orderstotal = OrdersTotal();
        for(i = 0; i < orderstotal; i++ )
                {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
                if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
                        {
                        if(OrderType() == OP_BUY)
                        if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() == OP_SELL)
                        if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage) == false)
                                {
                                Print(GetLastError());
                                }
                        if(OrderType() > 1)
                        if(OrderDelete(OrderTicket()) == false)
                                {
                                Print(GetLastError());
                                }
                        }
                Print(i," ",orderstotal);
                }

结果是,打印输出如下

0 4

1 4

这就是全部,由于某些原因,循环没有打印出

2 4

3 4

我在循环中加入了OrderSelect(i, SELECT_BY_POS, MODE_TRADES,而不是I 0,也就是说,第一个订单总是被选中,而且脚本工作正常。事实证明,当循环删除两个订单时,当列表中只有两个订单时,它试图选择第三个订单。

 
sss2019:


制作的脚本是这样的

最后...

实例
 
sss2019:

请给我看一个例子,我有

for(i = OrdersTotal(); i > 0; i--)

没有帮助。


因为你仍然要思考。

for(i = OrdersTotal()-1; i >=0; i--)
 

帮助我解决这个难题

int i;
    double maxrange,range;
    double Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
    double Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
   
                    while(Ma1 > Ma2)
                        {
                        i++;
                        Ma1 = iMA(Symbol(),Period(),FastMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        Ma2 = iMA(Symbol(),Period(),SlowMaPeriod,0,MODE_EMA,PRICE_OPEN,i);
                        range = (Ma1 - Ma2)/Point;
                        if(range > maxrange) maxrange = range;
                        }

脚本搜索线条之间的最大距离。它在所有的柱子上输出所有的值,最大范围是一个柱子上的1.6235和另一个柱子上的1.6208。

我试着打印Print(maxrange);它打印的是0.086,我不明白为什么,我是用点除以的。

 
sss2019:

帮助我解决这个难题

脚本搜索线条之间的最大 距离。它在所有的柱子上输出所有的值,最大范围是一个柱子上的1.6235和另一个柱子上的1.6208。

我试着输出Print(maxrange);它返回0.086,我完全不明白为什么,我在用点除法。


这不是一个两难的问题。进退两难是指你不知道两个解决方案中哪个是最好的。

那么,首先,iMA()函数有七个参数,而不是六个。第二,你已经通过int i字符串声明了一个变量。再进一步说,i变量没有在任何地方初始化一个值。结果是,它要么是零,要么是含有前一个活动留下的内存垃圾。第三,while循环的安排是不正确的。好吧,我们假设i变量在初始化后等于零。我们还假设Ma1>Ma2的表达也是真的。因此,while(Ma1 > Ma2)行将开始循环。在下一次循环迭代中,我们将发现(Ma1>Ma2)表达式不再是真的,循环将被终止。变量Ma1和Ma2将不包含最大的距离--最大的距离是一次。这个条件只会显示Ma1现在已经小于或等于Ma2。

此外,maxrange变量将只在range = (Ma1 - Ma2)/Point这一行被初始化一个值;那么,如果条件if(range > maxrange)永远不会出现,因为你没有在代码的其他地方给maxrange变量初始化一个值,怎么办?因此,事实证明,你是在将计算的结果与记忆细胞的垃圾进行比较。在这里,你有难以理解的打印结果,这是代码执行的结果。

 
事情是这样的,我在循环中输出所有的MA值,所有的值都是正确的,也就是说,这个时期的所有MA值都被列举出来。但这个地方的计算是错误的--范围=(Ma1-Ma2)/Point。
if(range > maxrange) maxrange = range;
 
sss2019:
这就是问题的关键,我在循环中输出所有的MA值,所有的值都是正确的,也就是说,这个时期的所有MA值都被搜索到了。但这个地方的计算是错误的--范围=(Ma1-Ma2)/Point。
if(range > maxrange) maxrange = range;

*点

范围=(Ma1 - Ma2)*点





 
pako:

*点

范围 = (Ma1 - Ma2)*Point

马1 = 0.6526,马2 = 0.6516。ma1-ma2 = 0.6526-0.6516 = 0.0010。=0.0001。若是相乘,就是一个双库。0,0010 * 0,0001 = 0,0000001
 
sss2019:
事情是这样的,我在循环中输出所有的MA值,所有的值都是正确的,也就是说,这个时期的所有MA值都被列举出来。但这个地方的计算是错误的--范围=(Ma1-Ma2)/Point。
if(range > maxrange) maxrange = range;

那么,你需要检查输入的是什么。计算中涉及哪些变量值?
 

MQL教程 ,在标准函数一章的图形操作部分,有一个函数WindowHandle,描述如下。"......返回包含指定图形的窗口(窗口手柄)的系统描述符"。

问题:"窗柄 "是什么意思(它是什么),有什么用

P.S.为了不给论坛添乱,提前感谢您的回答