Errores, fallos, preguntas - página 585

 
¿Puedo utilizar los módulos de señales de trading por separado de los Wizard EAs? A modo de prueba, escribí


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

Pero lo que se muestra en negrita no está en la clase CSignalMA, pero compila bien, cuando intento colocarlo en el símbolo da


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Periodo: el cambio de marco temporal está prohibido
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Símbolo: el cambio de símbolo está prohibido

¿Cómo puedo cambiar el símbolo y el marco temporal de las señales de trading estándar?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
¿Puedo utilizar los módulos de señales de trading por separado de los Wizard EAs? A modo de prueba, escribí


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

Pero lo que se muestra en negrita no está en la clase CSignalMA, pero compila bien, cuando intento colocarlo en el símbolo da


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Periodo: el cambio de marco temporal está prohibido
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Símbolo: el cambio de símbolo está prohibido

¿Cómo puedo cambiar el símbolo y el marco temporal de las señales de trading estándar?
Básicamente, puedes. Pero la inicialización del módulo de señales de comercio es todo un "ritual". Me temo que no puedo explicar todo el procedimiento de inicialización "con los dedos".
 

El siguiente código:

RectLabel* GetLabel()
{
   static bool initialized = false;
   static RectLabel label("rectlabel sample", 0, 0);
   
   if (!initialized)
   {
      Pos leftTop = {100, 100};
      Rect rect(leftTop, 100, 50);
      
      label.Move(rect);
      label.SetBGColor(clrYellowGreen);
      label.SetTooltip(" -- Yuuuu! -- ");
      
      initialized = true;
   }

   return GetPointer(label);
}

Llama al constructor de la etiqueta cada vez que se llama a la función.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

Con el siguiente código: en el primer caso el indicador está activado, en el segundo no (cambiado con barras).

#include <Charts\Chart.mqh>
CChart cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   int f_h=iFractals(_Symbol,_Period);
   
   if (f_h==INVALID_HANDLE) {Print("Ошибка создания индикатора.");return(-1);}
   
   ChartIndicatorAdd(0,0,f_h);   // устанавливает индикатор
   
   //cc.IndicatorAdd(0,f_h);     // НЕ устанавливает индикатор
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { }
 

La segunda opción de esta biblioteca da como resultado 0. Todas las demás funciones parecen funcionar.

#include <Trade\SymbolInfo.mqh>
CSymbolInfo si;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print (SymbolInfoDouble("EURUSD",SYMBOL_BID)); // все правильно
   
   si.Name("EURUSD");
   Print (si.Bid());            // выводит 0
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { 
 }
 
Karlson:

Para el siguiente código: en el primer caso el indicador está puesto, en el segundo no (se cambia con barras).

Según tengo entendido, por el momento los tres parámetros son obligatorios.

Por lo tanto, debe especificar el número de ventana (variantes: 0 - ventana principal,ChartIndicatorsTotal( ) - nueva ventana, 0 a ChartIndicatorsTotal()-1 - una ventana existente).

Eso es lo que no da errores no es bueno.

Karlson:

Para esta biblioteca, la segunda opción da como resultado 0. Todas las demás funciones parecen funcionar.

Probablemente antes de obtener el precio de refresco debe ser utilizado (al menos RefreshRates).

La variante correcta debería tener el siguiente aspecto

  si.Name("EURUSD");
  si.Refresh();
  si.RefreshRates();
  Print(si.Bid());
 

Gracias. Ha funcionado con Bid, después de especificar el refresco.

Pero la salida del indicador, usando la librería, requiere 2 parámetros, una subventana y un handle. De lo contrario, dice que el número de parámetros es incorrecto. No puedo entenderlo, porque la librería usa el mismo ChartIndicatorAdd, por lo que funciona directamente, pero llamando a través de la librería no.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
Karlson:

Gracias, realmente funcionó con Bid, después de especificar refrescar.

Pero la salida del indicador, usando la librería, requiere 2 parámetros, una subventana y un handle. Si no es así, dice que el número de parámetros es incorrecto, no puedo averiguarlo, porque la librería usa el mismo ChartIndicatorAdd.

El uso de la biblioteca requiere 2 parámetros. Gráfico y subventana.
 
uncleVic:
El uso de la biblioteca requiere 2 parámetros. Gráfico y subventana.

¿Sin asa? ¿Y cómo sabrá el sistema qué plataforma giratoria utilizar? ... Hasta ahora he confiado en lo que está escrito :) El sustrato y el mango.

 
Karlson:

¿Sin asa? ¿Cómo sabrá el sistema qué indicador utilizar? Hasta ahora he confiado en los textos :) Subventana y asa.

Sobre la biblioteca (de la ayuda de la clase)

IndicadorAdd

Añade un indicador con el asa especificada a la ventana del gráfico especificada.

bool  IndicatorAdd(
   int   sub_win         // номер подокна
   int   handle          // хэндл индикатора
   );

En cuanto al trabajo directo de ChartIndicatorAdd.

ChartIndicatorAdd

Añade un indicador con el asa especificada a la ventana del gráfico especificada.

bool  ChartIndicatorAdd(
   long  chart_id,                 // идентификатор графика
   int   sub_window                // номер подокна
   int   indicator_handle          // хэндл индикатора
   );

En cuanto a la clase CChart.

Para evitar preguntas innecesarias, intentamos seguir tres reglas básicas:

1. Miramos el código fuente, si algo no está claro nos remitimos a la documentación (el código fuente siempre dirá la "verdad", pero la documentación también puede mentir);

2. Si la implementación OOP es importante para nosotros, empezamos con una descripción de una clase particular y llegamos hasta los "implementadores directos". Si el "trabajo real" es importante, la POO debería estudiarse en último lugar (examen descendente/superior del código);

3. si después de leer la documentación y las fuentes algo no está claro, acude al foro.

Directamente en la implementación del método IndicatorAdd en una clase

Si miras el código fuente queda claro que el método obtiene la subventana y el handle (como se indica en la ayuda), y el tercer parámetro se toma de los datos almacenados en la propia clase (me refiero al ID del gráfico).

class CChart : public CObject
  {
protected:
   long  m_chart_id; // chart identifier
public:
   //methods for working with indicators
   bool  IndicatorAdd(int subwin,int handle);
  }

bool CChart::IndicatorAdd(int subwin,int handle)
  {
//checking (проверка корректности идентификатора графика)
   if(m_chart_id<=0) return(false);
//Непосредственно в обработку выдаются три параметра
   return(ChartIndicatorAdd(m_chart_id,subwin,handle));
  }