Calculation of Stop Level when Broker has floating Stop Level?

 

Hi,

my broker Blueberry Markets has floating StopLevel, so I can't check it.

If I check:       StopLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
the result of this function is every time = 0.

In my indicator I calculate:

input  int                iSLPoints                     = 0;                             // Stop Loss Points
input  int                iTPPoints                     = 0;                             // Take Profit Points

       double             SpreadPrice                   = spread[i] * _Point;

            StopLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
            if(StopLevel == 0)
               StopLevel = MathMax(2 * SpreadPrice, spread[i]);

            Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
            Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

            SLBuyStopLevel    = Ask - StopLevel;
            TPBuyStopLevel    = Ask + StopLevel;

            StopLossBuy[i]    = NormalizeDouble(MathMin(Ask - iSLPoints * _Point, SLBuyStopLevel), _Digits);
            TakeProfitBuy[i]  = NormalizeDouble(MathMax(Ask + iTPPoints * _Point, TPBuyStopLevel), _Digits);

            SLSellStopLevel   = Bid + StopLevel;
            TPSellStopLevel   = Bid - StopLevel;

            StopLossSell[i]   = NormalizeDouble(MathMax(Bid + iSLPoints * _Point, SLSellStopLevel), _Digits);
            TakeProfitSell[i] = NormalizeDouble(MathMin(Bid - iTPPoints * _Point, TPSellStopLevel), _Digits);

Is this okay or wrong? And if wrong, how can I calculate it the right way?

Many thanks in advance

Al

 
Is StopLevel variable maybe of type int?

Don't you get compiler warnings, maybe?


 
The MathMax call you are doing will always give you the value from the spread array, it's useless.

You are mixing integers and doubles here.

That's the source of your issue. Clean it up and make sure you are comparing the correct values with each other. Then you will get correct results.
 
  1. Your ints are zero.

    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

    On some ECN type brokers the value might be zero (the broker doesn't know). Use a minimum of two (2) PIPs.

    The checks a trading robot must pass before publication in the Market - MQL5 Articles (2016)

  2. StopLossBuy[i]    = NormalizeDouble(MathMin(Ask - iSLPoints * _Point,

    You buy at the Ask and sell at the Bid. Pending Buy Stop orders become market orders when hit and open at 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 to 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, but average maximum spread = 134 (your broker will be similar).


Reason: