Script que no multiplica bien

 

Hola a todos!

He realizado este script para una cta. de 5000€ y el resultado que me responde en el "Comment" no es real, ¿Podeis ayudarme el porque? o es que MQL4 falla mas que una escopeta de caña ultimamente.


Mil gracias a todos

Un saludo Manuel


PDTA.: Son pruebas para realizarme un panel de operaciones.


//+------------------------------------------------------------------+
//|                                                       Lotaje.mq4 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+

extern double  SL          = 20;
extern double  PorcMax     = 0.5;      // % máx. de Riesgo por operación .:
double Riesgo1;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {


   double RiesgoP = NormalizeDouble((AccountBalance()*PorcMax / 100),2);//---Riesgo STD
   RiesgoP = NormalizeDouble(RiesgoP,0);

//---
   double Lots = AccountBalance()*PorcMax /(SL*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE))/100;
   Lots = NormalizeDouble(Lots,3);
   
   double Lotes = Lots;

   double Riesgo = Lotes * SL;
   Riesgo = NormalizeDouble(Riesgo,0);
//---
   if(RiesgoP >= Riesgo)//---RiesgoP = Riesgo con AccountBalance calculado.
     {
      //---
      bool activo = true;
      double Lotes1 = (RiesgoP * Lotes)/Riesgo;
      Lotes1 = NormalizeDouble(Lots,3);

      //Riesgo = SL*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
      Riesgo1 = (Lotes1 * SL);
      Riesgo1 = NormalizeDouble(Riesgo1,0);
      Comment("\n Lotaje = ",Lotes1,"\n Activo = ",activo );
     }

 
  }
//+------------------------------------------------------------------+
 
MHS1958:

Buenas!

Revise los cálculos, he encontrado alguna que otra incongruencia.

Y por favor, no haga publicidad directa o indirectamente como hizo en otra publicación dando nombres de "gurus". (Eliminé esa parte)

Nos tomamos muy en serio la publicidad en este foro.

Gracias y suerte con esos cálculos. Estoy seguro de que si los revisa conseguirá que arrojen los valores que desea.

 
Miguel Angel Vico Alba #:

Buenas!

Revise los cálculos, he encontrado alguna que otra incongruencia.

Y por favor, no haga publicidad directa o indirectamente como hizo en otra publicación dando nombres de "gurus". (Eliminé esa parte)

Nos tomamos muy en serio la publicidad en este foro.

Gracias y suerte con esos cálculos. Estoy seguro de que si los revisa conseguirá que arrojen los valores que desea.

Hola Miguel!


Serias tan amable de marcarme donde y cuales son las incongruencias, ya que antes de postear lo mire 40 veces y me fue imposible, quizas es que desde dentro es mas dificil ver los errores, que haberlos los hay, pero ver los de uno mismo es muy dificil.

Muchas gracias.

 
MHS1958 #:

Además de lo anteriormente comentado sobre las incongruencias de cálculo, se suma que el valor de SYMBOL_TRADE_TICK_VALUE lo establece el corredor en el lado del servidor y no es raro que esté mal.

La solución es calcularlo tú mismo.

Mi recomendación es que utilices Print() o Comment() para ver que valores está calculando cada paso/cálculo. Ahí es donde te darás cuenta de lo que hablo, que SYMBOL_TRADE_TICK_VALUE no está devolviendo lo que piensas (el valor en por ejemplo euros del tick), y posiblemente el servidor del broker este devolviendo un 0.00001 tomando como ejemplo un par de 5 dígitos, que es el tick mínimo o valor del tick, no el valor monetario del tick.

Tendrás que como digo calcular el valor por otros medios. En CodeBase o en el foro inglés (con mucha más actividad que este), hay cientos de ejemplo de como hacerlo.