Símbolos personalizados. Erros, bugs, perguntas, sugestões. - página 20

 

Solução para o problema da troca automática de moedas com símbolos personalizados após um reinício do Terminal.

// Сервис корректирует валюты всех кастомных символов.
#property service

bool CorrectCurrency( const string Symb, const string Currency )
{  
  return(SymbolInfoInteger(Symb, SYMBOL_CUSTOM) && 
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_BASE, Currency) &&
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_MARGIN, Currency) &&
         CustomSymbolSetString(Symb, SYMBOL_CURRENCY_PROFIT, Currency));
}

void CorrectSymbols( void )
{
  const string Currency = AccountInfoString(ACCOUNT_CURRENCY);
  
  for (int i = SymbolsTotal(false) - 1; i >= 0; i--)
    CorrectCurrency(SymbolName(i, false), Currency);
    
  return;
}

void OnStart()
{
  CorrectSymbols();
}
 
Ao testar um símbolo personalizado, o preço do tick é ou não simulado para ele?
 
Irek Gilmutdinov:
Você pode me dizer, ao testar um símbolo personalizado, se o preço do tick é simulado ou não?

Deve simular. É mais rápido para verificar.

 
Não é modelagem para mim, é por isso que estou perguntando.
 
Alguém pode dizer algo sobre o problema que eu levantei?
 
jaffer wilson:
Alguém pode dizer algo sobre o problema que eu levantei?

Você já verificou o build 2145?

 

O preço do tick não é simulado no testador sobre o símbolo personalizado.

MT5 constrói 2145.

Eu crio GBPCAD_s personalizados, todos os campos são herdados do GBPCAD:

Carrego nele o histórico de minutos personalizados.

Então eu faço o teste de 100.000 USD de depósito e preços abertos.

Um simples Expert Advisor interroga o preço de um tick e abre uma posição:

void OnTick()
  {
//---
  static bool bOnce = true;
  datetime dtTime[1];
  if (bOnce && CopyTime(NULL, 0, 0, 1, dtTime) == 1 && dtTime[0] % 86400 == 0)
    {
    MqlTick stcTick;
    MqlTradeRequest stcRequest;
    MqlTradeResult  stcResult;
    ZeroMemory(stcRequest);
    ZeroMemory(stcResult);
    SymbolInfoTick(_Symbol, stcTick);
    stcRequest.symbol = _Symbol;
    stcRequest.type = ORDER_TYPE_BUY;
    stcRequest.action = TRADE_ACTION_DEAL;
    stcRequest.price = stcTick.ask;
    stcRequest.volume = 1;
    bool bSent = OrderSend(stcRequest, stcResult);
    
    bOnce = false;
    }
  
  PrintFormat("tv=%.5f, USDCAD=%.5f",SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE), 1/SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
  }

O preço do tick não muda em nada e não corresponde à taxa USDCAD naquele momento.

O histórico de GBPUSD e USDCAD é carregado somente depois que a posição é aberta, mas o preço do tick não é afetado.

Na captura de tela, o preço do tick corresponde a USDCAD = 1,3300, enquanto que deve ser = 1,0230:


 
Irek Gilmutdinov:

O preço do tick não é simulado no testador sobre o símbolo personalizado.

MT5 constrói 2145.

Eu crio GBPCAD_s personalizados, todos os campos são herdados do GBPCAD:

Carrego nele o histórico de minutos personalizados.

Então eu faço o teste de 100.000 USD de depósito e preços abertos.

Um simples Expert Advisor interroga o preço de um tick e abre uma posição:

O preço do tick não muda em nada e não corresponde à taxa USDCAD naquele momento.

O histórico de GBPUSD e USDCAD é carregado somente depois que a posição é aberta, mas o preço do tick não é afetado.

Na captura de tela, o preço do tick corresponde a USDCAD = 1,3300, enquanto que deve ser = 1,0230:


É muito provavelmente uma questão de baixar a história das atas, não os carrapatos.
Carregue os carrapatos!

 
Não há carrapatos, os testes são feitos a preços de abertura.
 
fxsaber:

Solução para o problema da troca automática de moedas com símbolos personalizados após um reinício do Terminal.

Não é necessário verificar e esperar que o terminal se conecte ao servidor? Lembro que houve casos em que, sem conexão, a moeda de depósito é desconhecida.

Por que fazer um retorno no final, onde ele acontece por si só? É inútil e desconfortável.

Razão: