OP_BUY/OP_SELL are market orders. You buy at the Ask and sell at the Bid. price is off most of the times.
This would work:
double stoploss = NormalizeDouble(Ask-piploss, 4); double takeprofit = NormalizeDouble(Ask+pipgain, 4); Print("buy price: " + Ask + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit); int ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 10, stoploss, takeprofit, "buy", 16384, 0, clrGreen);
double price = iClose(Symbol(), PERIOD_H1, 1); if (up > down && up-down >= 0.5){ double stoploss = NormalizeDouble(price-piploss, 4); double takeprofit = NormalizeDouble(price+pipgain, 4); //double stoploss = price-piploss*Point; //double takeprofit = price+pipgain*Point; Print("buy price: " + price + ", stoploss: " + stoploss + ", takeprofit: " + takeprofit); int ticket = OrderSend(Symbol(), OP_BUY, 1, price, 10, stoploss, takeprofit, "buy", 16384, 0, clrGreen);
- You can't move stops (or pending prices) closer to the
market than the minimum:
MODE_STOPLEVEL * _Point or SymbolInfoInteger(SYMBOL_TRADE_STOPS_LEVEL).
Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial - You buy at the Ask and sell at the Bid. So for buy orders you pay the spread on open. For sell orders you pay the
spread on close.
- Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid reaches it. Not the Ask. Your SL is shorter by the spread and your TP is longer.
- Your sell order's TP/SL (or Buy Stop's/Buy Limit's entry) will be triggered when the Ask reaches it. To
trigger at 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.)
- You used NormalizeDouble, It's use is usually
wrong, as it is in your case.
- Floating point has infinite number of decimals, it's your not understanding floating point and that some numbers can't be represented
exactly. (like 1/10.)
Double-precision floating-point format - Wikipedia, the free encyclopediaSee also The == operand. - MQL4 programming forum
Print out your values to the precision you want with DoubleToString - Conversion Functions - MQL4 Reference.
- SL/TP (stops) need to be normalized to tick size (not Point.) (On 5Digit Broker Stops are only allowed to be placed on full pip values. How to find out in mql? - MQL4 programming forum) and abide by the limits Requirements and Limitations in Making Trades - Appendixes - MQL4 Tutorial and that requires understanding floating point equality Can price != price ? - MQL4 programming forum
- Open price for pending orders need to be adjusted. On Currencies, Point == TickSize, so you will get the same answer, but it won't work on Metals. So do it right: Trailing Bar Entry EA - MQL4 programming forum or Bid/Ask: (No Need) to use NormalizeDouble in OrderSend - MQL4 programming forum
- Lot size must also be adjusted to a multiple of LotStep and check against min and max. If that is not a power of 1/10 then NormalizeDouble is wrong. Do it right.
- MathRound() and NormalizeDouble() are rounding in a different way. Make it explicit.
MT4:NormalizeDouble - General - MQL5 programming forum
How to Normalize - Expert Advisors and Automated Trading - MQL5 programming forum
- Floating point has infinite number of decimals, it's your not understanding floating point and that some numbers can't be represented
exactly. (like 1/10.)
- Never risk more than a small percentage of your account,
certainly less than 2% per trade, 6% total.
In code (MT4): Risk depends on
your initial stop loss, lot size, and the value of the pair.
- You place the stop where it needs to be - where the reason for the trade is no longer valid. E.g. trading a support bounce the stop goes
below the support.
- AccountBalance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot + CommissionPerLot) (Note OOP-OSL includes the spread, and DeltaPerLot is usually around $10/pip but it takes account of the exchange rates of the pair vs. your account currency.)
- Do NOT use TickValue by itself - DeltaPerLot and
verify that
MODE_TICKVALUE is returning a value in your deposit currency, as promised by the documentation, or whether it is
returning a value in the instrument's base currency.
MODE_TICKVALUE is not reliable on non-fx instruments with many brokers. - You must normalize lots properly and check against min and max.
- You must also check FreeMargin to avoid stop out
- You place the stop where it needs to be - where the reason for the trade is no longer valid. E.g. trading a support bounce the stop goes
below the support.
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
I try to back test my expert advisor, but it keep sending error 130 / 138, very rarely it goes thru. I read somewhere that I can't use predetermined variable for backtest, I already try to change all the predetermined variable. Is something else
piploss = pipgain = 0.03