Your broken code. We can't see your broken code. Fix your broken code.
Your broken code. We can't see your broken code. Fix your broken code.
what do you mean when you say broken code Sir
what do you mean when you say broken code Sir
Perhaps I didn't find your code when you raised your question. If you point out a more specific scenario, highlight one example of an order you see different than what you expect, and share the code related to that scenario, I could help or make a suggestion. The more specific you are in your question, the better chances to attract someone in the community to assist.
Does it do what you want? If not, it is broken.
Do you really expect an answer? There are no mind readers here and our crystal balls are cracked.
Always post all relevant code.
How To Ask Questions The Smart Way. 2004
Be precise and informative about your problem
We can't see your broken code.
Fix your broken code.
void OpenPosition(const ENUM_POSITION_TYPE pos_type) { //--- check Freeze and Stops levels /* Type of order/position | Activation price | Check ------------------------|--------------------|-------------------------------------------- Buy Limit order | Ask | Ask-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy Stop order | Ask | OpenPrice-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Sell Limit order | Bid | OpenPrice-Bid >= SYMBOL_TRADE_FREEZE_LEVEL Sell Stop order | Bid | Bid-OpenPrice >= SYMBOL_TRADE_FREEZE_LEVEL Buy position | Bid | TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL | | Bid-StopLoss >= SYMBOL_TRADE_FREEZE_LEVEL Sell position | Ask | Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL | | StopLoss-Ask >= SYMBOL_TRADE_FREEZE_LEVEL Buying is done at the Ask price | Selling is done at the Bid price ------------------------------------------------|---------------------------------- TakeProfit >= Bid | TakeProfit <= Ask StopLoss <= Bid | StopLoss >= Ask TakeProfit - Bid >= SYMBOL_TRADE_STOPS_LEVEL | Ask - TakeProfit >= SYMBOL_TRADE_STOPS_LEVEL Bid - StopLoss >= SYMBOL_TRADE_STOPS_LEVEL | StopLoss - Ask >= SYMBOL_TRADE_STOPS_LEVEL */ if(!RefreshRates() || !m_symbol.Refresh()) return; //--- FreezeLevel -> for pending order and modification double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point(); if(freeze_level==0.0) freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0; freeze_level*=1.1; //--- StopsLevel -> for TakeProfit and StopLoss double stop_level=m_symbol.StopsLevel()*m_symbol.Point(); if(stop_level==0.0) stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0; stop_level*=1.1; if(freeze_level<=0.0 || stop_level<=0.0) return; //--- if(pos_type==POSITION_TYPE_BUY) { double price=m_symbol.Ask(); double sl=(InpStopLoss==0)?0.0:price-ExtStopLoss; double tp=(InpTakeProfit==0)?0.0:price+ExtTakeProfit; if(((sl!=0 && ExtStopLoss>=stop_level) || sl==0.0) && ((tp!=0 && ExtTakeProfit>=stop_level) || tp==0.0)) { OpenBuy(sl,tp); return; } } if(pos_type==POSITION_TYPE_SELL) { double price=m_symbol.Bid(); double sl=(InpStopLoss==0)?0.0:price+ExtStopLoss; double tp=(InpTakeProfit==0)?0.0:price-ExtTakeProfit; if(((sl!=0 && ExtStopLoss>=stop_level) || sl==0.0) && ((tp!=0 && ExtTakeProfit>=stop_level) || tp==0.0)) { OpenSell(sl,tp); return; } } } //+------------------------------------------------------------------+ //| Open Buy position | //+------------------------------------------------------------------+ void OpenBuy(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double long_lot=InpLots; //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double free_margin_check= m_account.FreeMarginCheck(m_symbol.Name(),ORDER_TYPE_BUY,long_lot,m_symbol.Ask()); double margin_check = m_account.MarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,long_lot,m_symbol.Bid()); if(free_margin_check>margin_check) { if(m_trade.Buy(long_lot,m_symbol.Name(),m_symbol.Ask(),sl,tp)) { if(m_trade.ResultDeal()==0) { if(m_trade.ResultRetcode()==10009) { m_waiting_transaction=true; // "true" -> it's forbidden to trade, we expect a transaction m_waiting_order_ticket=m_trade.ResultOrder(); } Print("#1 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } else { if(m_trade.ResultRetcode()==10009) { m_waiting_transaction=true; // "true" -> it's forbidden to trade, we expect a transaction m_waiting_order_ticket=m_trade.ResultOrder(); } Print("#2 Buy -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print("#3 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print(__FUNCTION__,", ERROR: method CAccountInfo::FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2)); return; } //--- } //+------------------------------------------------------------------+ //| Open Sell position | //+------------------------------------------------------------------+ void OpenSell(double sl,double tp) { sl=m_symbol.NormalizePrice(sl); tp=m_symbol.NormalizePrice(tp); double short_lot=InpLots; //--- check volume before OrderSend to avoid "not enough money" error (CTrade) double free_margin_check= m_account.FreeMarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,short_lot,m_symbol.Bid()); double margin_check = m_account.MarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,short_lot,m_symbol.Bid()); if(free_margin_check>margin_check) { if(m_trade.Sell(short_lot,m_symbol.Name(),m_symbol.Bid(),sl,tp)) { if(m_trade.ResultDeal()==0) { if(m_trade.ResultRetcode()==10009) { m_waiting_transaction=true; // "true" -> it's forbidden to trade, we expect a transaction m_waiting_order_ticket=m_trade.ResultOrder(); } Print("#1 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } else { if(m_trade.ResultRetcode()==10009) { m_waiting_transaction=true; // "true" -> it's forbidden to trade, we expect a transaction m_waiting_order_ticket=m_trade.ResultOrder(); } Print("#2 Sell -> true. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print("#3 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(), ", description of result: ",m_trade.ResultRetcodeDescription()); PrintResultTrade(m_trade,m_symbol); } } else { Print(__FUNCTION__,", ERROR: method CAccountInfo::FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2)); return; } //--- } //+----
On the Strategy Tester
See the image i have attached ......Notice that sometimes it places wide targets (Stoploss and Takeprofit ) as i want it to be but in most of times these targets shrink eventhough they display the same pips amount .I have observed that this condition happens the most on Uptrend and downtrends where the EA opens a lot of trades since the targets is hit easily..This does not happen only to this EA but to many of them with different programming approach on MT4 and MT5 (it happens the most to my Grid EA's) ...I am attaching the EA so that you can also see what might be the problem..
double price=m_symbol.Ask(); double sl=(InpStopLoss==0)?0.0:price-ExtStopLoss; double tp=(InpTakeProfit==0)?0.0:price+ExtTakeProfit;
You buy at the Ask and sell at the Bid. Pending Buy Stop orders become market orders when hit and open at the Ask.
-
Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid / OrderClosePrice reaches it. Using the Ask±n, makes your SL shorter and your TP longer, by the spread. Don't you want the specified amount used in either direction?
-
Your sell order's TP/SL (or Buy Stop's/Buy Limit's entry) will be triggered when the Ask / OrderClosePrice reaches it. To trigger close to a specific Bid price, add the average spread.
MODE_SPREAD (Paul) - MQL4 programming forum - Page 3 #25 -
The charts show Bid prices only. Turn on the Ask line to see how big the spread is (Tools → Options (control+O) → charts → Show ask line.)
Most brokers with variable spreads widen considerably at end of day (5 PM ET) ± 30 minutes. My GBPJPY (OANDA) shows average spread = 26 points, but average maximum spread = 134 (your broker will be similar).
![MQL5 - Language of trade strategies built-in the MetaTrader 5 client terminal](https://c.mql5.com/i/registerlandings/logo-2.png)
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hellow there ??
i have coded the EA That makes targets by pip value, it works perfect on USDCAD on testing but when testing sometimes the targets shrinks even though they display the same amount of points to positions sl and tp when i hover my mouse to them what might be the problem since they cause my EA to open too many trades in one candle the time that happens