Bibliotecas: Symbol - página 9

 
Stanislav Korotky:

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

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

A pilha deve corresponder ao Market Watch. Dessa forma, ela pode ser diferente do gráfico.

 
fxsaber:

Consequentemente, no Testador, você não conseguirá recriar o que vê no Terminal no símbolo original.

E aqui está o que você vê no Terminal.

As negociações são feitas "no ar". Os indicadores vão para a floresta. Apenas a demarcação do histórico de ticks.

 

Não entendo o que está errado, provavelmente a nova compilação 2515 está fazendo algo errado.

Aqui está o script:

#property copyright "IgorM"
#property link      "https://www.mql5.com/pt/users/igorm"
#property version   "1.00"
#property script_show_inputs

input int      History        = 1 e5;
input double   Weierstrass_A  = 0.33;
input double   Weierstrass_B  = 1.5;
input int      Weierstrass_N  = 10;
input double   Weierstrass_Koeff = 0.45;

#include <fxsaber\Symbol.mqh> // https://www.mql5.com/pt/code/18855
//+------------------------------------------------------------------+
//| Função de início do programa de script|
//+------------------------------------------------------------------+
void OnStart()
{
   const SYMBOL SymbDB("W" + _Symbol);
   datetime dt_end = TimeCurrent();
   if(!SymbDB.IsExist()) // Se o símbolo não for criado, sair
   {
      Alert("Error create Weierstrass func, symbol = ", "W" + _Symbol);
      return;
   }
   SymbDB.Off();
   SymbDB.CloneProperties(); // Copiou as propriedades
   if(CustomRatesDelete(SymbDB.Name, 0, dt_end) == -1)
   {
      Alert("Error CustomRatesDelete , GetLastError = ", GetLastError());
      return;
   }
// encontrar coeficientes para normalização
   int fw_MAX = INT_MIN, fw_MIN = INT_MAX;
   for(int i = 4 * History; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      if(wtmp > fw_MAX) fw_MAX = wtmp;
      if(wtmp < fw_MIN) fw_MIN = wtmp;
   }
   const int fw_knorm = fw_MAX - fw_MIN;

// criar um gráfico registrando ticks
   MqlTick ticks[];
   ArrayResize(ticks, History * 4);
   for(int i = 4 * History - 1; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      ticks[i].last = ticks[i].bid = ticks[i].ask = NormalizeDouble(1.0 + Weierstrass_Koeff * (2.0 * (wtmp - fw_MIN) / fw_knorm - 1), _Digits);
      ticks[i].bid -= _Point;
      ticks[i].time_msc = ticks[i].time = dt_end--;
      ticks[i].time_msc *= 1000;
      ticks[i].volume = 1;
      ticks[i].volume_real = 1.0;
      ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
   }
   CustomTicksAdd(SymbDB.Name, ticks);
   if(SymbDB.On()) // Incluído no Market Watch
      ChartOpen(SymbDB.Name, PERIOD_M1); // Abriu um novo gráfico de símbolos
}
//+------------------------------------------------------------------+
int FuncWeierstrass(const double Wa, const double Wb, const int WN, const int cnt)
{
   int result = 0;
   for(int i = 0; i <= WN; i++)
   {
      result += (int)(MathPow(Wb, i) * MathCos(MathPow(Wa, i) * M_PI * cnt));
   }
   return(result);
}
//+------------------------------------------------------------------+


tudo funciona, mas funciona apenas uma vez.

ao reiniciar, aparece uma tela preta "Waiting for update" (Aguardando atualização), que é resolvida com a exclusão manual do símbolo personalizado


O que não está funcionando corretamente? A biblioteca ou uma nova compilação do terminal?

 
Igor Makanu:

O que não está funcionando corretamente? A biblioteca ou a nova compilação do terminal?

Não sei. Não uso o TicksAdd.

 
fxsaber:

Eu não sei. Não uso o TicksAdd.

Acho que descobri, então o substituí em meu código

CustomTicksAdd(SymbDB.Name, ticks);

com

CustomTicksReplace(SymbDB.Name,0,TimeCurrent()*1000,ticks);

Parece funcionar agora quando o script é reiniciado, a única coisa é que não há valores de símbolo Ask/Bid na janela de visão geral do mercado, mas não é crítico.



UPD:

a ajuda deve ser lida com atenção, tudo funciona, mas o CustomTicksAdd funciona corretamente quando o símbolo é adicionado à visão geral do mercado, ou seja, ele deve ser usado assim

if(SymbDB.On()) // Incluído no Market Watch
   {
      CustomTicksAdd(SymbDB.Name, ticks);
      ChartOpen(SymbDB.Name, PERIOD_M1); // Abriu um novo gráfico de símbolos
   }
 

Deparei-me com um erro desagradável no MT - por algum motivo, ele não define SYMBOL_TRADE_TICK_SIZE. A depuração mostra que o valor correto é gravado na propriedade (por exemplo, 0,00001 para EURUSD), mas depois de criar um símbolo, ele contém 0.

Alguém já corrigiu esse problema? É um bug do MT ou uma especificidade da biblioteca de símbolos?

 
Stanislav Korotky:

Deparei-me com um erro desagradável no MT - por algum motivo, ele não define SYMBOL_TRADE_TICK_SIZE. A depuração mostra que o valor correto é gravado na propriedade (por exemplo, 0,00001 para EURUSD), mas depois de criar o símbolo, ele contém 0.

Alguém já corrigiu isso? É um bug do MT ou uma especificidade da biblioteca de símbolos?

Você vê apenas o "0" ou obtém o "0" depois de pesquisar a propriedade?

 
Stanislav Korotky:

Deparei-me com um erro desagradável no MT - por algum motivo, ele não define SYMBOL_TRADE_TICK_SIZE. A depuração mostra que o valor correto é gravado na propriedade (por exemplo, 0,00001 para EURUSD), mas depois de criar o símbolo, ele contém 0.

Alguém já corrigiu isso? É um bug do MT ou uma especificidade da biblioteca de símbolos?

Provavelmente, isso depende da sequência de configuração dos campos. Eu tenho isso assim.

    this.SetProperty(SYMBOL_DIGITS, this.Ticks.GetDigits());

    this.SetProperty(SYMBOL_TRADE_CONTRACT_SIZE, 1 e5); // https://www.mql5.com/ru/forum/330333#comment_14608694
    this.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);

    this.SetProperty(SYMBOL_TRADE_TICK_SIZE, this.GetProperty(SYMBOL_POINT));
 
fxsaber:

Provavelmente depende da sequência de atribuição de campo. Eu tenho isso da seguinte forma.

Eu uso a chamada CloneProperties, e ela tem essas linhas (na versão atual disponível ao público):

...
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
...

Aqui a sequência é ligeiramente diferente, mas os valores corretos são transferidos para o contrato e outras propriedades, o único problema é com o tamanho do tique.

 

Depois de chamar CloneProperties, escrevi essa bobagem:

    Symb.CloneProperties(_Symbol);
    if(SymbolInfoDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE) == 0)
    {
      CustomSymbolSetDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE, SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
    }

É assim que ele é aplicado normalmente. Mas isso é uma espécie de muleta.