Download MetaTrader 5
To add comments, please log in or register
Move from theory to practice. Code Base will help you!
Weixing Meng
201
Weixing Meng 2016.09.11 09:20 
Thanks a lot for help
input double Lots           =0.1;   //at the ea start, enter the parameter 0.1 here

//and then there is a "lot" in the block following, there are two assignments for"lot", then what's the 1st assignment for?
double LotsOptimized()
  {
   double lot=Lots;   // the 1st
   int    orders=OrdersHistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//--- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);  // the 2nd
//--- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Error in history!");
            break;
           }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
            continue;
         //---
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }
Weixing Meng
201
Weixing Meng 2016.09.11 09:28  

It give the "Lots" we entered to lot first, and then give a value to lot again according to account free margin, the previous value is covered by it right? so is that necessary to enter a Lots at the EA start ?

It's from the sample Moving Average EA in MT4 program.

I took course of C programming...and back here again lol.. 

whroeder1
13640
whroeder1 2016.09.11 16:14  
  1. lot is not used between the 1st and 2nd.
       double lot=Lots;   // the 1st
       int    orders=OrdersHistoryTotal();     // history orders total
       int    losses=0;                  // number of losses orders without a break
    //--- select lot size
       lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);  // the 2nd
    So remove it. And then check if Lots is used anywhere.
       int    orders=OrdersHistoryTotal();     // history orders total
       int    losses=0;                  // number of losses orders without a break
    //--- select lot size
       double lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);  // once

  2. Calculate your risk properly.
    • 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, and DeltaPerLot is usually around $10/pip)
    • 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

    /
    To add comments, please log in or register