Te puedo pasar mi script pero te calcula sobre un porcentaje del balance. Lo puedes modificar si quieres para que te calcule sobre una cantidad.
Tiene otras opciones como el calculo automatico de la distancia del stop según el atr. También tengo los script para buy y sell con los parametros calculados aquí. Si te interesa me lo dices.
Código: Seleccionar todo
//+------------------------------------------------------------------+
//| ParametrosSet.mq4 |
//| Copyright 2020, Sintesis |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Sintesis"
#property version "4.00"
//--- strict compilation mode
#property strict
//--- show input parameters
#property show_inputs
//--- input parameters
extern double PorcRiesgo = 2; // Porcentaje Riesgo. "Si es cero, nº de lotes mínimo."
extern double Lotes = 0; // Nº Lotes. "Si Lotes== 0.0, entonces cálculo de lotes automatico."
extern bool distSL_Auto = true; // distSL_Auto. "Calcula la distancia SL automaticamente."
extern int distSL = 0; // Distancia SL. "Manual cuando distSL_Auto==false."
extern int distTP = 0; // Distancia TP.
extern double RatioTP = 1; // Si RatioTP =0 se toma Distancia TP.
extern double Balance = 0; // Balance. "Si Balance==0, Balance= Balance real de la cuenta."
extern double multiplicador_atr = 3; // Multiplicador ATR."Para calcular distancia del stop."
extern int n_atr = 10; // Numero velas ATR.
extern ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;// TimeFrame para el calculo del riesgo.
extern int GV_Deslizamiento = 10; // Maximo deslizaminto;
extern int maximo_numero_lotes = 10; // Maximo nº de lotes;
double pipMultiplier,GV_DistSL,GV_DistTP,GV_Lotes,GV_ValorDelTick;
double StopRiesgo,ValorATR;
int nDecimales;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(){
//if (MuestraAlerta)Alert("");
nDecimales=1;
double x=MarketInfo(Symbol(),MODE_LOTSTEP)*10;
while(x<1)
{
x*=10; nDecimales+=1;
}
double digit = MarketInfo(Symbol(),MODE_DIGITS);
//digit=_Digits;
if(digit==2 || digit==4 || digit==1) pipMultiplier = 1;
if(digit==3 || digit==5) pipMultiplier = 10;
if(digit==6) pipMultiplier = 100;
ValorATR=MathFloor (iATR(NULL,TimeFrame,n_atr,1)/Point);
StopRiesgo=NormalizeDouble(multiplicador_atr*ValorATR,0);
if (distSL_Auto) GV_DistSL=StopRiesgo;else GV_DistSL=distSL;
GV_DistTP=distTP;
if (RatioTP!=0 && GV_DistSL!=0)GV_DistTP=GV_DistSL*RatioTP;
CalculoNumeroLotes();
//--- Asignar a Variables Globales
GlobalVariableSet("Ordenes_Lotes",GV_Lotes);
GlobalVariableSet("Ordenes_DistanciaSL",GV_DistSL);
GlobalVariableSet("Ordenes_DistanciaTP",GV_DistTP);
GlobalVariableSet("Ordenes_Deslizamiento",GV_Deslizamiento);
GlobalVariableSet("Valor_Tick",GV_ValorDelTick);
//GlobalVariableSet("Ordenes_PorcRiego",GV_PorcRiesgo);
//GlobalVariableSet("Ordenes_Balance",GV_Balance);
}
//+------------------------------------------------------------------+
void CalculoNumeroLotes()
{
Balance=MathRound(Balance);
if (Balance==0.0)Balance=MathRound(AccountBalance());
//if (Equidad=0.0)Equidad= MathRound(AccountEquity());
// Calculo con Fraccion Fija
GV_ValorDelTick =MarketInfo(Symbol(),MODE_TICKVALUE);
if (Lotes==0.0)GV_Lotes=NormalizeDouble(Balance*PorcRiesgo/100/StopRiesgo/ GV_ValorDelTick,nDecimales);
else GV_Lotes= Lotes;
GV_Lotes= MathRound (GV_Lotes/MarketInfo(Symbol(),MODE_LOTSTEP));
GV_Lotes= GV_Lotes*MarketInfo(Symbol(),MODE_LOTSTEP);
if (GV_Lotes<MarketInfo(Symbol(),MODE_MINLOT)) // Mínimo Nº de Lotes
{
//Alert(Symbol(),"-"+TFtoString(_Period),", Lotes= Mínimo nº de lotes= ",MarketInfo(Symbol(),MODE_MINLOT));
MessageBox("Lotes= "+MarketInfo(Symbol(),MODE_MINLOT)+" (mínimo nº de lotes) \r\r"+ "Dist SL= "+GV_DistSL+
" pips. Dist TP= "+GV_DistTP+" pips.",Symbol()+"-"+TFtoString(_Period) );
GV_Lotes=MarketInfo(Symbol(),MODE_MINLOT);return;
}
if(GV_Lotes>maximo_numero_lotes) // Máximo Nº de Lotes
{
//Alert(Symbol(),"-"+TFtoString(_Period), " Lotes= Máximo nº de lotes= ", maximo_numero_lotes);
MessageBox("Lotes= "+maximo_numero_lotes+" (máximo nº de lotes)\r\r Dist SL= "+GV_DistSL+
" pips. Dist TP= "+GV_DistTP+" pips.",Symbol()+"-"+TFtoString(_Period) );
GV_Lotes=maximo_numero_lotes;return;
}
if (Lotes==0.0) MessageBox("Lotes= "+ GV_Lotes+", Riesgo="+PorcRiesgo+"% sobre "+Balance+" €."+"\r\r"+
"Dist SL= "+GV_DistSL+ " pips. Dist TP= "+GV_DistTP+" pips.",Symbol()+"-"+TFtoString(_Period) );
else MessageBox(Symbol()+"-"+TFtoString(_Period)+": Nº Lotes discrecional="+ GV_Lotes);
}
//+------------------------------------------------------------------+
string TFtoString (int TF) {
string TFS = "";
switch(TF) {
case 1: TFS = "M1"; break;
case 5: TFS = "M5"; break;
case 15: TFS = "M15"; break;
case 30: TFS = "M30"; break;
case 60: TFS = "H1"; break;
case 240: TFS = "H4"; break;
case 1440: TFS = "D1"; break;
case 10080: TFS = "W1"; break;
case 43200: TFS = "MN1"; break;
}
return(TFS);
}
El fin NO justifica los medios.