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

 
Василий:
Sí, estoy preguntando por MQL 5. Sí, se debe acceder a los datos del símbolo actual. Los datos son necesarios en el código EA. Así que necesito, por ejemplo, conocer el precio de cierre de la barra anterior a la actual.
Mira el ejemplo de CopyTime
 
Karputov Vladimir:
Vea el ejemplo de CopyTime
Entendido, intentaré resolverlo. Gracias.
 
Василий:
Sí, me refiero a MQL5. Sí, se debe acceder a los datos del símbolo actual. Los datos que necesitamos en el código del Asesor Experto. Así, por ejemplo, necesito saber el precio de cierre de la barra anterior a la actual

Deberías leer un poco la documentación.

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

Este es un ejemplo de cómo obtener el precio de cierre y los topes de los indicadores

ENUM_ORDER_TYPE indicator_01()
  {
   double ma[2];
   double close[2];
   static int h_ma=INVALID_HANDLE;
   if(Bars(_Symbol,PERIOD_CURRENT)<ma_period+1)return(WRONG_VALUE);
   if(h_ma==INVALID_HANDLE || h_ma==0)
     {
      h_ma=iMA(_Symbol,_Period,ma_period,ma_shift,ma_method,ma_price);
      return(WRONG_VALUE);
     }
   if(CopyBuffer(h_ma,0,1,2,ma)<2) return(WRONG_VALUE);
   if(CopyClose(_Symbol,PERIOD_CURRENT,1,2,close)<2) return(WRONG_VALUE);

   if(close[1]>ma[1]&&close[0]<ma[0])return(ORDER_TYPE_BUY);
   if(close[1]<ma[1]&&close[0]>ma[0])return(ORDER_TYPE_SELL);

   return(WRONG_VALUE);
  }
 
Sergey Gritsay:

...

Este es un ejemplo de cómo obtener el precio de cierre así como los topes de los indicadores

Un mal ejemplo. La variable que almacena el manejador del indicador en MQL5 debe ser declarada en la "cabecera" - en el área de variables globales, y el manejador debe ser obtenido en OnInit(). Y sólo entonces se puede hacer referencia a la manija del indicador para obtener datos desde cualquier parte del programa.
 

Hola a todos.

Estoy obteniendo datos sobre el historial de operaciones en el probador utilizando el evento OnTrade.

  for(int i=0;i<HistoryDealsTotal();i++){
       ulong deal_ticket=HistoryDealGetTicket(i);
       Print("ticket=",deal_ticket);
       Print("price=",HistoryDealGetDouble(deal_ticket,DEAL_PRICE));
       Print("time=",TimeToString(HistoryDealGetInteger(deal_ticket,DEAL_TIME)));

Y esto es lo que obtengo en los registros.

0 22:58:16.487 Núcleo 1 2016.04.01 00:00 Número de barras en el historial del terminal para el símbolo-período GBPUSD en este momento = 7729
JR 0 22:58:16.487 Núcleo 1 2016.04.01 03:00:00 Operación intentada 0 con lote 0.01
EL 0 22:58:16.487 Core 1 2016.04.01 03:00:00 mercado comprar 0.01 GBPUSD sl: 1.43033 tp: 1.44034 (1.43646 / 1.43654 / 1.43646)
GO 0 22:58:16.487 Core 1 2016.04.01 03:00:00 deal #2 buy 0.01 GBPUSD at 1.43654 done (based on order #2)
GE 0 22:58:16.487 Core 1 2016.04.01 03:00:00 operación realizada [#2 comprar 0.01 GBPUSD a 1.43654]
NK 0 22:58:16.487 Core 1 2016.04.01 03:00:00 orden realizada comprar 0.01 a 1.43654 [#2 comprar 0.01 GBPUSD a 1.43654]
HI 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=1
HM 0 22:58:16.487 Núcleo 1 2016.04.01 03:00:00 precio=0.0
HH 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 00:00
CR 0 22:58:16.487 Core 1 2016.04.01 03:00:00 ticket=2
ID 0 22:58:16.487 Core 1 2016.04.01 03:00:00 price=1.43654
OP 0 22:58:16.487 Core 1 2016.04.01 03:00:00 time=2016.04.01 03:00

¿De dónde viene el primer comercio con precio cero? Yo no lo hago :-).

Yo no lo hago :-) Explique plz.

Z.P. Creo que lo tengo. El primer acuerdo tiene un beneficio de 10K. No sé qué hacer con él, pero sigue siendo extraño. ¿Por qué?

Y aquí hay otra pregunta. La operación (compra a 1,43654) aún no se ha abierto. ¿Cómo apareció en la historia?

Necesito obtener datos SOLO de las operaciones cerradas en el array como en MQL4. ¿Cómo hacerlo?

P.D. ¿Filtrar por DEAL_ENTRY_OUT ?

 
Alexandr Saprykin:
¿Has probado a reinstalar el terminal?
Sí, gracias. Eso fue lo único que ayudó.
 
Karputov Vladimir:
Un mal ejemplo. La variable que almacena la manija del indicador en MQL5 debe ser declarada en la "cabecera" - en el área de variables globales del programa, obtener la manija en OnInit(). Y sólo entonces se puede hacer referencia a la manija del indicador para obtener datos desde cualquier parte del programa.

No estoy del todo de acuerdo contigo en lo de obtener un asa, porque la función OnInit() se ejecuta una vez y no hay garantía al 100% de que el indicador se cree desde la primera vez. Puede que tengas razón en lo de declarar una variable, pero quiero saber si la siguiente documentación dice algo peor que la variante con una variable estática

Las variables locales declaradas con la palabra clave static guardan sus valores mientras exista la función. Con cada llamada posterior de una función, estas variables locales contienen los valores que tenían en la llamada anterior.

 
<br / translate="no">

Filtrar por DEAL_ENTRY_OUT

 
Sergey Gritsay:

No estoy del todo de acuerdo contigo en lo de obtener un asa, porque la función OnInit() se ejecuta una vez y no hay garantía al 100% de que el indicador se cree desde la primera vez. Puede que tengas razón en lo que respecta a la declaración de una variable, pero quiero saber qué tan peor es la opción de una variable estática en la documentación

...

Comprobaremos esto en OnInit() cuando se cree un manejador de indicador. Si el manejador del indicador no ha sido creado, onOnit() devolveráINIT_FAILED. Es decir, el manejador del indicador se crea sólo una vez y sólo en OnInit(). Esto no es el "4": desorden y vagabundeo y declaración de asas en todos los rincones del programa.
 
Karputov Vladimir:
Para ello, OnInit() comprueba si se ha creado el asa del indicador. Si el manejador del indicador no ha sido creado, OnOnit() debe devolverINIT_FAILED. Es decir, el manejador del indicador se crea sólo una vez y sólo en OnInit(). Esto no es "4" - no es un lío y vagando y declarando asas en todos los rincones del programa.
Yo no sería tan categórico en mi afirmación. No es un lío en los armarios, es un lío en las cabezas (c)