Bibliotecas: Symbol - página 8

 
Stanislav Korotky:

A oferta de compra e a oferta de venda não deveriam ser trocadas?

Para evitar que o spread seja negativo, sim.

 
fxsaber:
// Exemplo de criação de um símbolo invertido

Neste exemplo, tenho um gráfico de um símbolo personalizado aberto sem histórico. E o desenho das barras começa somente a partir dos ticks atuais.

Como fazer com o histórico?

+

expression not boolean  Symbol.mqh      192     17
 
ilvic:

Neste exemplo, tenho um gráfico de um símbolo personalizado aberto sem histórico. E o desenho das barras começa somente a partir dos ticks atuais.

Como fazer isso com o histórico?

+

Os exemplos neste tópico são uma demonstração visual dos recursos da biblioteca para aqueles que gostam de programar.

Os scripts prontos para os usuários não são publicados no tópico.

 

Estou tentando criar um símbolo personalizado com um histórico que será atualizado em tempo real, com base no MA usual.

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

Os tiques não são importantes, mas sim os minutos.

Tentei este código.

// Exemplo de criação de um símbolo invertido

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

CUSTOMSYMBOL CustomSymb(StringSubstr(_Symbol, 3, 3) + StringSubstr(_Symbol, 0, 3) + StringSubstr(_Symbol, 6)); // Criou um 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); // Abriu o gráfico
}

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

Ele não funciona de jeito nenhum.

Algum especialista pode me dizer como criar corretamente um símbolo personalizado a partir do MA?

 
erotin:

Como criar corretamente um personagem personalizado a partir do MA?

#include <Symbol.mqh> // https://www.mql5.com/pt/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); // Criou um 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:

Obrigado.

Como adicionar mais 1 ano de histórico de leitura de MA a esse gráfico?

 
erotin:

Como posso adicionar mais um ano de histórico de leitura do mestrado a esse gráfico?

Todo o resto foi feito sem mim.

 
fxsaber:

ZY Medi isso minuciosamente no EURGBP. O ganho de tempo é de aproximadamente 2 vezes. As transações são totalmente coincidentes. Realmente grátis!

Verifiquei rapidamente o novo modo do Tester por pips. Resultados de execuções únicas.


Todas as moedas de símbolo estão definidas para a moeda da conta.

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).


A duração coincide com a margem de erro.

 

Se abrirmos uma conta demo no Swissquote-Server e executarmos esse script, obteremos a seguinte linha.

2020.03.26 08:53:12.567 5, 5

Isso significa que, no histórico de ticks, os preços Bid/Ask diferem em 5 pips daqueles transmitidos no Market Watch (há preços melhores lá do que no histórico).

Assim, no Testador, você não pode recriar o que vê no Terminal no símbolo original.


A única solução é usar um símbolo personalizado, que se baseia no demarcap correspondente do histórico de ticks.

 

E surgiu uma pergunta interessante: o mesmo problema não é observado com a pilha, ou seja, os preços na pilha são diferentes do gráfico?

Um usuário reclama comigo sobre a falta de sincronização do indutor baseado em BookEvent e do gráfico.