chrisbenjy Posted June 15, 2010 Report Posted June 15, 2010 I started learning MQL last week. Because I was already familiar with Java and the programming concepts, it did not take long to learn MQL up to the standard that I could create an Expert Advisor. However, I have a problem executing pending orders on my EA: I get the error code #130, which means invalid stops. I researched and found that it could be caused from: a stop loss level an invalid distance from the order price; or an unnormalized variable set as a parameter. I looked over my EA and unless I have made an error which I cannot spot then the stop loss is greater than the required distance. Also, I have tried in many different ways to use the normalize function, which unless I'm using it incorrectly, does not seem to be correcting the error. Therefore, I have hit a wall and cannot see how to fix the problem. Below is the part of the EA code that is generating the error. void OpenTradeConditions() { //Support and resistance values from Dyn_S_R indicator double R0=iCustom(NULL, 0, "Dyn_s_r",1,0); //Resistance (DynR) Current Bar double R1=iCustom(NULL, 0, "Dyn_s_r",1,1); //Resistance (DynR) Previous Bar double S0=iCustom(NULL, 0, "Dyn_s_r",2,0); //Support (DynS) Current Bar double S1=iCustom(NULL, 0, "Dyn_s_r",2,1); //Support (DynS) Previous Bar //Incase cannot place pending order because its not far enough away from current price double MinimumPendingDistance = 3*PipValue; //Open trades ClosePendingOrdersWhenSRChanges(); CheckOpenTrades(); if(R0==R1 && OpenBuyOrders==false) { if(R0-MinimumPendingDistance<0) { //Place a buy order int ticket = 0; ticket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-100*Point,0,"2 Percent Buy",0,0,Green); if(ticket<0) { Print("OrderB failed with error #",GetLastError()); return(0); } } else { //Place pending buy stop order double BuyStopPrice = R0 + PipValue; double StopLoss1 = BuyStopPrice-(100*Point); int ticket2 = 0; double NewBS = NormalizeDouble(BuyStopPrice,5); double NewSL = NormalizeDouble(StopLoss1,5); double NewLS = NormalizeDouble(LotSize,1); ticket2=OrderSend(Symbol(),OP_BUYSTOP,NewLS,NewBS,3,NewSL,NULL,"2 Percent BuyStop",NULL,NULL,Lime); if(ticket2<0) { Print("OrderBS failed with error #",GetLastError()); return(0); } } } This is the specific section of the above method/function that is the problem: else { //Place pending buy stop order double BuyStopPrice = R0 + PipValue; double StopLoss1 = BuyStopPrice-(100*Point); int ticket2 = 0; double NewBS = NormalizeDouble(BuyStopPrice,5); double NewSL = NormalizeDouble(StopLoss1,5); double NewLS = NormalizeDouble(LotSize,1); ticket2=OrderSend(Symbol(),OP_BUYSTOP,NewLS,NewBS,3,NewSL,NULL,"2 Percent BuyStop",NULL,NULL,Lime); if(ticket2<0) { Print("OrderBS failed with error #",GetLastError()); return(0); } } If anyone could help me understand why the error is occurring and how to fix it, I would appreciate it. (P.S. The EA was programmed specifically for a 5 digit broker, so the stop loss level or 100*Point is actually 10 normal pips) Quote
chrisbenjy Posted June 15, 2010 Author Report Posted June 15, 2010 (edited) Update: I have fixed this first problem I had. If anyone has a similar problem, the solution I had is that I had selected the wrong IndexBuffer for my custom indicator value, so my pending order position was invalid. I now have another problem, which is that the EA places several buy stop/sell stop orders, but I only want it to place one of each. I think I will be able to solve this problem using an if statement. I will write my suggested algorithm in the code box below using non language dependent semi-pseudo-code in order to help anyone with a similar problem. I will place this in my Start function if(no. of open buy stop orders==0 && no. of open buy orders ==0) { OpenTradeConditionsBuy(); //This is the name of my function which creates the order } if(no. of open sell stop orders==0 && no. of open sell orders==0) { OpenTradeConditionsSell(); } Update: I would appreciate if anyone could tell me how to write this in MQL, thankyou if(no. of open buy stop orders==0 && no. of open buy orders ==0) Edited June 15, 2010 by chrisbenjy Quote
testttt Posted June 16, 2010 Report Posted June 16, 2010 bool Have.Open.Buy.Orders() { bool result = false; if(OrdersTotal()>0){ for(int i=OrdersTotal()-1;i>=0;i--){ OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderType() == OP_BUY && OrderMagicNumber() == magic){ result = true; break; } } } return (result); } chrisbenjy 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.