You already have the loop.
Just integrate IF (OrderType() == Pair) OrderClose(ctotal.......);
After assigning var Pair and using ticket# instead of ctotal as should be.
It will then close one at each loop-run.
Hope I didn´t misunderstand something.
/ McKeen
Would it be ok to run the loop for closing orders first and then close out your pending orders after that's done? Might speed it up a bit if you give the switch block less cases to look through...
hi, if all your 100 positions are in the same direction and on the same symbol there is a solution,
you have to open one position in the other direction where lotsize is the total amount of all other positions, then you can close all the order with the function OrderCloseBy() without risk.
//z
thanks!
I have open orders in different direction but on the same symbol. I just need to close everything.
Please, format code properly regardless of useless.
thanks!
don't understand?, I'm a beginner coder
You already have the loop.
Just integrate IF (OrderType() == Pair) OrderClose(ctotal.......);
After assigning var Pair and using ticket# instead of ctotal as should be.
It will then close one at each loop-run.
Hope I didn´t misunderstand something.
/ McKeen
Thanks!
I don't want to close one at each loop-run. I want to close all at once. The problem is the loop.
I think there is a need to re-code. I recently realize that MT4 could make more than 1 order at a time. Therefore it might be able to close all order at once. Closing one each loop will take time. Let say I have 1000 open orders, that will take minutes.
The problem is that there is a loop
int ctotal = OrdersTotal();
for(int j=ctotal-1;j>=0;j--)
and
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
can only close one at a time.
Is there a way to maybe get all the total order, but instead of creating a loop to OrderClose 1 by 1,
make mt4 do many
e.x.
I got n number of total order, then MT4 do this
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
..... n number etc?
???
Hi there,
There is no way you can just close all your orders at once, but here is a script that I wrote that will close your orders twice as fast as the regular method.
Note that it will only work if all trade sizes are the same and will only work on the currency pair of the chart that it is loaded onto. You can customise it for differing order sizes but I haven't written that routine since I don't actually use this script.....I just made it for demonstration purposes.
int Buy_Ticket[], Sell_Ticket[]; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int timer = GetTickCount(); //---- int Buys = 0, Sells = 0; for(int i =OrdersTotal()-1;i>=0;i--){ OrderSelect(i,SELECT_BY_POS); if(OrderType()==0)Buys++; else Sells++; } ArrayResize(Buy_Ticket,Buys); ArrayResize(Sell_Ticket,Buys); if (Sells == Buys){ for(i =OrdersTotal()-1;i>=0;i--){ OrderSelect(i,SELECT_BY_POS); if(OrderType()==0){ Buy_Ticket[Buys-1] = OrderTicket(); Buys--; } else{ Sell_Ticket[Sells-1] = OrderTicket(); Sells--; } } } for(i=0;i<ArraySize(Buy_Ticket);i++)OrderCloseBy(Buy_Ticket[i],Sell_Ticket[i],CLR_NONE); timer -= GetTickCount(); Print("Time to close = " + timer); //---- return(0); }
Hi there,
There is no way you can just close all your orders at once, but here is a script that I wrote that will close your orders twice as fast as the regular method.
Note that it will only work if all trade sizes are the same and will only work on the currency pair of the chart that it is loaded onto. You can customise it for differing order sizes but I haven't written that routine since I don't actually use this script.....I just made it for demonstration purposes.
Thanks! twice as fast as the regular method is still an improvement. Thank you very much. I will try this!
But I got Invalid ticket error for OrderCloseBy
This method uses OrderCloseBy which is simply pairing up of opposing trades. When you close a trade, you are actually making a new trade in the opposite direction. This instruction tells the broker not to make the opposite direction trade, but rather to offset and close 2 opposing trades.
It is worth allowing your EA to take a couple of milliseconds to organise your trades. This would entail matching opposite trades that are the same size with an equivalent opposite trade. Once this is done, those positions are fully hedged, and speed is not the key element. Close out the unbalanced trades(using the normal method) and then use a spread filter to close opposing matched trades when spread is at a minimum.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
This is the close all order script that I use
The problem is that if I opened many positions say 100, it will take ages to close all the orders 1 by 1. By the time it completed doing so, the market might had turned against me.
Is there anyway to close all opened positions at once.
On a side note, I just learned today that you could open more than 1 order in a go, at the same time by adding "&"
int ticket=OrderSend(symbol1,OP_SELL,LotSize,MarketInfo(symbol1,MODE_BID),3,Ask+(Point*StopLoss),0,"My EA",12345,0,Red)
& OrderSend(symbol2,OP_BUY,LotSize,MarketInfo(symbol2,MODE_ASK),3,Bid-(Point*StopLoss),0,"My EA",12345,0,Green);
but still cannot get it to work with 2 different pairs.
error 4106: unknown symbol name, even if I test it on another chart other than symbol1 and 2
BIG THANK YOU in advance!