Características da linguagem mql5, subtilezas e técnicas - página 62

 
Vasiliy Pushkaryov:
Você tem uma foto de como seria? Não muito claro, eu ainda não useiOBJ_CHART

Não há fotografia. Mas você pode construí-lo à mão. Selecione Insert -> Objects -> Graphic Objects -> Chart e depois de inserir OBJ_CHART assim, selecione "Draw object as background" nas propriedades do objeto, desativando escalas.

 
fxsaber:

Não há fotografia. Mas você pode construí-lo à mão. Selecione Insert -> Objects -> Graphic Objects -> Graphic e depois de inserir OBJ_CHART assim, selecione "Draw object as background" nas propriedades do objeto, desativando escalas.


Obrigado, parece fixe.

 

No modo de depuração, você não pode saber o valor retornado por uma função ou expressão.

Por exemplo

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

Por exemplo, o que as funções alocadas retornaram.


Eu uso (não apenas no modo de depuração) desta forma

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
 

Estrutura do resultado da verificação da solicitação de comércio (MqlTradeCheckResult)

Descrição do campo

Campo

Descrição

balanço

Valor do saldo que será após a execução da operação de negociação

patrimônio líquido

Valor do capital próprio, que será após a execução da operação

margem

Margem necessária para a operação comercial requerida

margin_free

O montante de capital próprio que restará após a execução da operação exigida

nível_da_margem

O nível de margem que será definido após a execução da operação comercial requerida

Estes campos correspondem à linha no separador Comércio


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

Estes campos correspondem à linha no separador Comércio


Os mesmos valores mostram o estado atual, mas a estrutura não está retornando os valores calculados que estarão lá depois que a troca for executada?

 
Artyom Trishkin:

Os mesmos valores mostram o estado atual, mas a estrutura não está retornando os valores calculados que estarão lá depois que a troca for executada?

Mostra os valores calculados que estariam nesta linha se a ordem de negociação fosse executada.

 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Biblioteca de classes genéricas - bugs, descrição, perguntas, peculiaridades de uso e sugestões

Renat Fatkhullin, 2017.12.08 23:34

Não temos estrutura MqlDeal, uma vez que os formatos dos registos comerciais são flutuantes e em expansão periódica. Sem isso, é impossível estender a funcionalidade da plataforma.

Portanto, a única opção é acessá-los através da função Obter. E o acesso a outros campos do registro anteriormente afetado é muitas vezes mais rápido do que o primeiro acesso, pois o registro está em cache.

No teste acima, os números da troca são novos a cada vez, o que continuamente joga fora o cache da troca previamente selecionada.

 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

MT5 vs MT4. A velocidade de enchimento das matrizes.

Renat Fatkhullin, 2017.12.12 12:19

1) A ideia está errada, as matrizes locais não se enchem mais rapidamente (grosso modo, sem descer ao nível micro)

2) As matrizes precisam ser preenchidas rapidamente através de funções normais de inicialização

3) Para maximizar a velocidade, é melhor manter a matriz como um vetor (unidimensional), para que você tenha mais chances de otimizar o acesso. Porque a multidimensionalidade limita-o estritamente a quadros obrigatórios e obriga o compilador a fazer um cálculo extra constante de índices multidimensionais.

4) As matrizes para acesso rápido devem ser mantidas estáticas, o que reduz drasticamente a quantidade de cheques para outliers

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Abertura da posição de venda em 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 que você descubra rapidamente porque os mercados não estão abrindo no testador. Talvez seja o mau comportamento do testador ter ordens de mercado banidas desta forma e ordens pendentes não.


Eu sugiro que quando SYMBOL_FILLING_MODE é zero, o testador deve substituir este valor por(SYMBOL_FILLING_IOC | SYMBOL_FILLING_FOK). Isto é, permite a negociação completa quando o corretor não especifica o campo de símbolo apropriado.

 
// Опознает кривые 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;
    }
}
Eu recomendo fazer algo assim todas as vezes após o CopyTicks(COPY_TICKS_INFO), para que o TS não drene acidentalmente a conta.