Download MetaTrader 5
To add comments, please log in or register
Download MQL5 library codes via MetaTrader. It is convenient!
Joan
22
Joan 2014.07.23 18:36 

I have this, with help from FXEZ, but it loops throug all orders, and I only want to through the last 2 orders.

bool TradePriceAllowed() {
   for(int k=OrdersTotal()-1;k>=0;k--) {
      if((OrderSelect(k,SELECT_BY_POS,MODE_TRADES)) && 
       (OrderSymbol()==Symbol())&&(OrderMagicNumber()==Magic)) {
         if(MathAbs(OrderOpenPrice() - Bid) < Dist_Pips*Point) {
                return(false); 
         }
       }  
    }
    return(true);
   }
Daniel Petrovai
440
Daniel Petrovai 2014.07.24 08:54  
jola:

I have this, with help from FXEZ, but it loops throug all orders, and I only want to through the last 2 orders.

 


If you want to place another sell at a specific distance from a previous OP_SELL order you can select the most recent sell by the OrderOpenTime() and then use the OrderOpenPrice() to calculate your next level of entry.

bool TradePriceAllowed()
  {
   datetime prevOrderOpenTime=0;
   double   prevOrderOpenPrice=0.0;
   for(int k=OrdersTotal()-1;k>=0;k--)
     {
      if(!OrderSelect(k,SELECT_BY_POS,MODE_TRADES))//if order select fails
        {
         Print("Order select failed  with error : "+(string)GetLastError());//tell me the error
         break;
        }
      else
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderOpenTime()>prevOrderOpenTime)
              {
               prevOrderOpenTime=OrderOpenTime();
               prevOrderOpenPrice=OrderOpenPrice();
              }
           }
        }
     }//end for

   if(MathAbs(prevOrderOpenPrice-Bid)>=Dist_Pips*Point)
     {
      return(true);
     }
return(false);
}

 Changed around the return true and return false so you don't get return true if OrderSelect() fails.

As you can see , the loop has to go trough all orders to find the most recent one and it will not return true for older orders.

The only thing is that you may need to consider the direction of the order. Are you adding to existing sell position or buy position ? 

That's one way I guess of doing it. 

Joan
22
Joan 2014.07.24 14:39  
thrdel:


If you want to place another sell at a specific distance from a previous OP_SELL order you can select the most recent sell by the OrderOpenTime() and then use the OrderOpenPrice() to calculate your next level of entry.

 Changed around the return true and return false so you don't get return true if OrderSelect() fails.

As you can see , the loop has to go trough all orders to find the most recent one and it will not return true for older orders.

The only thing is that you may need to consider the direction of the order. Are you adding to existing sell position or buy position ? 

That's one way I guess of doing it. 

 

 

 

 


Hi Thanks, that is nice of you.

Yes I will try it out, and I will add direction for buy and sell. 

Joan
22
Joan 2014.07.29 08:37  
I tried it out and it looked correct at the beginning, but 
Now my problem is, that if it closes the order by the Trailingstop before it reaches the distance, it opens an order emidiately after the close.
So I gues I have to ad another rule to prevent that.
Daniel Petrovai
440
Daniel Petrovai 2014.08.01 01:54  
jola:
I tried it out and it looked correct at the beginning, but 
Now my problem is, that if it closes the order by the Trailingstop before it reaches the distance, it opens an order emidiately after the close.
So I gues I have to ad another rule to prevent that.


For me to be more specific, I guess I'd need to see the whole code to make sure you update the result of TradePriceAllowed() before you use it..

What I think you may need to do is to call  the TradePriceAllowed() function before you allow EA to place another order.

Don't just rely on the value stored previously when TradePriceAllowed() was last executed. 

In other words, you need to update the variable that holds the result of TradePriceAllowed() function every time you rely on that value.

Kind of like if you need to know if you have an open order, you need to update the count after every routine that may close or open an order or

before using that value. Does it make any sense ? 

On the other hand, the closed order by trailing is passed to the  history pool and the TradePriceAllowed() function will not see it

in the open trades pool so, if you want to find the most recent open time of all orders that are open and that were closed, you need to

loop through open orders and history as well

MODE_TRADES (default)- order selected from trading pool(opened and pending orders),

MODE_HISTORY - order selected from history pool (closed and canceled order).

You can make datetime prevOrderOpenTime instead of local variable into a global or a static one but if you lose 

connection of the EA goes trough  initialization for some reason, you lose the value stored in it

In my view, looping trough all orders (open and history) is the safest way .

If it makes sense and you need help with that, let me know.

Cheers 

/
To add comments, please log in or register