Librerías: Symbol - página 8

 
Stanislav Korotky:

¿No deberían intercambiarse la oferta y la demanda?

Para evitar que el diferencial sea negativo, sí.

 
fxsaber:
// Ejemplo de creación de un símbolo invertido

En este ejemplo tengo un gráfico de un símbolo personalizado abierto sin historial. Y el dibujo de las barras comienza sólo a partir de los ticks actuales.

¿Cómo hacer con la historia?

+

expression not boolean  Symbol.mqh      192     17
 
ilvic:

En este ejemplo tengo un gráfico de un símbolo personalizado abierto sin historial. Y el dibujo de barras comienza sólo a partir de los ticks actuales.

¿Cómo hacerlo con historial?

+

Los ejemplos de este hilo son una demostración visual de las capacidades de la librería para los aficionados a la programación.

Los scripts listos para los usuarios no se publican en el hilo.

 

Estoy intentando crear un símbolo personalizado con un historial que se actualizará en tiempo real, basado en la MA habitual.

iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);

Tics no son importantes, la construcción en minutos.

Probado este código-

// Ejemplo de creación de un símbolo invertido

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/es/code/20225

CUSTOMSYMBOL CustomSymb(StringSubstr(_Symbol, 3, 3) + StringSubstr(_Symbol, 0, 3) + StringSubstr(_Symbol, 6)); // Creado un símbolo

double ReversePrice( const double Price )
{
  return(Price ? NormalizeDouble(1 / Price, _Digits) : 0);
}

void ReverseTick( MqlTick &Tick )
{
  Tick.bid = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.ask = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
  Tick.last = iMA(Symbol(),Period(),25,0,MODE_SMA,PRICE_OPEN);
}

bool ReverseTicks( MqlTick &Ticks[] )
{
  for (int i = ArraySize(Ticks) - 1; i >= 0; i--)
    ReverseTick(Ticks[i]);
    
  return(true);
}

bool GetTicks( MqlTick &Ticks[] )
{
  return(CopyTicks(_Symbol, Ticks) > 0);
}

void OnInit()
{
  MqlTick Ticks[];
  
  if (CustomSymb.IsCustom() && GetTicks(Ticks) && ReverseTicks(Ticks) &&
      (CustomSymb.AddTicks(Ticks) > 0) && (CustomSymb.DataToSymbol() > 0) && CustomSymb.On())
    ChartOpen(CustomSymb.Name, PERIOD_CURRENT); // Abierto el gráfico
}

void OnTick()
{  
  MqlTick Tick[1];
  
  if (CustomSymb.IsCustom() && SymbolInfoTick(_Symbol, Tick[0]) && ReverseTicks(Tick))
    CustomTicksAdd(CustomSymb.Name, Tick);
}

No funciona en absoluto.

¿Puede alguien de los expertos decirme cómo crear correctamente un símbolo personalizado a partir de MA?

 
erotin:

¿Cómo crear correctamente un personaje personalizado a partir de MA?

#include <Symbol.mqh> // https://www.mql5.com/es/code/18855

bool FillPrices( MqlTick &Tick )
{
  static const int handle = iMA(Symbol(), Period(), 1, 0, MODE_SMA, PRICE_CLOSE);
  double Array[1];
  
  const bool Res = (CopyBuffer(handle, 0, 0, 1, Array) > 0);

  if (Res)
  {
    Tick.bid = Array[0];
    Tick.ask = Array[0];
    Tick.last = Array[0];
  }
    
  return(Res);
}

void OnTick()
{
  static const SYMBOL Symb("CUSTOM_" + _Symbol, NULL, _Symbol); // Creado un símbolo
  static const bool Init = Symb.IsExist() && Symb.IsCustom() && Symb.On() && ChartOpen(Symb.Name, PERIOD_M1);
    
  MqlTick Tick[1];
  
  if (Init && SymbolInfoTick(_Symbol, Tick[0]) && FillPrices(Tick[0]))
// Symb += Tick;
    CustomTicksAdd(Symb.Name, Tick);
}
 
fxsaber:

Gracias.

¿Cómo añadir otro 1 año de historia de la lectura MA a este gráfico?

 
erotin:

¿Cómo puedo añadir 1 año más de historial de lectura de MA a este gráfico?

Todo lo demás se hace sin mí.

 
fxsaber:

ZY lo he medido a fondo en EURGBP. La ganancia en tiempo es ~2 veces. Las transacciones son totalmente coincidentes. ¡Realmente gratis!

Rápidamente comprobado el nuevo modo del probador por pips. Resultados de ejecuciones individuales.


Todas las monedas de los símbolos están ajustadas a la moneda de la cuenta.

final balance 107448.00 EUR
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:00:40.141 (including ticks preprocessing 0:00:04.524).


Modo por pips

final balance 107448.00 pips
14853401 ticks, 254375 bars generated. Environment synchronized in 0:00:00.093. Test passed in 0:00:38.827 (including ticks preprocessing 0:00:04.508).


La duración coincide dentro del margen de error.

 

Si abrimos una cuenta demo en Swissquote-Server y ejecutamos este script, obtendremos la siguiente línea.

2020.03.26 08:53:12.567 5, 5

Significa que en el historial de ticks los precios Bid/Ask difieren en 5 pips de los emitidos en el Market Watch (allí hay mejores precios que en el historial).

En consecuencia, en el Probador no se puede recrear lo que se ve en el Terminal en el símbolo original.


La única solución es utilizar un símbolo personalizado, que se basa en el demarcap correspondiente del historial de ticks.

 

Y ha surgido una pregunta interesante: ¿no se observa el mismo problema con la pila, es decir, que los precios de la pila difieren de los del gráfico?

Un usuario se queja de la falta de sincronización entre el inductor basado en BookEvent y el gráfico.