Características del lenguaje mql5, sutilezas y técnicas - página 62

 
Vasiliy Pushkaryov:
¿Tienes una foto de cómo quedaría? No está muy claro, todavía no he utilizadoOBJ_CHART

No hay ninguna imagen. Pero se puede construir a mano. Seleccione Insert -> Objects -> Graphic Objects -> Chart y después de insertar OBJ_CHART así, seleccione "Draw object as background" en las propiedades del objeto, deshabilitando las escalas.

 
fxsaber:

No hay ninguna imagen. Pero se puede construir a mano. Seleccione Insert -> Objects -> Graphic Objects -> Graphic y después de insertar OBJ_CHART así, seleccione "Draw object as background" en las propiedades del objeto, deshabilitando las escalas.


Gracias, se ve bien

 

En el modo de depuración, no se puede conocer el valor devuelto por una función o expresión.

Por ejemplo

void OnStart()
{
  double Angle = 1;
  double d = MathSin(Angle / 2) * MathSin(Angle * 2);
}

Por ejemplo, lo que devuelven las funciones asignadas.


Yo utilizo (no sólo en modo de depuración) este modo

template <typename T>
T MyPrint( const T Value, const string Str )
{
  static const bool IsDebug = MQLInfoInteger(MQL_DEBUG);

//  if (IsDebug)
  {
//    DebugBreak(); // если хочется посмотреть средствами дебага

    Print(Str + " = " + (string)Value);
  }
  
  return(Value);
}

#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)

void OnStart()
{
  double Angle = 1;
  double d = _P(MathSin(Angle / 2)) * _P(MathSin(Angle * 2));
}


Resultado

void OnStart(), Line = 21: MathSin(Angle/2) = 0.479425538604203
void OnStart(), Line = 21: MathSin(Angle*2) = 0.9092974268256817
 

Estructura del resultado de la comprobación de la solicitud de operación (MqlTradeCheckResult)

Descripción del campo

Campo

Descripción

balanza

Valor del saldo que habrá después de la ejecución de la operación

equidad

Valor de la equidad, que será después de la ejecución de la operación

margen

Margen necesario para la operación comercial requerida

margen_libre

La cantidad de capital que quedará después de la ejecución de la operación requerida

nivel_de_margen

El nivel de margen que se establecerá tras la ejecución de la operación requerida

Estos campos se corresponden con la línea de la pestaña Comercio


Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура результата проверки торгового запроса
  • www.mql5.com
Прежде чем отправить торговому серверу запрос на торговую операцию, рекомендуется провести его проверку. Проверка осуществляется функцией OrderCheck(), которой передается сам проверяемый запрос и переменная типа структуры MqlTradeCheckResult. В эту переменную и будет записан результат проверки.
 
fxsaber:

Estos campos se corresponden con la línea de la pestaña Comercio


Los mismos valores muestran el estado actual, pero ¿no es la estructura la que devuelve los valores calculados que habrá después de la ejecución de la operación?

 
Artyom Trishkin:

Los mismos valores muestran el estado actual, pero ¿no es la estructura la que devuelve los valores calculados que habrá después de la ejecución de la operación?

Muestra los valores calculados que habría en esta fila si se ejecutara la orden de negociación.

 

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

Biblioteca de clases genéricas - errores, descripción, preguntas, peculiaridades de uso y sugerencias

Renat Fatkhullin, 2017.12.08 23:34

No tenemos una estructura MqlDeal, ya que los formatos de los registros comerciales son flotantes y se amplían periódicamente. Sin esto, es imposible ampliar la funcionalidad de la plataforma.

Por lo tanto, la única opción es acceder a ellos a través de la función Get. Y el acceso a otros campos del registro previamente afectado es muchas veces más rápido que el primer acceso, porque el registro se almacena en caché.

En la prueba anterior, los números de las operaciones son nuevos cada vez, lo que hace que se pierda continuamente el caché de la operación seleccionada anteriormente.

 

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

MT5 vs MT4. Tasa de llenado de la matriz.

Renat Fatkhullin, 2017.12.12 12:19

1) La idea es errónea, las matrices locales no se llenan más rápido (a grandes rasgos, sin bajar a nivel de micro)

2) Las matrices deben llenarse rápidamente mediante las funciones de inicialización normales

3) Para maximizar la velocidad, es mejor mantener el array como un vector (unidimensional), así tienes más posibilidades de optimizar el acceso. Porque la multidimensionalidad limita mucho los marcos obligatorios y obliga al compilador a hacer un cálculo constante extra de los índices multidimensionales.

4) Las matrices de acceso rápido deben mantenerse estáticas, lo que reduce drásticamente la cantidad de comprobaciones de valores atípicos

 

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

Apertura de posición de venta en mql5

fxsaber, 2017.12.12 21:56

// true - not for trade by market-orders
bool IsBadFilling( const string Symb )
{
  return(!(SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE) & (SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK)));
}

void OnTick()
{
  if (IsBadFilling(_Symbol))
  {
    Print("Change symbol " + _Symbol + " or server " + AccountInfoString(ACCOUNT_SERVER) + " for trade by market!");
    
    ExpertRemove();    
  }
}


Resultado

2017.12.05 00:00:00   Change symbol EURUSD or server AMPGlobalClearing-Demo-CQG for trade by market!

Permite averiguar rápidamente por qué los mercados no se abren en el probador. Tal vez sea el mal comportamiento del probador para que las órdenes de mercado estén prohibidas así y las pendientes no.


Sugiero que cuando SYMBOL_FILLING_MODE sea cero, el probador sustituya este valor por(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK). Es decir, permitió la negociación completa cuando el corredor no especificó el campo de símbolo apropiado.

 
// Опознает кривые COPY_TICKS_INFO-тики
// Отсутствие цены (высохшая сторона стакана - нулевая цена) не признается валидной ситуацией
bool IsTickInfoBad( const MqlTick &Tick )
{
  return(!Tick.ask || !Tick.bid || Tick.last || Tick.volume || ((Tick.flags & (0x7F ^ (TICK_FLAG_ASK | TICK_FLAG_BID))) != 0));
}

#define  DEFINE_FIELD(A)             \
  if (!Ticks[i].##A)                \
    Ticks[i].##A = Ticks[i - 1].##A

// Корректирует ошибочные COPY_TICKS_INFO-тики
void CorrectTicksInfo( MqlTick &Ticks[] )
{
  const int Size = ArraySize(Ticks);
  
  for (int i = 1; i < Size; i++)
    if (IsTickInfoBad(Ticks[i]))
    {
      DEFINE_FIELD(bid);
      DEFINE_FIELD(ask);      
      
      Ticks[i].last = 0;
      Ticks[i].volume = 0;
      Ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
    }
}
Recomiendo hacer algo así cada vez después de CopyTicks(COPY_TICKS_INFO), para que el TS no vacíe accidentalmente la cuenta.