SendOrder calculation of stopLoss and takeProfit

 

Hi

I tried many ways to calculate the stopLoss and takeProfit but could not get it write.

say I want the stop loss to be 40 pips away and the take profit to be 20 pips away.

the below code failed and many variation could not fix it either, I need to consider the forex pairs when jpy is present as well. Not sure how to do it. Please help, Thanks.


  string result[];
  uint k = StringSplit(line.description, StringGetCharacter(" ", 0), result);   
  /* description example: "ea openLong 0.01 20 40" which executes to buy lots=0.01, tp=20, sl=40
    
  */
  if(k < 5 ) return;
int symbolFactor(){
  return StringFind(Symbol(), "JPY", 0) >= 0 ? 100 : 1000;
}

  int factore =symbolFactor();
  double lots = StrToDouble(result[2]);

  int takeProfitPoints = StringToDouble(result[3]) / factore;
  int stopLossPoints = StringToDouble(result[4]) / factore;
  double takeProfitPrice, stopLossPrice;
  int ticket = -1;

  if(result[1] == "openLong"){
    takeProfitPrice = NormalizeDouble(Ask + takeProfitPoints, Digits);
    stopLossPrice = NormalizeDouble(Ask - stopLossPoints, Digits);
    // ticket = OrderSend(Symbol() ,OP_BUY, lots, Ask, 2, stopLossPrice, takeProfitPrice);
  } else if (result[1] == "openShort"){
    takeProfitPrice = NormalizeDouble(Bid - takeProfitPoints, Digits);
    stopLossPrice = NormalizeDouble(Ask + stopLossPoints, Digits);
    // ticket =  OrderSend(Symbol() ,OP_SELL, lots, Bid, 2, stopLossPrice, takeProfitPrice);
  }
 
  1. samjesse: say I want the stop loss to be 40 pips away and the take profit to be 20 pips away.
    Risk depends on your initial stop loss, lot size, and the value of the pair.
    1. In code (MT4):
      1. 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.
      2. Account Balance * 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.)
      3. 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.
      4. You must normalize lots properly and check against min and max.
      5. You must also check FreeMargin to avoid stop out
      Most pairs are worth about $10 per PIP. A $5 risk with a (very small) 5 PIP SL is $5/$10/5=0.1 Lots maximum.

    2. Use a GUI EA like mine (for MT4): Indicators: 'Money Manager Graphic Tool' indicator by 'takycard' Forum - Page 6

  2. if(result[1] == "openLong"){
        takeProfitPrice = NormalizeDouble(Ask + takeProfitPoints, Digits);
        stopLossPrice = NormalizeDouble(Ask - stopLossPoints, Digits);
    :
    } else if (result[1] == "openShort"){
        takeProfitPrice = NormalizeDouble(Bid - takeProfitPoints, Digits);
        stopLossPrice = NormalizeDouble(Ask + stopLossPoints, Digits);
    You buy at the Ask and sell at the Bid.
    • Your buy order's TP/SL are triggered when the Bid reaches it. Not the Ask.
    • Your sell order's TP/SL will be triggered when the Ask reaches it. To trigger at a specific Bid price, add the average spread.
                MODE_SPREAD (Paul) - MQL4 and MetaTrader 4 - MQL4 programming forum - Page 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.)

Reason: