Bibliotecas: 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; // Não permite que as variantes lentas sejam testadas

2018.07.01 00:00:00   TER = SYMBOL_CURRENCY_PROFIT != ACCOUNT_CURRENCY = USD
TesterStop() called on 0% of testing interval
 
// O script define a comissão para todas as posições com lucro diferente de zero.
#property script_show_inputs

input double inCommission = 0.004; // Comissão em porcentagem por rodada (0,004 - 20 unidades por lado por milhão)
input bool inAdd = false;          // true - adicionado ao valor atual, false - valor definido

#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)));
  }
}


Ainda não está funcionando.

 

Se não for muito incômodo, gostaria de um exemplo de como usar a biblioteca Symbol corretamente para gerar um símbolo personalizado - que seja 1/EURUSD = USDEUR.

Gostaria de saber como copiar corretamente o histórico de ticks disponível e como gerar cada tick em um novo gráfico, para que tudo fique correto na janela "Market Watch", ou seja, para que o gráfico USDEUR fique o mais próximo possível dos gráficos regulares, tanto para trabalho on-line quanto para testes no testador.

Agradecemos antecipadamente

 
Igor Makanu:

Se não for muito trabalhoso, gostaria de um exemplo de como usar a biblioteca Symbol corretamente para gerar um símbolo personalizado - que seja 1/EURUSD = USDEUR

Gostaria de saber como copiar corretamente o histórico de ticks disponível e como gerar cada tick em um novo gráfico, para que tudo esteja correto na janela "Market Watch", ou seja, para que o gráfico USDEUR seja o mais próximo possível dos gráficos usuais, tanto para trabalho on-line quanto para testes no testador.

Desde já, obrigado

// 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 = 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); // Abriu o gráfico
}

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

Obrigado!

Vou dar uma olhada nisso hoje à noite, pois tenho um problema diferente, mas preciso de um exemplo simples para entender o que sua biblioteca pode fazer.

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


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

tudo está claro, é fantástico que, em algumas linhas, você possa obter um caractere personalizado real e ao vivo de forma programática, algo muito legal!

SUS: na compilação 1158, apareceu um aviso durante a compilação:

expression not boolean Symbol.mqh 192 17

No método do arquivo Symbol.mqh, bool IsCustom( void ) const
 
Igor Makanu:

SZY: Na compilação 1158, apareceu um aviso durante a compilação:

expression not boolean Symbol.mqh 192 17

no método bool IsCustom( void ) const do arquivo Symbol.mqh

Esqueci de atualizar, já tenho muito código próprio no KB, o que dizer sobre os wilds da minha pasta MQL...

Atualizado.

 
fxsaber:

Atualizada.

atualizado:

0 erro(s), 0 aviso(s), tempo de compilação: 1220 msec

Tudo OK, obrigado!
 

Olá!

É possível copiar futuros por lista em um símbolo personalizado com deslocamento de informações de tempo? As informações de tempo terão que ser deslocadas devido à necessidade de ter caudas de baixa liquidez de futuros, o que pode afetar o cálculo de indicadores durante a transição para um novo futuro.

Quero apenas colar os futuros, um após o outro, como de fato é - todo o seu histórico, e no Expert Advisor apenas marcar as datas dos períodos em que a negociação não é realizada.
 
Aleksey Vyazmikin:

Olá!

É possível copiar futuros por lista em um símbolo personalizado com deslocamento de informações de tempo? As informações de tempo terão que ser deslocadas devido à necessidade de ter caudas de baixa liquidez de futuros, o que pode afetar o cálculo de indicadores durante a transição para um novo futuro.

Quero apenas colar os futuros um após o outro, como é de fato - todo o seu histórico, e no Expert Advisor apenas fazer pontos nas datas dos períodos em que a negociação não é realizada.

Se houver dados de origem e um algoritmo de colagem, então, é claro, existe essa possibilidade. Você só precisa escrever a formação do arquivo de ticks de um novo símbolo. A formação de um símbolo personalizado com esse histórico será feita da mesma forma que nos exemplos desse ramo.


A única coisa é que você precisa decidir sobre o preço de formação da barra e a que preços as ordens de mercado serão executadas. Eu excluiria o último preço, mas cada um é livre para decidir por si mesmo o que precisa.

 
fxsaber:

Se houver dados de origem e algoritmo de colagem, então, é claro, essa possibilidade estará disponível. Você só precisa escrever a formação do arquivo de ticks de um novo símbolo. A formação de um símbolo personalizado com esse histórico será feita da mesma forma que nos exemplos desse ramo.


A única coisa é que você precisa decidir sobre o preço de formação da barra e a que preços as ordens de mercado serão executadas. Eu excluiria o último preço, mas cada um é livre para decidir por si mesmo o que precisa.

Obviamente, os dados iniciais estão no terminal - futuros de anos anteriores. O que significa formar um arquivo de ticks? Em geral, eu gostaria de testar o OHLC em M1, sem ticks extras, por assim dizer.

Por que não gosto dos últimos preços? Não entendo o preço de formação da barra novamente - as barras de minutos estão bem, com os preços originais. Em geral, preciso da mesma coisa que em um futuro separado, e o fato de que ele não coincidirá com o real em nenhuma configuração, então está claro - de acordo com minhas observações, é necessário colocar 5 pontos no menos, em média, se estiver testando em todos os ticks.

Você pode me ajudar com esse script?