也许计数器在EA内部的其他地方得到了另一个值,试试。
void start() { int counter=0, MaxCount = 10000; while( counter <= MaxCount ) {Print("Counter ", counter); counter++; } return; }
大家好!
我有一个EA(从未在600之前的版本上测试过,但代码已经有2年了),在625版本的WHILE中被卡住了。
事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数中。
我尝试了一个非常简单的EA,以便了解发生了什么。
好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。
为什么会这样?有什么建议吗?
你声明了计数器是全局的,这意味着它是静态的。
你在OnStart()中的代码,counter++把计数器的值一直推到10,000。
因此,由于它是静态的,在下一次跳动时,你的计数器是在10000点开始的。
你声明了计数器是全局的,这意味着它是静态的。
你在OnStart()中的代码,counter++将计数器的值一直推到10,000。
所以,由于它是静态的,在下一次嘀嗒声中,你的计数器开始时是10,000。
他写道。
好吧,第一个计数器的值通常是从9500以上的一个随机值开始的,而不是从0开始。
为什么会这样呢?有什么建议吗?
所以,这是我的答案
也许计数器在EA内部的其他地方得到了另一个值,试试。
void start() { int counter=0, MaxCount = 10000; while( counter <= MaxCount ) {Print("Counter ", counter); counter++; } return; }
大家好!
我有一个EA(从未在600之前的版本上测试过,但代码已经有2年了),在625版本的WHILE中被卡住了。
事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数中。
我尝试了一个非常简单的EA,以便了解发生了什么。
好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。
为什么会这样?有什么建议吗?
最有可能的是,你正在查看专家选项卡,它无法跟上像这样的快速循环。
打开实际的日志文件。
我可以告诉你一件事,那个while循环永远不会执行第二次,除非你在代码的其他地方再次调用那个计数器变量,并将其值改回小于10,001。你应该对全局性的变量声明加以注意。
GumRai,你是对的:日志报告了从1开始的所有输出。
把变量声明放在全局空间而不是放在OnStart()里面的区别是,在第一种情况下,循环只执行一次,而在第二种情况下,循环会无限期地重复。
但是...。很明显,我选择了错误的调试例子,因为计数循环执行得很好。
这一切都从以下的EA开始。
这里是代码。
extern int SwingBarCount = 100;
int start() { int SwingHighShift = 0; string StringHighStatus = "False"; int SwingHigh = 0; while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount) { if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0]) { StringHighStatus = "True"; SwingHigh = SwingHighShift; ObjectDelete("SwingHigh"); ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0); ObjectSet("SwingHigh", OBJPROP_COLOR, Red); } else { SwingHighShift++; } } }}
为了清楚起见,我已经删除了 其他不相关的代码,它一直执行到WHILE,因为我在之前设置了一些断点。
它应该从WHILE条件为真开始,然后循环IF ELSE直到StringHighStatus为真或StringHighShift达到SwingBarCount。
但我看到的是,它永远不会结束,因为在WHILE之后有一系列的COMMENT和PRINT命令,没有输出。
虽然StringHighStatus可以保持为假,但计数器必须达到SwingBarCount。
我不得不这样修改,以使其工作。
while (!EndCycle) { if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0]) { StringHighStatus = "True"; SwingHigh = SwingHighShift; ObjectDelete("SwingHigh"); ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0); ObjectSet("SwingHigh", OBJPROP_COLOR, Red); } else { SwingHighShift++; } if( StringHighStatus == "True" ) EndCycle = TRUE; if( SwingHighShift > SwingBarCount ) EndCycle = TRUE; }
我不明白为什么它会处理EndCycle而不是其他条件。
谢谢大家的回答。
if( StringHighStatus == "True" ) EndCycle = TRUE; else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;尝试包括其他。
大家好!
我有一个EA(从未在600之前的版本上测试过,但代码已经2年了),在625版本的WHILE中被卡住。
事实是,当WHILE开始时,它似乎无法检查表达式:结果是,它永远不会出来。它被放置在启动函数 中。
我尝试了一个非常简单的EA,以便了解发生了什么。
好吧,第一个计数器的值通常从9500以上的随机值开始,而不是从0开始。
为什么会这样?有什么建议吗?