toleratedLossPerPip = toleratedTotalLoss / (StopLoss / 10); // Amount of money I tolerate to loose/gain per pip lotsToBuy = toleratedLossPerPip / (100000 * 0.0001); // Optimal number of lot's I could buy
Don't hard code numbers. The code assumes you are trading EURUSD with standard lots account using USD as a base currency. Don't assume.- 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.
- Account Balance * percent/100 = RISK = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerlot + CommissionPerLot) (Note OOP-OSL includes the SPREAD)
- Do NOT use TickValue by itself - DeltaPerlot
- You must normalize lots properly and check against min and max.
- You must also check FreeMargin to avoid stop out
Thank you for your help! But as I you can see in my code - I acutally checked min/max and FreeMargin. I think I'm also normalzing the lots with MathFloor(lotsToBuy / LotStep) * Lotstep don't I? And could you please explain your lines of code as I did with my code above? Like |OrderOpenPrice - OrderStopLoss| * DeltaPerlot + CommisionPerLot). And where do I use TickValue
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
This is the code I wrote (I would appreciate you to review this code and wrote a lot of explaining comment):
const extern int StopLoss = 60; // In Minipips (5 Digits for GKFX)
const extern double Risk = 0.015; // 3% of AccountBalance
const extern double MaxLot = 50; // Only allow to buy up to 50 lots (GKFX Limit)
int OnInit()
{
// Broker : GKFX (=> 5 Digits)
// Symbol : EURUSD
// Account-Currency : EUR
//
// One standard lot is the equivalent to 100,000 units of the
// base currency. => 100,000 EUR (I can assume this, right)
//
// When buying one lot. I'm essentially buying USD worth
// 100,000 EUR
//
// StopLoss : 40 (5 Digits => 40 = 40 * 1/10 Pips = 4 Pips
// Risk : 0.03 (3% of current account balance)
//
// Let's pretend I have an 10,000 EUR Account.
// With Risk = 0.03 I tolerate 10,000 * 0.03 = 30 EUR Loss.
//
//
// double toleratedLoss = AccountBalance * Risk; // 30 EUR
//
// Okay, now I want to find the number of lots I need to buy,
// so that the cost of StopLoss/10 (5 Digits) (= 4) pips matches
// the toleratedLoss.
//
// toleratedLoss / (StopLoss/10) will give me the amount of
// money I'm willing to loose per pip.
//
// 30 EUR / 3 pips = 10 EUR per pip
//
// double toleratedPricePerPip = toleratedLoss / (StopLoss / 10); // 10 EUR per pip
//
// As said before one lot is equivalent to 100,000 units of the
// base currency. Since one pip is equivalent to a difference of
// 0.0001 in the currency pair. When buying 1 lot = 100,000 EUR
// a change of one pip will result in 100,000 * 0.0001 = 10 EUR
// gain/loss. I want to find the number of lots I need to buy so that
// a change of one pip will result in toleratedPricePerPip gain/loss.
//
// numberOfLots * 100.000 * 0.0001 = toleratedPricePerPip.
// numberOfLots * 10 = toleratedPricePerPip.
// numberOfLots = toleratedPricePerPip / 10.
//
// double numberOfLots = toleratedPricePerPip / 10; // 1 lot
double MinLot = MarketInfo(Symbol(), MODE_MINLOT); // Minimum volume
double LotStep = MarketInfo(Symbol(), MODE_LOTSTEP); // Step to between valid amount of ltos
double PricePerLot = MarketInfo(Symbol(), MODE_MARGINREQUIRED); // Price of one lot
double FreeMargin = AccountFreeMargin(); // Free Margin
double toleratedTotalLoss, toleratedLossPerPip, lotsToBuy, validLotsToBuy;
toleratedTotalLoss = AccountBalance() * Risk; // Total amount of money I tolerate to loose
toleratedLossPerPip = toleratedTotalLoss / (StopLoss / 10); // Amount of money I tolerate to loose/gain per pip
lotsToBuy = toleratedLossPerPip / (100000 * 0.0001); // Optimal number of lot's I could buy
validLotsToBuy = MathRound(lotsToBuy / MinLot) * MinLot; // Valid number of lot's I could buy
// Do I even have enough money to buy validLotsToBuy lots?
if (FreeMargin < validLotsToBuy * validLotsToBuy) {
lotsToBuy = FreeMargin / PricePerLot;
validLotsToBuy = MathFloor(lotsToBuy / LotStep) * LotStep;
}
if (validLotsToBuy > MaxLot) {
validLotsToBuy = MaxLot;
}
if (validLotsToBuy < MinLot) {
Alert("Not enough Balance/FreeMargin to buy ", MinLot, " lots ...");
return(INIT_FAILED);
}
Alert("You should buy: ", validLotsToBuy, " lots ...");
return(INIT_SUCCEEDED);
}
Thank you really much for the help!!
FirstTimeTrader