Ask and Bid price

 

Hello, i want to write code to solve problem: Input the price and order buy or sell it. But it wrong because some case (Most of buy). And i think add bid and ask price.

So i write the code:

First, this is code not add bid-ask price:

//Val == 1 is sell, val==2 is buy
//And sl is in input.
if(val == 1) //SELL
{
 price = SymbolInfoDouble(symbol,SYMBOL_BID);
 nPriceRangePoints = (int) round((sl - price));
 //volume = get_lot_from_money_point(symbol, AccountEquity(), risk1, nPriceRangePoints);
 volume = 0.01;
}
else //BUY
{
 price = SymbolInfoDouble(symbol,SYMBOL_ASK);
 nPriceRangePoints = (int) round((price - sl));
 //volume = get_lot_from_money_point(symbol, AccountEquity(), risk1, nPriceRangePoints);
 volume = 0.01;
}
int result1 = OrderSend(symbol, val, volume, price, 20, sl, 0, cmt + "=" + nPriceRangePoints + "=" + price + "=" + sl, 0,0, clrNONE);

This code is true if case is sell, but buy is not.

Second code is add bid-ask price:

//Val == 1 is sell, val==2 is buy
if(val == 1) //SELL
{
 price = SymbolInfoDouble(symbol,SYMBOL_BID);
 nPriceRangePoints = (int) round((sl - price));
 if(sl > SymbolInfoDouble(symbol,SYMBOL_ASK) + minstoplevel * MarketInfo(symbol,MODE_POINT))
    sl = SymbolInfoDouble(symbol,SYMBOL_ASK) + minstoplevel * MarketInfo(symbol,MODE_POINT);
 //volume = get_lot_from_money_point(symbol, AccountEquity(), risk1, nPriceRangePoints);
 volume = 0.01;
}
else //BUY
{
 price = SymbolInfoDouble(symbol,SYMBOL_ASK);
 nPriceRangePoints = (int) round((price - sl));
 if(sl < SymbolInfoDouble(symbol,SYMBOL_BID) - minstoplevel * MarketInfo(symbol,MODE_POINT))
    sl = SymbolInfoDouble(symbol,SYMBOL_BID) - minstoplevel * MarketInfo(symbol,MODE_POINT);
 //volume = get_lot_from_money_point(symbol, AccountEquity(), risk1, nPriceRangePoints);
 volume = 0.01;
}
int result1 = OrderSend(symbol, val, volume, price, 20, sl, 0, cmt + "=" + nPriceRangePoints + "=" + price + "=" + sl, 0,0, clrNONE);

This code wrong some case buy, some case sell, but most of buy

So

1) Where is wrong place in your code?

2) Anyone has solution fix it?

Thank you very much?

 
  1. int result1 = OrderSend(symbol, val, volume, price, 20, sl, 0, cmt + "=" + nPriceRangePoints + "=" + price + "=" + sl, 0,0, clrNONE);

    Why did you post your MT4 question in the MT5 General section instead of the MQL4 section, (bottom of the Root page)?
              General rules and best pratices of the Forum. - General - MQL5 programming forum? (2017)
    Next time, post in the correct place. The moderators will likely move this thread there soon.

  2.  price = SymbolInfoDouble(symbol,SYMBOL_ASK);
     nPriceRangePoints = (int) round((price - sl));

    That's the difference, not the difference in points.

  3. You buy at the Ask and sell at the Bid. Pending Buy Stop orders become market orders when hit by the Ask.

    1. Your buy order's TP/SL (or Sell Stop's/Sell Limit's entry) are triggered when the Bid / OrderClosePrice reaches it. Using Ask±n, makes your SL shorter and your TP longer, by the spread. Don't you want the specified amount used in either direction?

    2. 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 at a specific Bid price, add the average spread.
                MODE_SPREAD (Paul) - MQL4 programming forum - Page 3 #25

    3. 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 shows average spread = 26 points, average maximum spread = 134.
      My EURCHF shows average spread = 18 points, average maximum spread = 106.
      (your broker will be similar).
                Is it reasonable to have such a huge spreads (20 PIP spreads) in EURCHF? - General - MQL5 programming forum (2022)

Reason: