Hi Jay,
when coding you should stay away from while loops as much as possible. They go easily into an endless loop. I guess that's the problem too in this EA.
hth
Russell wrote
>>
when coding you should stay away from while loops as much as possible. They go easily into an endless loop.
Respectfully, I disagree. In certain cases using 'while' loops makes for much better clarity than forcing a 'for' loop when it's not needed. 'Endless loop' bugs can happen with 'for' loops as well...
while(Buy == true) { while(OrdersTotal() < 1) { StopLoss = Low[iLowest(Symbol(), 0, MODE_LOW, 4, 0)] - AverageTR / 2.0; OrderSend(Symbol(), OP_BUY, 0.10, NormalizeDouble(Ask,4), 3, NormalizeDouble(StopLoss,4), 0,0,0,0); Alert("The Last Error " , GetLastError()); break; } }
while(Buy == true) is redundant, simplify while(Buy)...
You are trying to open an order when buy is true.
1) you don't test if orderSend succeeded or not
2) the break takes you out of the inside loop, but not out of the outside loop, therefor infinite loop.
Drop the loops
if (Buy && OrdersTotal() == 0) { // SL=...
while(Buy == true) is redundant, simplify while(Buy)...
You are trying to open an order when buy is true.
1) you don't test if orderSend succeeded or not
2) the break takes you out of the inside loop, but not out of the outside loop, therefor infinite loop.
Drop the loops
Respectfully, I disagree. In certain cases using 'while' loops makes for much better clarity than forcing a 'for' loop when it's not needed. 'Endless loop' bugs can happen with 'for' loops as well...
I didn't say never use while loops, just stay away from them if they aren't really needed. By forcing a for loop to do a while task you're obviously heading in the wrong direction. Sure you can get a for loop into an endless one, but it takes a bit more effort. 8-)
btw i don't think while(Buy == true) more complex than while(Buy). In my opinion every condition should be tested, a boolean preferably to false: while (lbBuy != FALSE)
Use of proper bool variable names makes the code clearer:
I prefer |
versus |
---|---|
while(Buying) {buy code...} | while(ibBuy != false) {...} |
if(!Buying) {sell code...} | if(ibBuy != true) {//sell code |
bool RRRok = (TP-Ask)/(Bid-SL) > RRR.min; bool Buying = EMA5 > EMA13; if (Buying && RRRok) {buy code...} | if ( (TP-Ask)/(Bid-SL) > RRR.min && EMA5 > EMA13) {buy code...} |
Use of proper bool variable names makes the code clearer:
I prefer | versus |
---|---|
while(Buying) {buy code...} | while(ibBuy != false) {...} |
if(!Buying) {sell code...} | if(ibBuy != true) {//sell code |
bool RRRok = (TP-Ask)/(Bid-SL) > RRR.min; bool Buying = EMA5 > EMA13; if (Buying && RRRok) {buy code...} | if ( (TP-Ask)/(Bid-SL) > RRR.min && EMA5 > EMA13) {buy code...} |
I agree with Roeder...why to do double check
I agree that proper variable names make code clearer, but the conditions easily get scattered over the code this way. So it will become harder to debug.
In my opinion "Buying" isn't a correct var name. I use a coding standard which helps me easily track and control dozens of vars if needed. I never have to guess what will be affected, or what will break if I put the wrong values in a var. So that is WHY you have to check your var at the decision point. A var could have been changed some where in your code unintended.
Example
int start(){ int Buying = TRUE; // a lot of code Buying++; // a lot of code Buying/=10; //decision point if (Buying){ OrderSend(....); } }
ok not the best example, but the best I could come up with. The code is valid but could give very unexpected results.
int start(){ int liBuying = 1; bool lbBuying = TRUE; // a lot of code liBuying++; // a lot of code liBuying/=10; //decision point if (lbBuying != FALSE){ OrderSend(....); } }
/* prefix ------- g - global var r - return var l - local var _ - input var s - static var second letter var type ------------ i - int d - double s - string b - bool followed by a clear name in camelCaps */ int giTrailing = 100; string gsTrailing = "Trailing Stop"; double gdTrailing[2]; void stateTrailing(int _iTrailing, double &rdTrailing[]){ bool lbTrailing = FALSE; static bool sbTrailing = FALSE; if (lbTrailing == sbTrailing){ rdTrailing[0] = _iTrailing/0.15; } }
[...] By forcing a for loop to do a while task you're obviously heading in the wrong direction.
I agree and that's what I meant. U should use a 'while' loop when its the best choice; use a 'for' loop when it's the best choice. I was just referring to 'when coding you should stay away from while loops as much as possible'. IMHO, they should not be avoided; they should be used properly when they are the 'best' choice.
Use of proper bool variable names makes the code clearer
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Attaching here is the code of a simple EA that am trying to write based on SMA
but while testing it on strategy tester, the tester opens an order and gets hanged.
Plz help.