Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1476

 
Alexey Viktorov #:

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_inputs
input uint Risk=6;         // Размер риска (> 0, но не более 100 %)
input uint 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                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk_And_SL(),2));
  }
//+------------------------------------------------------------------+

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

Документация по MQL5: Операции с массивами / ArraySetAsSeries
Документация по MQL5: Операции с массивами / ArraySetAsSeries
  • www.mql5.com
ArraySetAsSeries - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
klycko #:

¡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

void OnInit()
  {
   if(AccountInfoInteger(ACCOUNT_LOGIN) != Номер счёта)
      return INIT_FAILED;
   return INIT_SUCCEEDED;
  }

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.

 
Aleksandr Slavskii #:

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!

 
Aleksandr Slavskii #:

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

 
Maxim Kuznetsov #:

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

int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[],
                const double &open[], const double &high[], const double &low[], const double &close[],
                const long &tick_volume[], const long &volume[], const int &spread[])
{

  Print("rates_total=", rates_total);
  return rates_total;
}


muestra información sobre 6201 bares.

¿Es esto correcto? Yo esperaba también en rates_total para ser 5000.

 
Vasiliy Pushkaryov #:

muestra la información de la barra 6201

¿Qué dice ahí?

printf((string)TerminalInfoInteger(TERMINAL_MAXBARS));
Lo más probable es que la historia es más para el probador, por lo que los indicadores se calculan correctamente en ella
 
MrBrooklin #:

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_inputs
input uint Risk=6;         // Размер риска (> 0, но не более 100 %)
input uint 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                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk_And_SL(),2));
  }
//+------------------------------------------------------------------+

Saludos, Vladimir.

 
¡Buenas tardes!
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?
Saludos, Alexander