int MagicNr=12; bool isOrderOpen=false; for(int i=OrdersTotal()-1;i>=0;i-){ OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber()==MagicNr && OrderSymbol()==Symbol() ){ isOrderOpen=true; } } if(!isOrderOpen){ OrderSend(Symbol(),OP_SELL,Lots,91.000,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",MagicNr,0,CLR_NONE); //or OrderSend(Symbol(),OP_BUY,Lots,91.000,1,Bid-StopLoss*Point,Bid+TakeProfit*Point,"buy",MagicNr,0,CLR_NONE); }
[...]
firstly is there somehting wrong with this code?
This is for instant execution at 91.000. Obviously depending on your execution criteria, there is a high chance the current price won't be exactly 91.000. You would be better using ask / bid.
If you want a pending order at 91.000, then you need a different order type.
OP_BUYLIMIT - buy limit pending position,
OP_BUYSTOP - buy stop pending position,
OP_SELLLIMIT - sell limit pending position,
OP_SELLSTOP - sell stop pending position.
You also run a risk of error 130 on your TP and SL. Best to use NormaliseDouble to make sure you've got the right number of decimals. And, maybe I'm nitty but I am always more explicit with calculations. It may work the way you've done it, but I never do it that way so don't know... I would explicitly ensure the Point is multiplying the stoploss only and not the sum of the ask and stoploss... personally, I calculate it outside the ordersend and just pass the result into ordersend.
double sl= NormalizeDouble(Ask+(StopLoss*Point),Digits);
OP_BUYLIMIT - buy limit pending position,
OP_BUYSTOP - buy stop pending position,
OP_SELLLIMIT - sell limit pending position,
OP_SELLSTOP - sell stop pending position.
the problem is it will just keep opening the sell limit for the specific number and for some reason only the sell limit works and others dont, the sell limit is first on the list however:
this is a tryout
double Lots = 0.1; double StopLoss = 200; double TakeProfit = 50; int start() { OrderSend(Symbol(),OP_SELLLIMIT,Lots,93.350,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYLIMIT,Lots,93.350,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,"buy",0,0,CLR_NONE); OrderSend(Symbol(),OP_SELLSTOP,Lots,93.350,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYSTOP,Lots,93.350,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,"buy",0,0,CLR_NONE); }i dont think a magic number would be necessary as it would just add bulk to the script and ive already reached the limit on the script at 389 lines so i guess i need to minimize as much as possible. is there another way around the magic number? like "order only valid if theres no existing order" or somthing like that. cheers
if (OrdersTotal()==0) { //OPEN ORDERS }but i would strongly recommand to use the method with magic numbers. with the OrdersTotal() method the order will only be sent if there are no other open trades open on your account
then the orders total is useless for what am doing, is there a way round the magic numbers?
because my script is absolutley huge! this is just "2" parts of the script. how can i implement the magic number on this script? thanks
OrderSend(Symbol(),OP_SELLSTOP,Lots,86.000,3,86.000+StopLoss*Point,86.000-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYLIMIT,Lots,86.000,3,86.000-StopLoss*Point,86.000+TakeProfit*Point,"buy",0,0,CLR_NONE); OrderSend(Symbol(),OP_SELLLIMIT,Lots,86.000,3,86.000+StopLoss*Point,86.000-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYSTOP,Lots,86.000,3,86.000-StopLoss*Point,86.000+TakeProfit*Point,"buy",0,0,CLR_NONE); OrderSend(Symbol(),OP_SELLSTOP,Lots,86.050,3,86.050+StopLoss*Point,86.050-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYLIMIT,Lots,86.050,3,86.050-StopLoss*Point,86.050+TakeProfit*Point,"buy",0,0,CLR_NONE); OrderSend(Symbol(),OP_SELLLIMIT,Lots,86.050,3,86.050+StopLoss*Point,86.050-TakeProfit*Point,"sell",0,0,CLR_NONE); OrderSend(Symbol(),OP_BUYSTOP,Lots,86.050,3,86.050-StopLoss*Point,86.050+TakeProfit*Point,"buy",0,0,CLR_NONE);
double Lots = 0.1; double StopLoss = 50; double TakeProfit = 50; int MagicNr=12; bool isOrderOpen=false; int start() { int MagicNr=12; bool isOrderOpen=false; for(int i=OrdersTotal()-1;i>=0;i-){ OrderSelect(i,SELECT_BY_POS); if(OrderMagicNumber()==MagicNr && OrderSymbol()==Symbol() ){ isOrderOpen=true; } } if(!isOrderOpen){ OrderSend(Symbol(),OP_SELL,Lots,91.000,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",MagicNr,0,CLR_NONE); OrderSend(Symbol(),OP_BUY,Lots,91.000,1,Bid-StopLoss*Point,Bid+TakeProfit*Point,"buy",MagicNr,0,CLR_NONE); OrderSend(Symbol(),OP_SELL,Lots,92.000,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",MagicNr,0,CLR_NONE); OrderSend(Symbol(),OP_BUY,Lots,92.000,1,Bid-StopLoss*Point,Bid+TakeProfit*Point,"buy",MagicNr,0,CLR_NONE); } return(0); }and how can i add an orders total of 8 to the above? thanks
Look at your errors when compiling. Double click it and it will take you straight to were you are missing a "-" sign. it should be i--.
I'm not sure what you are trying to achieve but what you have posted won't work as there are 2 different prices at order execution if you want an instant market order you need to use Ask/Bid.
If you are wanting a pending order at a specific price you need a different order type as mentioned before. You would do well to include error handling to get an idea of where your code is failing.
With regards to counting orders, not sure what you want. OrdersTotal() will count everything. pending or running, so the code below will not execute if there are already pending orders.
Try this... hopefully this is what you are trying to achieve.
#EDIT: Code had error - so removedSorry, I made an error on the error handling and rectified it below..
double Lots = 0.1; double StopLoss = 500; double TakeProfit = 500; double buystop_price=1.51; double sellstop_price=1.47; int MagicNr=12; double sl,tp,entry; int _last_error; if (OrdersTotal()>0) { Alert("Open Orders"); } if (OrdersTotal()==0) { sl=NormalizeDouble(sellstop_price+(StopLoss*Point),Digits); tp=NormalizeDouble(sellstop_price-(StopLoss*Point),Digits); entry=NormalizeDouble(sellstop_price,Digits); OrderSend(Symbol(),OP_SELLSTOP,Lots,entry,1,sl,tp,"Sellstop",MagicNr,0,CLR_NONE); _last_error=GetLastError(); if (_last_error>0) { Alert( "Sellstop Error - Code ",_last_error); } sl=NormalizeDouble(buystop_price-(StopLoss*Point),Digits); tp=NormalizeDouble(buystop_price+(StopLoss*Point),Digits); entry=NormalizeDouble(buystop_price,Digits); OrderSend(Symbol(),OP_BUYSTOP,Lots,entry,1,sl,tp,"Buystop",MagicNr,0,CLR_NONE); _last_error=GetLastError(); if (_last_error>0) { Alert( "Buy stop Error -Code ",GetLastError()); } }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
im using the following command to place an order at a preset price:
OrderSend(Symbol(),OP_SELL,Lots,91.000,1,Ask+StopLoss*Point,Ask-TakeProfit*Point,"sell",0,0,CLR_NONE); RefreshRates();
or
OrderSend(Symbol(),OP_BUY,Lots,91.000,1,Bid-StopLoss*Point,Bid+TakeProfit*Point,"buy",0,0,CLR_NONE); RefreshRates();
firstly is there somehting wrong with this code?
and more importantly how do i make a command so that the buy/sell order that has been placed on the reset price is not sent again until it has reached a stoploss or a takeprofit?
thanks inadvance