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

 
Pineapple88:

¡Buenas tardes!

Estoy tratando de entender los arrays y tengo la siguiente pregunta.

¿Por qué usarArraySetAsSeries en este ejemplo y poner el indicador true, si enCopyRates el conteo se hace del presente al pasado?

Entiendo que la funciónArraySetAsSeries es necesaria para buscar en el array desde el presente hasta el pasado.

Quiero entender el propósito de esta función en este ejemplo.

Después de

ArraySetAsSeries(rates,true); 

rates[0] corresponderá a la BARRA DERECHA del gráfico. Esta es la explicación más sencilla, sin los confusos términos "presente" y "futuro".

 
Vladimir Karputov:

Después de

rates[0] corresponderá a la BARRA DERECHA del gráfico. Esta es la explicación más sencilla, sin los confusos términos "presente" y "futuro".

Gracias por la respuesta.

Pero si no usamosArraySetAsSeries, entoncesCopyRates también asignará rates[0] a la barra más a la derecha del gráfico.

Sólo trato de entender para qué sirve la funciónArraySetAsSeries si funciona igual sin ella.

¿O simplemente es una forma aceptada de escribir código?

 
Pineapple88:

Gracias por la respuesta.

Pero si no usamosArraySetAsSeries, entoncesCopyRates también asignará rates[0] a la barra más a la derecha del gráfico.

Sólo trato de entender por qué se necesita la funciónArraySetAsSeries cuando funciona igual sin ella?

¿O simplemente es una forma aceptada de escribir código?

te equivocas, CopyRates asigna a rate[0] el valor más antiguo debido al tamaño del array rate[].
 
Anatolii Zainchkovskii:
te equivocas, CopyRates asigna rate[0] al valor más antiguo debido al tamaño del array rate[].

Gracias.

Ahora lo entiendo, estaba equivocado)

 

¡Buenas tardes!

Una vez más, pido ayuda.

He escrito un código con la condición "comprar" cuando la MA(20) cruza la MA(50) desde abajo hacia arriba

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


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

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

Pero en realidad se ejecuta así

Archivos adjuntos:
n2b3h1.png  140 kb
 
Pineapple88:

¡Buenas tardes!

Una vez más, pido ayuda.

He escrito un código con la condición "comprar" cuando la MA(20) cruza la MA(50) desde abajo hacia arriba

Pero en realidad se hace así

Error garrafal: Se crean dos asas de indicador en cada tick. La forma correcta de hacerlo es

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

mover a OnInit, añadir una comprobación de la corrección de la manija.


También las matrices que toman valores de IMA deben hacerse

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

Muchas gracias por su rápida respuesta.

Entiendo lo deArraySetAsSeries.

Trataré de averiguar cómo mover el indicador a OnInit, y comprobar el mango.

***

 
Pineapple88:

Muchas gracias por su rápida respuesta.

Entiendo lo deArraySetAsSeries.

Trataré de averiguar cómo mover el indicador a OnInit, y comprobar el mango.

***

Todo está ahí desde el principio

  • en la documentación:iMA
  • MetaEditor - Asesor Experto [carpeta de datos]MQL5\NExpertos\NEjemplos\NMedia móvil\NMedia móvil.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

Todo está ahí desde el principio.

  • en la documentación:iMA
  • en MetaEditor - EA [carpeta de datos]MQL5\NExpertos\NEjemplos\NMedia móvil\NMedia móvil.mq5

Gracias, voy a estudiar

 

Lo he arreglado, ¡parece que todo funciona!)

Transferí dos indicadores MA a la función OnInit.

¿Entiendo que creamos sólo el handle del indicador en la función OnInit y realizamos todas las demás manipulaciones con las matrices en la función OnTick y lo comprobamos en cada tick?

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...