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

 

¡Buenos días y buen humor a todos!

Ayer hubo una confusión con mi Expert Advisor. Hasta ayer había estado probando durante casi un mes sin ningún problema, pero cerca de la tarde de repente el cálculo del riesgo en función del margen libre dejó de funcionar correctamente y el EA comenzó a abrir posiciones con el lote máximo posible. Decidí escribir una función de comprobación que permitiera operar bajo ciertas condiciones para excluir tales "regalos". La escribí y la añadí al código del EA. No sé si esta función ayudó o sucedió algo más mientras la escribía, pero el trabajo del Asesor Experto se ha normalizado.

¡Petición a la respetada comunidad!

Por favor, miren el código y aconsejen qué más se debe añadir a la función para excluir tales "regalos" para el comercio en una cuenta real?

bool Check_Trading()
  {
   bool canTrade=false;
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения торговли для текущего счёта!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения торговли для эксперта!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Print("Ошибка при проверке режима расчёта маржи для счёта с режимом хэдж!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoDouble(ACCOUNT_MARGIN_FREE))
     {
      Print("Ошибка при получении размера свободных средств для открытия позиции!", GetLastError());
      canTrade=false;
     }
   if(!SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE)==SYMBOL_CALC_MODE_FOREX)
     {
      Print("Ошибка способа расчета прибыли и маржи для рынка Форекс по текущему символу!", GetLastError());
      canTrade=false;
     }
   if(!SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_HEDGED))
     {
      Print("Ошибка расчета маржи для позиций по текущему символу для счёта с режимом хэдж!", GetLastError());
      canTrade=false;
     }
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизации данных по текущему символу!", GetLastError());
      canTrade=false;
     }
   canTrade=true;
   return(canTrade);
  }

Saludos, Vladimir.

 

No puedo entender como y que necesita, toma y lee un archivo de la carpeta Tester\Agent... en TERMINAL_DATA_PATH, pero yo necesito leerlo en TERMINAL_PATH y no puedo usar ruta absoluta.


 
mwwm #:

No puedo entender como y que necesita, toma y lee un archivo de la carpeta Tester\Agent... en TERMINAL_DATA_PATH, pero yo necesito leerlo en TERMINAL_PATH y no puedo usar ruta absoluta.

Si necesita trabajar con ficheros durante las pruebas, es más conveniente utilizar para ello una carpeta común a todos los terminales y agentes. Para ello basta con añadir el flag FILE_COMMON a las operaciones de apertura de ficheros.

Se puede acceder a esta carpeta para colocar en ella los ficheros necesarios desde el menú principal del MetaEditor: ArchivoAbrir carpeta de datos común.

 
Yuriy Bykov #:

Si es necesario trabajar con ficheros durante las pruebas, es más conveniente utilizar para ello una carpeta común a todos los terminales y agentes. Para ello basta con añadir la bandera FILE_COMMON en las operaciones de apertura de ficheros.

Se puede acceder a esta carpeta para colocar en ella los archivos necesarios desde el menú principal del MetaEditor: ArchivoAbrir carpeta de datos común.

Gracias)

 
FYFRX #:

Eres un hombre interesante.

Así que tiene suficiente entusiasmo para tal indicador) https://c.mql5.com/1/237/vgif-ru-19978.gif

Y usted no quiere insertar dos líneas de código en RSI por el bien de la práctica de la escritura, por aburrimiento o por algunas otras razones...

Esta no es mi creación. ¿Recuerdas la Monna Lisa de la película "Romance de oficina"?

En cuanto a las dos líneas, ya te lo he explicado.

Foro sobre trading, sistemas automatizados de trading y prueba de estrategias de trading.

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2023.01.30 07:17 AM

Esta es la razón por la que muchas personas comienzan a aprender un lenguaje de programación. Y así resulta que para que puedas probar tu idea ilusoria alguien se sentará a escribir. Por supuesto, usted puede encontrar un entusiasta de este tipo que puede escribir por el bien de la práctica de la escritura, por aburrimiento o por alguna otra razón ... Pero si usted está de acuerdo y obtener a través de la estrategia de LS, al darse cuenta de que no va a funcionar a negarse a escribir, entonces usted tendrá la sospecha de que fueron engañados, tienen una estrategia rentable y en los arbustos. ¿Y quién necesita tal actitud? Si publica una estrategia y a alguien le interesa, tendrá suerte. Pero por tu dinero, cualquier capricho...

Escribe estos deseos en cualquier tema sobre escritura de código libre y seguro que alguien responde. Probablemente yo también. aunque improbable, no estaré aquí durante 2-3 días...
 
MrBrooklin permitiera operar bajo ciertas condiciones para excluir tales "regalos". La escribí y la añadí al código del EA. No sé si esta función ayudó o sucedió algo más mientras la escribía, pero el trabajo del Asesor Experto se normalizó.

¡Petición a la comunidad respetada!

Por favor, miren el código y aconsejen qué más se debe añadir a la función para excluir tales "regalos" para el comercio en una cuenta real?

Saludos, Vladimir.

Vladimir, ¿cómo

   if(!AccountInfoDouble(ACCOUNT_MARGIN_FREE))

convertido en tipo bool

MARGEN_DE_CUENTA_LIBRE

La cantidad de fondos libres en la cuenta en la divisa de depósito disponible para abrir una posición.

doble


Esto es con lo que me tropezó el ojo. No quiero ni mirar el resto...

 
Alexey Viktorov #:

Vladimir, ¿cómo has convertido esto en un tipo bool?

MARGEN_DE_CUENTA_LIBRE

Cantidad de fondos libres en la cuenta en la divisa de depósito disponible para abrir una posición

doble


Esto es lo que me he encontrado. No quiero ni mirar el resto....

Hola Alexey, yo estaba pensando así - si fondos libres en la cuenta en la moneda de depósito disponible para la apertura de una posición es suficiente, entonces es cierto. Ahora me doy cuenta de que este valor es sólo para cálculos. Gracias por la sugerencia.

Saludos, Vladimir.

 

¡Buenos días y buen humor!

Teniendo en cuenta las críticas constructivas, he cambiado el código de la función check:

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Las funciones CheckMoneyForTrade() y CheckVolumeValue() no las he puesto, ya que son de libre acceso y están sacadas de aquí.

¿Será suficiente este mínimo para evitar el problema con el Asesor Experto que tuve anteayer?

Saludos, Vladimir.

 
MrBrooklin #:

¡Buenos días y buen humor a todos!

Teniendo en cuenta las críticas constructivas, he cambiado el código de la función de comprobación:

Las funciones CheckMoneyForTrade() y CheckVolumeValue() no se publican, ya que están disponibles libremente y tomadas de aquí.

¿Será este mínimo suficiente para evitar el problema con el Asesor Experto que tuve anteayer?

Saludos, Vladimir.

Sí, parece normal, pero es mejor comprobar el volumen y la suficiencia en una sola función y cambiar la lógica sobre la suficiencia. Comprobamos si el lote de margen es mayor o menor, pero no lo reducimos, si el lote solicitado es menor, también calculo el lote en relación con el margen disponible, qué lote se puede establecer, y lo comparo con el lote mínimo, y si es menor, entonces la operación ha terminado definitivamente.

 

¡Buenos días a todos! Tengo un indicador estocástico RSI. El problema es que funciona muy lentamente. Según tengo entendido, el principal "freno" lo crea el gran periodo que se utiliza para buscar el mínimo y el máximo en las matrices:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

Idealmente, la solución podría ser que el indicador recorriera todas las barras del histórico durante la primera ejecución, y actualizara sólo la última barra durante las siguientes. Pero no entiendo cómo hacerlo. ¿Es posible hacerlo? En caso afirmativo, te agradecería que compartieras algún enlace o consejo sobre cómo hacerlo.

Aquí está todo el código del indicador:

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[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
Razón de la queja: