Librerías: Symbol - página 6

 
class CURRENCY_CHECK
{
public:
  CURRENCY_CHECK( void )
  {
    const string CurrencyProfit = ::SymbolInfoString(_Symbol, SYMBOL_CURRENCY_PROFIT);
    const string AccountCurrency = ::AccountInfoString(ACCOUNT_CURRENCY);
    const bool Res = !::MQLInfoInteger(MQL_TESTER) || (CurrencyProfit == AccountCurrency);
    
    if (!Res && !::MQLInfoInteger(MQL_OPTIMIZATION))
    {
      ::Print(CurrencyProfit + " = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = " + AccountCurrency);
      
      ::TesterStop();
    }
  }
};

CURRENCY_CHECK CurrencyCheck; // No permite probar las variantes lentas

2018.07.01 00:00:00   TER = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = USD
TesterStop() called on 0% of testing interval
 
// El script establece la comisión para todas las posiciones con beneficio distinto de cero.
#property script_show_inputs

input double inCommission = 0.004; // Comisión en porcentaje por ronda (0,004 - 20 unidades por lado por millón)
input bool inAdd = false;          // true - se añade al valor actual, false - se fija el valor

#include <Symbol.mqh>

string CommissionToString( const double TickValue )
{
  const double Commission = 1 - TickValue;
  
  return("Commission = " + DoubleToString(Commission * 100, 5) + "% per round (" + DoubleToString(Commission * 1000000 / 2, 1) + " per million (one side))");
}

void OnStart()
{
  const SYMBOL Symb;
  
  if (Symb.IsCustom())
  {
    const double TickValue = Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE);
    const double NewTickValue = inAdd ? TickValue * (1 - inCommission / 100) : 1 - inCommission / 100;
    
    if ((MessageBox(Symb.Name + "\nBefore: " + CommissionToString(TickValue) +
                   "\nAfter: " + CommissionToString(NewTickValue) + "\n\n Do you agree?", "Commission Change", MB_YESNO) == IDYES) &&
        Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, NewTickValue))
      MessageBox(Symb.Name + ": current " + CommissionToString(Symb.GetProperty(SYMBOL_TRADE_TICK_VALUE)));
  }
}


Todavía no funciona.

 

Si no es mucha molestia, me gustaría un ejemplo de cómo utilizar correctamente la biblioteca de símbolos para generar un símbolo personalizado - digamos 1/EURUSD = USDEUR.

Me gustaría saber cómo copiar correctamente el historial de ticks disponible y cómo generar cada tick en un nuevo gráfico, para que todo sea correcto en la ventana "Market Watch", es decir, para que el gráfico USDEUR sea lo más parecido posible a los gráficos normales, tanto para el trabajo en línea como para las pruebas en el probador.

gracias de antemano

 
Igor Makanu:

Si no es mucha molestia, me gustaría un ejemplo de cómo utilizar la biblioteca de símbolos correctamente para generar un símbolo personalizado - que sea 1/EURUSD = USDEUR

Me gustaría saber cómo copiar correctamente el historial de ticks disponible y cómo generar cada tick en un nuevo gráfico, para que todo fuera correcto en la ventana "Market Watch", es decir, para que el gráfico USDEUR fuera lo más parecido posible a los gráficos habituales tanto para trabajar online como para hacer pruebas en el tester.

gracias de antemano

// 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 = ReversePrice(Tick.bid);
  Tick.ask = ReversePrice(Tick.ask);
  Tick.last = ReversePrice(Tick.last);
}

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);
}
 
fxsaber:

Gracias.

Voy a mirar en él esta noche, tengo un problema diferente, pero necesito un ejemplo sencillo para entender lo que su biblioteca puede hacer.

----------------------------------


ejecuté el ejemplo // Ejemplo de creación de un símbolo invertido

todo está claro, es fantástico que en un par de líneas puedas obtener un verdadero carácter personalizado mediante programación, ¡muy chulo!

SUS: en la build 1158 apareció una advertencia durante la compilación:

expresión no booleana Symbol.mqh 192 17

en el fichero Symbol.mqh método bool IsCustom( void ) const
 
Igor Makanu:

SZY: en la compilación 1158 apareció una advertencia durante la compilación:

expresión no booleana Symbol.mqh 192 17

en el archivo Symbol.mqh método bool IsCustom( void ) const

Se me olvido actualizar, ya tengo mucho código propio en KB, que decir de los comodines de mi carpeta MQL....

Actualizado.

 
fxsaber:

Actualizado.

actualizado:

0 error(es), 0 warning(s), tiempo de compilación: 1220 mseg

todo OK, ¡gracias!
 

¡Hola!

¿Es posible copiar futuros por lista en un símbolo personalizado con la información temporal desplazada? La información de tiempo tendrá que ser desplazado debido a la necesidad de tener colas de baja liquidez de los futuros, que pueden afectar el cálculo de los indicadores durante la transición a un nuevo futuros.

Sólo quiero pegar los futuros uno tras otro, como es de hecho - toda su historia, y en el Asesor de Expertos sólo hacer puntos en las fechas de los períodos en que el comercio no se lleva a cabo.
 
Aleksey Vyazmikin:

¡Hola!

¿Es posible copiar futuros por lista en un símbolo personalizado con la información temporal desplazada? La información de tiempo tendrá que ser desplazado debido a la necesidad de tener colas de baja liquidez de los futuros, que pueden afectar el cálculo de los indicadores durante la transición a un nuevo futuros.

Sólo quiero pegar los futuros uno tras otro, como es de hecho - toda su historia, y en el Asesor de Expertos sólo hacer puntos en las fechas de los períodos en que el comercio no se lleva a cabo.

Si hay datos de origen y un algoritmo de encolado, entonces, por supuesto, existe tal posibilidad. Sólo tiene que escribir la formación de archivo de garrapatas de un nuevo símbolo. La formación de un símbolo personalizado con esta historia se hará de la misma manera que en los ejemplos de esta rama.


La única cosa es que usted necesita para decidir sobre el precio de la formación de barras y en qué precios se ejecutarán las órdenes de mercado. Yo excluiría el último precio, pero cada uno es libre de decidir por sí mismo lo que necesita.

 
fxsaber:

Si hay datos de origen y el algoritmo de encolado, entonces, por supuesto, tal posibilidad está disponible. Basta con escribir la formación del archivo de ticks de un nuevo símbolo. Formación de un símbolo personalizado con esta historia se hará de la misma manera como en los ejemplos de esta rama.


Lo único es que usted necesita decidir sobre el precio de la formación de barras y a qué precios se ejecutarán las órdenes de mercado. Yo excluiría el último precio, pero cada uno es libre de decidir por sí mismo lo que necesita.

Por supuesto, los datos iniciales están en el terminal - futuros de años anteriores. ¿Qué significa formar un archivo de ticks? En general, me gustaría probar OHLC en M1, sin garrapatas adicionales, por así decirlo.

¿Por qué no me gustan los últimos precios? No entiendo sobre el precio de formación de barras de nuevo - barras de minutos están bien, a los precios originales. En general, necesito lo mismo que en un futuro por separado, y el hecho de que no coincidirá con el real en cualquier configuración, por lo que es claro - de acuerdo a mis observaciones es necesario poner 5 puntos en el menos en promedio, si la prueba en todos los ticks.

¿Me puede ayudar con un script de este tipo?