Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 672

 
inter78:

De hecho, lo hice, pero no me gusta el largo tiempo de respuesta

No es mucho tiempo, es un tic... pero en general, necesitas leer la ayuda. no puedes aprender MQL por "intuición". MQL está basado en c++, pero está ligado a la plataforma MT, así que no puedes aprenderlo sin leer la ayuda.

Tienes manejo de archivos y trabajo con variables globales y gráficos en tu código ... Hay un montón de operaciones innecesarias en cada garrapata

Si quieres una respuesta rápida, utiliza OnChartEvent(), no se genera en el probador, pero primero empieza a estudiar la ayuda de MQL4.

 
Igor Makanu:

La operación no es larga, es tic-tac... pero en general, empieza a leer la ayuda, no puedes aprender MQL por "intuición", MQL está basado en C++, pero está ligado a la plataforma MT, no puedes hacerlo sin leer la ayuda.

Tienes manejo de archivos y trabajo con variables globales y gráficos en tu código ... Hay un montón de operaciones innecesarias en cada garrapata

Si quieres una respuesta rápida, utiliza OnChartEvent(), no se genera en el probador, pero primero empieza a estudiar la ayuda de MQL4.

Probablemente tendré que pedir a los técnicos que me hagan entrar en razón. No podré hacerlo. Este indicador es muy conveniente para trabajar con un número ilimitado de gráficos abiertos. Los botones muestran el beneficio actual del símbolo y el número de órdenes de compra y venta.
 

Hola a todos.

Encontré un útil indicador Ind-Fractals en la biblioteca de códigos. Sin embargo, dibuja fractales en cada barra, en lugar de calcularlos correctamente. Quiero utilizar este indicador, pero está "roto" (( Ayúdame a encontrar un error, he tratado de contactar con el autor, pero no responde a los mensajes. Para mayor comodidad, el código se duplica aquí.

#property copyright "Copyright © 2005, MetaQuotes Software Corp.

#enlace de propiedad "http://www.metaquotes.net"

//----

#propiedad ventana_del_gráfica_del_indicador

#property indicator_buffers 8

#property indicator_color1 Rojo

#property indicator_color2 Rojo

#property indicator_color3 Azul

#property indicator_color4 Azul

#property indicator_color5 Lime

#property indicator_color6 Lime

#property indicator_color7 Siena

#property indicator_color8 Siena

//---- parámetros de entrada

extern bool Comm=true;

//---- buffers

doble ExtMapBuffer1[];

doble ExtMapBuffer2[];

doble ExtMapBuffer3[];

doble ExtMapBuffer4[];

doble ExtMapBuffer5[];

doble ExtMapBuffer6[];

doble ExtMapBuffer7[];

doble ExtMapBuffer8[];

//+------------------------------------------------------------------+

//| Función de inicialización de indicadores personalizada |

//+------------------------------------------------------------------+

int init()

{

//---- indicadores

SetIndexStyle(0,DRAW_ARROW);//el estilo de línea del indicador

SetIndexArrow(0,217); //prescribe el tipo de flecha

SetIndexBuffer(0,ExtMapBuffer1);//vinculael buffer indicador con un array dinámico unidimensional de tipo doble. Hay dos versiones de la función.

SetIndexEmptyValue(0,0.0);//Establece el valor vacío para la línea del indicador.

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,218);

SetIndexBuffer(1,ExtMapBuffer2);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,217);

SetIndexBuffer(2,ExtMapBuffer3);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,218);

SetIndexBuffer(3,ExtMapBuffer4);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,217);

SetIndexBuffer(4,ExtMapBuffer5);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,218);

SetIndexBuffer(5,ExtMapBuffer6);

SetIndexEmptyValue(5,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,217);

SetIndexBuffer(6,ExtMapBuffer7);

SetIndexEmptyValue(6,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,218);

SetIndexBuffer(7,ExtMapBuffer8);

SetIndexEmptyValue(7,0.0);

return(0); }

//+------------------------------------------------------------------+

//| Función de desinicialización del indicador Custor |

//+------------------------------------------------------------------+

int deinit() {return(0); }

//------------------------------------------------------------------

bool Fractal(string F,int Per,int shift) {

if(Period()>Per) return(-1);

Per=Per/Period()*2+MathCeil(Per/Period()/2);

if(shift<Per)return(-1);

if(shift>Bars-Per)return(-1);

for(int i=1;i<=Per;i++) {

if(shift+i>=Bars || shift-i<0) return(-1);

if(F=="U") {

if(Alto[shift+i]>Alto[shift])return(-1);

if(High[shift-i]>=High[shift])return(-1); }

if(F=="L") {

if(Low[shift+i]<Low[shift])return(-1);

if(Low[shift-i]<=Low[shift])return(-1); } }

return(1); }

//------------------------------------------------------------------

int inicio()

{

int D1=1440,H4=240,H1=60,M15=15,B;

doble P;

int counted_bars=IndicatorCounted();// número de barras sin cambios después de la última llamada al indicador

B=Barras contadas;

if(counted_bars==0) B--;

if(Period()==D1)P=150*Punto;// period devuelve el periodo actual del gráfico

if(Periodo()==H4)P=70*Punto;

if(Periodo()==H1)P=40*Punto;

if(Period()==30)P=30*Point;

if(Periodo()==M15)P=20*Punto;

if(Periodo()==5)P=10*Punto;

if(Periodo()==1)P=5*Punto;

for(int shift=B;shift>0;shift--)

{

if(Fractal("U",M15,shift)==1) ExtMapBuffer1[shift]=High[shift]+P;

si no ExtMapBuffer1[shift]=0;

if(Fractal("L",M15,shift)==1) ExtMapBuffer2[shift]=Low[shift]-P;

si no ExtMapBuffer2[shift]=0;

if(Fractal("U",H1,shift)==1) ExtMapBuffer3[shift]=High[shift]+P;

si no ExtMapBuffer3[shift]=0;

if(Fractal("L",H1,shift)==1) ExtMapBuffer4[shift]=Low[shift]-P;

si no ExtMapBuffer4[shift]=0;

if(Fractal("U",H4,shift)==1) ExtMapBuffer5[shift]=High[shift]+P;

si no ExtMapBuffer5[shift]=0;

if(Fractal("L",H4,shift)==1) ExtMapBuffer6[shift]=Low[shift]-P;

si no ExtMapBuffer6[shift]=0;

if(Fractal("U",D1,shift)==1) ExtMapBuffer7[shift]=High[shift]+P;

si no ExtMapBuffer7[shift]=0;

if(Fractal("L",D1,shift)==1) ExtMapBuffer8[shift]=Low[shift]-P;

else ExtMapBuffer8[shift]=0;

}

if(Comm) Comment("D1 - marrón\n H4 - verde\n H1 - azul\nM15 - rojo ");


return(0);

}

MetaQuotes Software Corp.
MetaQuotes Software Corp.
  • www.metaquotes.net
Миллионы трейдеров и сотни брокеров не могут ошибаться — они выбрали MetaTrader 5 для торговли на Форексе и финансовых рынках! Узнать больше
 

Me han regañado aquí por este tipo de código, es la primera vez que me pasa :-)

El código debe insertarse en un formulario que se abra con Alt+S.

 
psyman:

Me han regañado aquí por este tipo de código, es la primera vez que me pasa :-)

Tienes que pegar el código en un formulario que se abre con Alt+S.

¿Te regañan? De ninguna manera. Escribe el código como quieras. Pero... si quieres una respuesta a tu pregunta, trata de respetar a quienes les pides ayuda. Es tan sencillo como eso.

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta para los novatos en MQL4, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.10.18 08:07

Digámoslo así: cree una plantilla de indicador en el editor, añada el número correcto de variables de entrada y los buffers de dibujo cuando lo cree.

A continuación, analicemos qué hacer a partir de la tarea específica.

Lo hice la última vez, sólo cambié el nombre de la variable y del array.

Cuando se utiliza iMA sólo funciona en semanas y daires, donde la vela contiene más de 100 puntos, no hace nada en los marcos de tiempo inferiores. La razón parece ser el redondeo.




Si se utiliza iMAOnArray, la ventana i-ras está vacía en todos los TFs. No hay errores en el registro.




//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "O-C"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrSteelBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         ip1Buf[];

input int ip1=100;
double tmp1[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  
IndicatorBuffers(2);
string s_name1;

s_name1="O-C (" + IntegerToString(ip1) + ")";

IndicatorShortName(s_name1);
SetIndexLabel(0, s_name1);
SetIndexBuffer(1, tmp1);


//--- indicator buffers mapping
   SetIndexBuffer(0,ip1Buf);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {


int i;

      Print("rates_total = ",rates_total);
      for(i=1; i<rates_total-1; i++)
      {
      //Print("i = ",i);
      tmp1[i]=MathMax(open[i],close[i])-MathMin(open[i],close[i]);      
     // tmp1[i]=close[i];      
      //ip1Buf[i]=iMA(NULL,0,1,0,0,tmp1[i],0);
      ip1Buf[i]=iMAOnArray(tmp1,1,1,0,0,0);
      
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
psyman:

Si se utiliza iMAOnArray, la ventana i-ra está vacía en todos los TFs. No hay errores en el registro.

Está utilizando iMAOnArray() con el periodo 1, es decir, el valor de iMAOnArray() será esencialmente el valor del array tmp1

Si quieres distinguir lo que estás calculando, haz el bucle más cortofor(i=1; i<10; i++)

aunque puede ser más fácil no calcular alguna fórmula compleja, sino usar iMAOnArray() para construir iMA e iMAOnArray() - ambos iMA e iMAOnArray() son el mismo cálculo.... por desgracia, si puedes obtener una respuesta a una pregunta técnica en este foro, sólo tú deberías aprender a calcular y tratar la información.

 
psyman:

La última vez que hice esto, sólo cambié el nombre de la variable y del array.

Cuando se utiliza iMA i-r trabajó sólo en semanas y días, donde hay más de 100 pips en una vela, no dibuja nada en TFs inferiores. La razón parece ser el redondeo.




Si se utiliza iMAOnArray, la ventana i-ras está vacía en todos los TFs. No hay errores en el registro.





El primer ciclo calcula los valores de la primera memoria intermedia;

El segundo ciclo calcula la MA por los valores calculados en el primer ciclo.

Considera lo que significa iMAOnArray(). Escribe MA en Array. ¿Cómo se traduce? Todo el mundo tiene un traductor de Google al alcance de la mano. Poner-traducir-recibir: MA en Array.

Significa que es una media móvil basada en una matriz calculada y rellenada preliminarmente.

Correspondientemente: el primer ciclo - preparación de la matriz necesaria, y el segundo ciclo - construcción de una media móvil basada en la matriz preparada en el primer ciclo.

¿Y qué haces tú? Se introduce un valor en la primera matriz (los otros valores aún no han sido preparados) y se intenta construir la MA sobre este valor.

Te he dado una plantilla:

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta para principiantes de MQL4, ayuda y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.10.18 09:39

Indicador:

//+------------------------------------------------------------------+
//|                                                       TestMA.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_chart_window
#ifdef __MQL4__
#property strict
#property indicator_buffers 2
#else 
#property indicator_buffers 3
#property indicator_plots   2
#endif 
//--- plot MAstd
#property indicator_label1  "Calculation MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  4
//--- plot MAcalc
#property indicator_label2  "Standart MA"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkOrange
#property indicator_style2  STYLE_DOT
#property indicator_width2  2
//--- input parameters
input int      InpPeriod                     =  10;            // Period
input ENUM_MA_METHOD       InpMethod         =  MODE_EMA;      // Method
input ENUM_APPLIED_PRICE   InpAppliedPrice   =  PRICE_CLOSE;   // Applied price  
//--- indicator buffers
double         BufferMAcalc[];
double         BufferMAstd[];
double         BufferPrice[];
//---
int            digits;
int            period_ma;
int            handle_ma;
CAvg           avg();
//--- includes

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
#ifdef __MQL4__
   IndicatorBuffers(3);
#endif 
    period_ma=(InpPeriod<1? 1 : InpPeriod);
   digits=Digits()+1;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
   ArraySetAsSeries(BufferMAcalc,true);
   ArraySetAsSeries(BufferMAstd,true);
   ArraySetAsSeries(BufferPrice,true);
//---
#ifdef __MQL5__
   ResetLastError();
   handle_ma=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice);
   if(handle_ma==INVALID_HANDLE)
     {
      Print("Error creation iMA(",(string)period_ma,"): ",GetLastError());
      return INIT_FAILED;
     }
#endif 
//---
   Comment("\nMA type: ",avg.MethodToString(InpMethod),", price: ",avg.PriceToString(InpAppliedPrice),", period: ",(string)period_ma);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferMAcalc,EMPTY_VALUE);
      ArrayInitialize(BufferMAstd,EMPTY_VALUE);
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
#ifdef __MQL5__
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferMAstd);
   if(copied!=count) return 0;
#endif 
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      #ifdef __MQL4__ BufferMAstd[i]=iMA(NULL,PERIOD_CURRENT,period_ma,0,InpMethod,InpAppliedPrice,i); #endif 
       BufferPrice[i]=avg.AppliedPrice(InpAppliedPrice,NULL,PERIOD_CURRENT,i);
      BufferMAcalc[i]=avg.GetMA(rates_total,InpMethod,period_ma,i,BufferPrice);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Puedes desechar todo lo relacionado con los cincos y obtener una plantilla para los cuatros. Aunque esta plantilla es multiplataforma - puedes usarla para ambos terminales - sólo tienes que establecer tus buffers y su número. En esta plantilla hay dos dibujos y un cálculo, que pueden verse aquí:

//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAcalc,INDICATOR_DATA);
   SetIndexBuffer(1,BufferMAstd,INDICATOR_DATA);
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
//---
 

=también, se utiliza iMAOnArray() con el periodo 1, es decir, el valor de iMAOnArray() será esencialmente el valor del array tmp1


He probado diferentes valores a utilizar, 1 sigue siendo la última variante de estos experimentos.

Por alguna razón, el ip1Buf[4] = 2147483647.0 escribe el mismo número en el buffer i-r en todos los TFs, por ejemplo, mientras que los valores del array son todos diferentes tmp1[4] = 0.1300000000000097, etc.

Pero incluso en ese caso debería dibujarse una línea recta, y en el gráfico i-r no hay absolutamente nada, la escala está marcada de 0 a 0.



 
psyman:

=también, se utiliza iMAOnArray() con el periodo 1, es decir, el valor de iMAOnArray() será esencialmente el valor del array tmp1


He probado diferentes valores a utilizar, 1 sigue siendo la última variante de estos experimentos.

Por alguna razón, el ip1Buf[4] = 2147483647.0 escribe el mismo número en el buffer i-r en todos los TFs, por ejemplo, mientras que los valores del array son todos diferentes tmp1[4] = 0.1300000000000097, etc.

Pero incluso en este caso se debería trazar una línea recta, y no hay absolutamente nada en el gráfico i-r, la escala está marcada de 0 a 0.



2147483647.0 ¡Pues empieza a usar el buscador!https://www.mql5.com/ru/forum/224831

Una vez más, acabo de escribir Artem, tienes que leerlo tú mismo, empieza con una simple... Dibujar un precio de cierre en un gráfico con un indicador, luego tratar de complicarlo, hacer lo mismo en un ciclo y en el segundo ciclo hacer МА cálculo basado en el buffer ya calculado donde se encuentra el cierre

2147483647 в буфере
2147483647 в буфере
  • 2018.01.15
  • www.mql5.com
День Добрый! Подскажите, пожалуйста, что это за хрень. Не первый раз сталкиваюсь...
Razón de la queja: