Preguntas de un "tonto" - página 78

 
Interesting:

Creo que sería más fácil rehacer el Asesor Experto o trabajar en él con un archivo.

Creo que sería más fácil describir en su totalidad lo que quiere del Asesor Experto y proporcionar todo el código creado por VISARD.

Por ejemplo, necesito un Asesor Experto que abra operaciones al cruzar el precio de un indicador Envelopes. Esto es lo que tengo:

//+------------------------------------------------------------------+
//|                                                    envelopes.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalEnvelopes.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string             Expert_Title              ="envelopes"; // Document name
ulong                    Expert_MagicNumber        =28572;       // 
bool                     Expert_EveryTick          =false;       // 
//--- inputs for main signal
input int                Signal_ThresholdOpen      =10;          // Signal threshold value to open [0...100]
input int                Signal_ThresholdClose     =10;          // Signal threshold value to close [0...100]
input double             Signal_PriceLevel         =0.0;         // Price level to execute a deal
input double             Signal_StopLevel          =50.0;        // Stop Loss level (in points)
input double             Signal_TakeLevel          =50.0;        // Take Profit level (in points)
input int                Signal_Expiration         =4;           // Expiration of pending orders (in bars)
input int                Signal_Envelopes_PeriodMA =240;         // Envelopes(240,0,MODE_LWMA,...) Period of averaging
input int                Signal_Envelopes_Shift    =0;           // Envelopes(240,0,MODE_LWMA,...) Time shift
input ENUM_MA_METHOD     Signal_Envelopes_Method   =MODE_LWMA;   // Envelopes(240,0,MODE_LWMA,...) Method of averaging
input ENUM_APPLIED_PRICE Signal_Envelopes_Applied  =PRICE_CLOSE; // Envelopes(240,0,MODE_LWMA,...) Prices series
input double             Signal_Envelopes_Deviation=0.15;        // Envelopes(240,0,MODE_LWMA,...) Deviation
input double             Signal_Envelopes_Weight   =1.0;         // Envelopes(240,0,MODE_LWMA,...) Weight [0...1.0]
//--- inputs for money
input double             Money_FixLot_Percent      =10.0;        // Percent
input double             Money_FixLot_Lots         =0.01;        // Fixed volume
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),PERIOD_H4,Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(-1);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalEnvelopes
   CSignalEnvelopes *filter0=new CSignalEnvelopes;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
   filter0.PatternsUsage(2);
//--- Set filter parameters
   filter0.PeriodMA(Signal_Envelopes_PeriodMA);
   filter0.Shift(Signal_Envelopes_Shift);
   filter0.Method(Signal_Envelopes_Method);
   filter0.Applied(Signal_Envelopes_Applied);
   filter0.Deviation(Signal_Envelopes_Deviation);
   filter0.Weight(Signal_Envelopes_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(-4);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(-5);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedLot *money=new CMoneyFixedLot;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(-6);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(-7);
     }
//--- Set money parameters
   money.Percent(Money_FixLot_Percent);
   money.Lots(Money_FixLot_Lots);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(-8);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(-9);
     }
//--- ok
   return(0);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+
 
Compañeros desarrolladores, por favor expliquen qué debo cambiar en el código, para que después de una señal de compra/venta se abra y cierre una posición una vez y ya está, el Asesor Experto no abre posiciones hasta la siguiente señal. Especialmente ocurre cuando el sistema está formado por múltiples indicadores. El Asesor Experto está siempre en posición. Cierra una al tomar o parar, e inmediatamente abre otra.
 

Pregunta sobre los indicadores.

Existe una construcción de parámetros de entrada de este tipo en OnCalculate:

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[])
  {
     ...
  }

Toda esta diversión está ligada estrictamente al marco temporal actual, por lo tanto, para llegar a los datos similares de otro marco temporal, puede, por ejemplo, llamar al mango del indicador estándar incorporado requerido en el marco temporal deseado:

handle=iGator(_Symbol, PERIOD_W1);

y luego copiar los datos necesarios en los búferes a través de las variaciones de las funciones de copia.

Todo esto estaría bien, pero es necesario utilizar rates_total y prev_calculated en plazos diferentes a los actuales. Y no hay ninguno, según tengo entendido. ¿Dónde y cómo podemos conseguirlos si obviamente no corresponden al marco temporal actual?

Por supuesto, hay una explicación clara en la ayuda:

"Tenemos que observar la relación entre el valor devuelto por OnCalculate() y el segundo parámetro de entrada prev_calculado. El parámetro prev_calculado, cuando se llama a la función, contiene el valordevuelto por OnCalculate() en la llamada anterior. Esto permite economizar los algoritmos de cálculo del indicador personalizado para evitar cálculos repetidos para aquellas barras que no han cambiado desde la anterior llamada a esta función.

Para ello, suele bastar con devolver el valor del parámetro rates_total, que contiene el número de barras de la llamada a la función actual. Si desde la última llamada de OnCalculate() los datos de precios fueron cambiados (se bombeó un historial más profundo o se llenaron los vacíos del historial), entonces el valor del parámetro de entrada prev_calculado será puesto a cero por la terminal."

Entonces, ¿tenemos que implementar manualmente nuestros propios análogos de rates_total y prev_calculated para otros plazos según el principio descrito anteriormente? ¿O hay algo listo para ser utilizado? Bueno, por ejemplo, así:

rates_total = BarsCalculated(handle);
o tomar el valor devuelto de la función de copia. Pero con prev_calculated no sería, por decirlo suavemente, tan fácil... ¿Cómo aplicarlo correctamente?
 

He leído el artículo de Rosh sobre las matemáticasen https://www.mql5.com/ru/articles/1492.

¿Existe la posibilidad de conectar dicho análisis, por ejemplo, en OnTester()?

¿Existen soluciones ya hechas y disponibles de forma gratuita?

Математика в трейдинге. Оценка результатов торговых сделок - Статьи по MQL4
  • www.mql5.com
Математика в трейдинге. Оценка результатов торговых сделок - Статьи по MQL4: автоматическая торговля
 
Karlson:

He leído el artículo de Rosh sobre las matemáticasen https://www.mql5.com/ru/articles/1492.

¿Existe la posibilidad de conectar dicho análisis, por ejemplo, en OnTester()?

¿Existen soluciones ya hechas y disponibles de forma gratuita?

Sí - Estadísticas de las pruebas
 
Gracias.
 

¿Puede aconsejarnos?

Seleccioné una operación del historial,la dirección de la operación es "pivote" (entrada/salida), luego determino el volumen de la operación HistoryDealGetDouble(ticket,DEAL_VOLUME).
Obtengo el volumen total, pero ¿cómo saber qué volumen he cerrado y cuál abierto? Quiero saber qué volumen he cerrado y qué volumen he abierto. Gracias.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 

He escrito una regresión lineal. ¿Piensas añadir algo así al terminal, e incluso mostrarlo en el gráfico del probador?

¿Y como se entiende que para calcular el recuento Z se requiere calcular independientemente el número total de series positivas y negativas?

 
¿Se puede conectar MetaTrader 5 a esta bolsahttps://mtgox.com/ ?
 
Karlson:

Y también entiendo que el cálculo de la cuenta Z requiere calcular el número total de series positivas y negativas por ti mismo?

Sí, por mí mismo. Básicamente, puedo publicar el código en MQL5 para calcularlo.