Cálculo correcto del lote a partir del % de la fianza

 

Hola a todos,

Roger, uno de los programadores, me ha abierto los ojos recientemente al hecho de que he escrito mi función de cálculo de lotes por %.


mi función es la siguiente:


double GetSizeLot() //Функция возвращает значение лотов,
{ //если включен ММ то значение лотов,
double lots,MD,RM,MinLots,LotSize; int lotsdigit; //вычисляется путем:Свободные средства*Risk
LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); //поделить на стоимость одного лота
MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); //А также вычисляет колличество знаков
if(MD==0.01) lotsdigit=2; //присваивает значения максимума лотов
if(MD==0.1) lotsdigit=1;
if(MM>1) {lots=NormalizeDouble((AccountFreeMargin()*MM/LotSize),lotsdigit);Lot=lots;}
else lots=Lot;
MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
if(lots < MinLots) lots = MinLots;
if(lots > MaxLot) lots = MaxLot;
return(NormalizeDouble(lots,2));
}



Debería usar el apalancamiento y el precio actual,


Intenté comprobarlo con Asesores Expertos, pero todos tenían la misma función,


¿dónde está la verdad?


¡Me gustaría pedirles la función correcta para calcular el lote en %!

 
Normalmente el problema es que hay una confusión entre la carga del depósito y la cantidad de riesgo por posición. Es aconsejable comprobar ambas cosas. Lo que cuenta en el código anterior es la carga, o más bien el tamaño del lote basado en la carga.
 
Este es mucho mejor, no hay cálculo de hombros, es una forma diferente de hacerlo. Me gusta mucho.

double LotSize( int type, double LotRisk, int SL  )
{   //    int znakov_lot=0;
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        double  lot             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*LotRisk/100.0;
        dollarsPerPip = lot/SL;
     //   if (lot_min<2) {znakov_lot=0;  if (lot_min<0.2) {znakov_lot=1;  if (lot_min<0.02) {znakov_lot=3;  if (lot_min<0.002) {znakov_lot=4; }}}}      
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }

        return( lot );
}
El cálculo del lote en el % del depósito para una distancia dada de pips. es decir, "para drenar el 20% del depósito en 10 pips = usted necesita ?lote" función esta pregunta y cuenta
 
wenay:
Este es mucho mejor, aquí no hay cálculo de apalancamiento. Me gusta mucho el cálculo del lote para el % del depósito para una distancia determinada de pips. es decir, "para drenar el 20% del depósito en 10 pips = necesitas ?lote" esta función pregunta y calcula

En mi opinión, el apalancamiento debería estar presente en los cálculos de los lotes.

1) Si no se tiene en cuenta el apalancamiento, significa que la ST no es capaz de generar grandes beneficios.

2) Si el depósito ya es lo suficientemente grande, el apalancamiento se reduce (en mi empresa de corretaje automáticamente), por lo que aparece el error "Volumen incorrecto".

Es una palanca, no es de goma.

P.D. esto es mi IMHO

 
rensbit:

> No hay cálculo de apalancamiento

En mi opinión, el apalancamiento debería incluirse en el cálculo del lote.

1) Si no se incluye el apalancamiento, significa que la ST no es capaz de generar grandes beneficios.

2) Si el depósito ya es lo suficientemente grande, DT disminuye el apalancamiento (en mi empresa de corretaje automáticamente), por lo que hay un error "Volumen incorrecto".


P.D. es mi IMHO


En lugar de apalancamiento, fíjate en el coste de una garrapata. Si tienes 1k1 de apalancamiento - un tick no es caro (digamos que hay 1 céntimo), si 1k 500 - caro (5 libras). Es decir, el sistema funciona bien con cualquier apalancamiento, aquí hay otra forma de cálculo, me parece más óptima y correcta.

su empresa de corretaje cambiará automáticamente a un apalancamiento diferente para usted.

 
Vladon:
... todavía tienes que usar el hombro ...
Si el riesgo se establece como un porcentaje, entonces:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

¡¡¡¡Roger fue de gran ayuda en este asunto, por lo que merece un agradecimiento especial a !!!!


Lo he retocado ligeramente, para que la moneda de la cuenta pueda ser determinada por mí mismo


int Percent=10;
string Valdepo=AccountCurrency();

int start()
{
double Lot,MinLots,MaxLots;
int lotdig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)lotdig=2; else lotdig=1;
if(Valdepo=="USD")
   {
   if(StringSubstr(Symbol(),0,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else if(StringSubstr(Symbol(),3,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else 
      {
      double pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
if(Valdepo=="EUR")
   {
   if(StringSubstr(Symbol(),0,3)=="EUR")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else
      {
      pr=MarketInfo("EUR"+StringSubstr(Symbol(),0,3),MODE_BID);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()*pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
MinLots=MarketInfo(Symbol(),MODE_MINLOT);
MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
if(Lot < MinLots) Lot = MinLots;
if(Lot > MaxLots) Lot = MaxLots;
return(0);
}
 

¿No hay otras monedas en la cuenta? ;-)

¿Y no se tienen en cuenta los riesgos? Esta opción también cuenta sólo con la carga del depósito, y lo que serán los riesgos (en % del depósito) en la reducción - se ignora. Como si al abrir, siempre se adivinara la dirección desde el primer momento y hasta el último.

 

función inútil, con errores además...

if(Lot < MinLots) Lot = MinLots;

¿Qué es esto? ¿No hay suficiente dinero aún abierto?

si tenemos 100 libras, 100 de apalancamiento y 100% de riesgo, es decir, abrimos de par en par, ¿qué obtenemos?

if(StringSubstr(Symbol(),0,3)=="USD")
Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);

lote = 100 * 100 * 100 / 100 / 100 = 100

No he mezclado nada ... por 100 libras es poco probable que un montón de 100 puede abrir en un par ...

 
keekkenen:

Si tenemos 100 libras, 100 de apalancamiento y 100% de riesgo, es decir, abrimos a tope, ¿qué obtenemos?

lote = 100 * 100 * 100 / 100 / 100 = 100

no he confundido nada ... por 100 libras es poco probable que un lote de 100 pueda abrir en un par ...



Por supuesto, mezclado, el real es 100*100*100/100/100000=0,1
 
ah, lo siento, era yo el que miraba el oro... ¿entonces no se puede comerciar con el oro ahora usando su fórmula?
Razón de la queja: