Asegúrese de tener en cuenta el coste por garrapata.
¡Buenos días y buen humor a todos!
No tengo tiempo para escribir código. Teniendo en cuenta las sugerencias de los miembros del foro, por lo que son un gran GRACIAS, hemos conseguido esta versión de la secuencia de comandos:
//+------------------------------------------------------------------+//| Lot_Size_Depending_On_Risk_And_SL.mq5 |//| Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2023, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"#property script_show_inputsinputuint Risk=6; // Размер риска (> 0, но не более 100 %)inputuint Stop_Loss=1000; // Размер стоп-лосса (> 0, но не более 4294967295)//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double Lot_Size_Depending_On_Risk_And_SL()
{
//--- блок проверки входных параметров на корректностьif(Risk==0 || Risk>100 || Stop_Loss==0)
{
Print("<===== Введены не корректные размеры риска и/или стоп-лосса! =====>");
return(0.0);
}
//--- блок определения размера лотаdouble trading_account_currency=SymbolInfoDouble(_Symbol,SYMBOL_POINT)*
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
double lot=(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/(Stop_Loss*trading_account_currency);
//--- блок проверки размера лота на минимум и максимум от возможногоdouble min_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lot<min_volume)
lot=min_volume;
if(lot>max_volume)
lot=max_volume;
//--- блок расчёта минимального шага изменения объёма необходимого для заключения сделкиdouble step_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(lot/step_volume);
if(MathAbs(ratio*step_volume-lot)>0.0000001)
lot=ratio*step_volume;
return(lot);
}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---Print(DoubleToString(Lot_Size_Depending_On_Risk_And_SL(),2));
}
//+------------------------------------------------------------------+
Extraño. He puesto 5000 barras como máximo en el terminal en "Configuración -> Gráficos". Volví a cargar el terminal, al pasar el cursor sobre la pestaña con el símbolo, muestra que 5000 bares.
Teniendo en cuenta las sugerencias de los miembros del foro, por lo que son un gran GRACIAS, hemos conseguido esta versión del guión:
Saludos, Vladimir.
Me perdí por completo un punto muy importante en el guión. Era necesario normalizar el lote. Aquí está la versión corregida:
//+------------------------------------------------------------------+//| Lot_Size_Depending_On_Risk_And_SL.mq5 |//| Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2023, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"#property script_show_inputsinputuint Risk=6; // Размер риска (> 0, но не более 100 %)inputuint Stop_Loss=1000; // Размер стоп-лосса (> 0, но не более 4294967295)//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double Lot_Size_Depending_On_Risk_And_SL()
{
//--- блок проверки входных параметров на корректностьif(Risk==0 || Risk>100 || Stop_Loss==0)
{
Print("<===== Введены не корректные размеры риска и/или стоп-лосса! =====>");
return(0.0);
}
//--- блок определения размера лотаdouble trading_account_currency=SymbolInfoDouble(_Symbol,SYMBOL_POINT)*
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
double lot=NormalizeDouble((AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/
(Stop_Loss*trading_account_currency),2);
//--- блок проверки размера лота на минимум и максимум от возможногоdouble min_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lot<min_volume)
lot=min_volume;
if(lot>max_volume)
lot=max_volume;
//--- блок расчёта минимального шага изменения объёма необходимого для заключения сделкиdouble step_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(lot/step_volume);
if(MathAbs(ratio*step_volume-lot)>0.0000001)
lot=ratio*step_volume;
return(lot);
}
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---Print(DoubleToString(Lot_Size_Depending_On_Risk_And_SL(),2));
}
//+------------------------------------------------------------------+
Tras finalizar el forward testing delrobot, me he encontrado con un problema persistente: al iniciar un single test con el mejor conjunto de parámetros, el probador de estrategias comienza a ejecutarlo y parece que lo ejecuta hasta el final (a juzgar por el motor de indicadores de progreso), pero luego se cuelga. Metatrader tiene que ser reiniciado y los resultados de la prueba única (y toda la prueba de avance en general) se pierden.
¿Por qué se cuelga el probador y cómo se puede solucionar?
Asegúrese de tener en cuenta el coste por garrapata.
¡Buenos días y buen humor a todos!
No tengo tiempo para escribir código. Teniendo en cuenta las sugerencias de los miembros del foro, por lo que son un gran GRACIAS, hemos conseguido esta versión de la secuencia de comandos:
Saludos, Vladimir.
Buenas tardes
¿Podría sugerirme cómo perfeccionar mi robot para que sólo pueda funcionar en un ordenador?
(para protegerlo de copias)
Saludos, Alexander
¡Buenas tardes!
¿Podría indicarme cómo perfeccionar mi robot para que sólo funcione en un ordenador?
(para protegerlo de ser copiado)
Saludos, Alexander
La variante más sencilla.
Inserte dos líneas de código en la función OnInit.
En lugar del número de cuenta, especifique la cuenta de la persona a la que le da el Asesor Experto, compilar y dar sólo el archivo ex5.
La opción más fácil.
Inserte dos líneas de código en la función OnInit.
En lugar de número de cuenta, especifique la cuenta de la persona a la que está dando el Asesor Experto, compilar y dar sólo el archivo ex5.
¡Muchas gracias!
La opción más fácil.
Inserte dos líneas de código en la función OnInit.
En lugar de número de cuenta, especifique la cuenta de la persona a la que está dando el Asesor Experto, compilar y dar sólo el archivo ex5.
el cliente enciende el terminal y el Asesor Experto se bloquea :-))
porque hay situaciones cuando ACCOUNT_LOGIN=0
el cliente enciende el terminal y el Asesor Experto se bloquea :-)
porque hay situaciones cuando ACCOUNT_LOGIN=0
Si necesita fiable y de alta calidad, es para trabajar por cuenta propia.
Extraño. He puesto 5000 barras como máximo en el terminal en "Configuración -> Gráficos". Volví a cargar el terminal, al pasar el cursor sobre la pestaña con el símbolo, muestra que 5000 bares.
Pero este código
muestra información sobre 6201 bares.
¿Es esto correcto? Yo esperaba también en rates_total para ser 5000.
muestra la información de la barra 6201
¿Qué dice ahí?
Lo más probable es que la historia es más para el probador, por lo que los indicadores se calculan correctamente en ellaTeniendo en cuenta las sugerencias de los miembros del foro, por lo que son un gran GRACIAS, hemos conseguido esta versión del guión:
Saludos, Vladimir.
Me perdí por completo un punto muy importante en el guión. Era necesario normalizar el lote. Aquí está la versión corregida:
Saludos, Vladimir.