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
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
> 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.
... todavía tienes que usar el hombro ...
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 ...
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
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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 %!