- rex_loner:
So, after Orderclose() for long position, EA will continue to LoopingGreen() function. The idea is logic but it can't work. It made the MetaTrader freeze (forward and backtest). I also change:Of course it does because of void LoopingGreen() No sleep, no refresh.
Instead try this form
int start(){ ... if (count > 0){ // handle open orders... return(0); } int newDIR = ... // set OP_BUY/OP_Sell per your criteria static int prevDIR=-1; // Open a new trade if (newDIR == prevDIR) return(0); // Wait until direction change prevDIR = newDIR; // open new trade...
for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(0, SELECT_BY_POS, MODE_TRADES) == true)
If (TRUE == true) is redundant.
This makes the EA incompatible with every other, including itself on other charts. Always use magic number.for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if ( OrderSelect(pos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == magic.number // my magic number && OrderSymbol() == Symbol() ){ // and my pair.
if (OrdersTotal() < 1)
Again incompatible.int count=0; for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if ( OrderSelect(pos, SELECT_BY_POS) // Only my orders w/ && OrderMagicNumber() == magic.number // my magic number && OrderSymbol() == Symbol() ){ // and my pair. count++; } if (count == 0){
OrderSend (Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, SellComment, 0304, 0, Blue); CloseBuy = OrderOpenPrice() + TakeProfit * Point,
EAs must adjust for 5 digit brokers, TP, SL, AND slippage.//++++ These are adjusted for 5 digit brokers. int pips2points; // slippage 3 pips 3=points 30=points double pips2dbl; // Stoploss 15 pips 0.0015 0.00150 int Digits.pips; // DoubleToStr(dbl/pips2dbl, Digits.pips) int init(){ if (Digits == 5 || Digits == 3){ // Adjust for five (5) digit brokers. pips2dbl = Point*10; pips2points = 10; Digits.pips = 1; } else { pips2dbl = Point; pips2points = 1; Digits.pips = 0; } // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
thanks for the reply,
I understand for number 2 until 4. But for:
int start(){ ... if (count > 0){ // handle open orders... return(0); } int newDIR = ... // set OP_BUY/OP_Sell per your criteria static int prevDIR=-1; // Open a new trade if (newDIR == prevDIR) return(0); // Wait until direction change prevDIR = newDIR; // open new trade...
I'm still getting confuse about setting the OP_BUY or OP_SELL on int newDIR. Based on what criteria I have to set them?
And for your statement saying: "Of course it does because of void LoopingGreen() No sleep, no refresh." about my looping problem. What do you mean with no Sleep() and no Refresh()? Do I have to use those function in Looping?
Can you please make some simple example for me so I can fully understand? Thank you for your attention
rex_loner:
I'm still getting confuse about setting the OP_BUY or OP_SELL on int newDIR. Based on what criteria I have to set them?
And for your statement saying: "Of course it does because of void LoopingGreen() No sleep, no refresh." about my looping problem. What do you mean with no Sleep() and no Refresh()? Do I have to use those function in Looping?
- Your EA is already deciding to buy or to sell. Instead of
if (condition){ orderSend(buy) } else (condition2){ orderSend(sell) }
I meant something like:
int new=-1 if (condition) new=1 elseif (condition2) new=2 if (new == prev) return if (new==1){ orderSend(buy) elseif(new==2){ orderSend(sell) }
- Not in all loops. Your loop was to WAIT for a condition, but the loop had no sleep and didn't refresh so it was just repeatedly asking the same question and getting the same result. There is no need for that normally, JUST return and reevaluate on the next tick/next bar
thanks for the reply.. I do understand now about the logic of waiting the signal. What about if I insist to use While() function to 'wait' the signal? How to write this 'wait' algorithm?
You asked - "Maybe I use wrong parameter on iCustom() function or maybe there's something I missed how to use algorithm when including empty_value variable. Please help me. Thanks before for your attention."
You show only one parameter for each iCustom - just the fast or slow period and no other parameters.
The THVTrixDiv has approx 50 extern settings that should ALL be included in your EA iCustom statements.
You can include ALL the externs in your iCustoms....OR... To make it easy to use this indicator in your EA,
You can copy the indicator to a test file (THVTrixDiv_Test) and remove or minimize the externs - you don't need them for your EA iCustom calls.
Leave the FastPeriod/SlowPeriod externs if you still want to change them in
your EA for testing...but make sure you include them both in
each iCustom statement, not just one or the other.
Example - SlowGreen and the other values needs BOTH periods...(both parameters)...
SlowGreen = iCustom (Symbol(), 0, "THVTrixDiv", SlowPeriod,FastPeriod 0, 0),
To change the EXTERN's.. .
Externs - Example Code:
extern color HighLine_Color = FireBrick;
extern color ZeroLine_Color = DimGray;
extern color LowLine_Color = DarkGreen;
Change all externs to //extern:
//extern
color HighLine_Color = FireBrick;
//extern
color ZeroLine_Color = DimGray;
//extern
color LowLine_Color = DarkGreen;
OR delete externs completely:
color HighLine_Color = FireBrick;
color ZeroLine_Color = DimGray;
color LowLine_Color = DarkGreen;
Recompile the indicator and you are ready to go. Use the remaining extern parameters and new indicator name in your EA iCustoms.
EMPTY_BUFFER
Not sure what problem you are having with the EMPTY_BUFFER...but I don't think you need to initialize any values, just use them as they are or change them to zero (0):
if (Value1 = 2147483647) Do something...;
Sleep() or Refresh()
You asked - "I do understand now about the logic of waiting the signal. What about if I insist to use While() function to 'wait' the signal? How to write this 'wait' algorithm? "
I don't know enough coding to help with Sleep() or Refresh(), but you should not need to do that for this indicator? Your EA should retrieve the current indicator values and keep checking the indicator by Time or Tick anyway.
Print or Comment Your Indicator Values
One thing that will help you a lot is to Print or Comment your indicator values in your EA so you can actually see you are getting the correct values.
Hope this helps,
Robert
thanks Robert,
I can do better with the indicator now since I remove all the externs I don't need. I can save more memory capacity.
In regards of the empty_value, I face the problem about how to looping them. Let's say, when this indicator, Trix, shows us a FastGreen line then EA send order to buy. After TakeProfit, somehow FastGreen line still there and I want to make it idle as long as this line still green. I already give the picture on the first post.
So, the point is, I've been thinking to make the EA idle after Buy and as long as the FastGreen still available I want to make EA to wait until FastGreen change to FastRed with While() looping function. Then when FastRed is available, it's time to Sell and after TakeProfit, make the EA idle as long as the FastRed, and so on.
When I tried to write the simple algorithm like this:
//... after orderclose, let's say after Buy Position int m; while (FastGreen != empty_value) // as long as the FastGreen is available then.. { m++; // .. counting the tick }
it's just like failed.. my Strategy Tester is freeze and when I tried it in Forward Test, it's not working. So, if you do have any other idea please help me. I'm still trying to understand the idea from WHRoeder.
WHRoeder, so I'm trying to write like this:
if (OrdersTotal() > 0) { OrderClose() // close when condition ... return(0); } int new = -1; if (Condition Buy) { new = 1; } else if (Condition Sell) { new = 2; } if (new == 1) { OrderBuy } if (new == 2) { OrderSell }
where do I put my static variable? is it after OrderClose()? where do I have to put assignment operator of:
static int prevDIR=-1; // Open a new trade ---> is this real to open new trade? how come? if (newDIR == prevDIR) return(0); // Wait until direction change prevDIR = newDIR;
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I'm using indicator: THV (Turhovich) Trix Divergence version 4 to read the trend. I also discover how to use this indicator into my algorithm with iCustom() function. Unfortunately, there's a problem occurred with this indicator. I also attached THVTrixDiv.mq4 below.
There are 6 buffers. First until fourth buffer belong to the line of Trix and the rest of buffers belong to arrow. I don't pay attention too much for this arrow value since I only use the trix line.
As you know, this indicator shown in Separate Window with two line shows which direction the trend will be. One line for Fast Period and the other one is for Slow Period. Each of this line consist two values which is Green and Red. Green for Trend Up and vice-versa. And when line Green is shown, the value of Red is empty as known as empty_value.
My objective is simple. Open Long Position when all the Trix is Green or Short Position when all Trix is Red. The idea of Take Profit is when several points captured. After TP all I want to do is make it idle until Trix change color (or value).
Here the example:
When both of Trix is Green, then Ordersend() buy is commence (shown with Green Arrow Down and Light Turquoise Arrow Left)
After several points, Orderclose() is run to take profit (shown by Turquoise Arrow Left).
By the time the order is closed, both of Trix still green (shown by Red Arrow Up). While the Trix (I chose to focus more on the FS) still Green (shown with Red Circle), the EA should be in standby.
The trouble came when I cannot make it idle. I already used While() or For() as a looping. I've tried those function and it can't work as well. This is the algorithm When I use While() function in some call function:
Maybe I use wrong parameter on iCustom() function or maybe there's something I missed how to use algorithm when including empty_value variable. Please help me. Thanks before for your attention.
Regards,
Aras
This is my simple source code: