Como importar bid/ask de outro par de moedas? - página 5

 
HosseinKOGO:

Este é GBPAUD H4 3.12.2018 dia inteiro! E eu não pulei para terminar desta vez.

A função de impressão pode perder alguns relatórios quando tem muito a imprimir?
Acho que outra questão poderia ser porque os carrapatos desses 3 instrumentos saem em milissegundos diferentes, então quando usamos a função start/OnTick no GBPAUD, ela apenas faz a função start sempre que o tick GBPAUD sai. E eu acho que seu código pode dizer para retornar todos esses 3 pares de preços quando não forem 0. Se for o caso, ele retorna sempre que todos os preços de compra/venda de todos os instrumentos saírem ao mesmo tempo exato.

Os dados parecem bem...

Você está certo sobre a função de impressão... Também vejo muitas linhas em falta em meus testes. Mas quando eu imprimo tudo para arquivar, nada fica faltando.

Aqui estão algumas informações sobre o código: o tempo de cada tick GBPAUD será usado para obter os tick mais recentes dos outros pares (até o mesmo tempo), portanto sempre retornará algo, não será zero.

Decidi colocar a função em uma classe, que deve ser mais arrumada. Veja em anexo. Coloque-a em sua pasta de especialistas, junto com sua EA. Esteja à vontade para modificá-la.

O exemplo a seguir mostra uma maneira de utilizá-la (as linhas destacadas são essenciais):

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

Então a chave realmente, é apenas esta linha:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Se ela retornar falsa, você terá que verificar no diário a mensagem de erro.

Arquivos anexados:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

Os dados parecem bem...

Você está certo sobre a função de impressão... Também vejo muitas linhas em falta em meus testes. Mas quando eu imprimo tudo para arquivar, nada fica faltando.

Aqui estão algumas informações sobre o código: o tempo de cada tick GBPAUD será usado para obter os tick mais recentes dos outros pares (até o mesmo tempo), então sempre retornará algo, não será zero.

Decidi colocar a função em uma classe, que deve ser mais arrumada. Veja em anexo. Coloque-a em sua pasta de especialistas, junto com sua EA. Esteja à vontade para modificá-la.

O exemplo a seguir mostra uma maneira de utilizá-la (as linhas destacadas são essenciais):

Então a chave realmente, é apenas esta linha:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Se ela retornar falsa, você terá que verificar no diário a mensagem de erro.

Obrigado por sua ajuda,

Copiei todas estas linhas em todas as áreas apropriadas. Mas como não entendo o código, por favor, me informe como colocar o Ask and Bid of SecondPair no Ask2,Bid2 e a mesma coisa para o ThirdPair.
Esta é a minha área global:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

E esta parte retorna 2 erros durante a compilação. O que devo fazer com eles?
SecondPair' - expressão constante exigida MyEA!.mq4
ThirdPair' - expressão constante exigida MyEA!.mq4

 
HosseinKOGO:

Obrigado por sua ajuda,

Eu copiei todas estas linhas em todas as áreas apropriadas. Mas como não entendo o código, por favor, me informe como colocar o Ask e Bid do SecondPair no Ask2,Bid2 e o mesmo para o ThirdPair.
Esta é a minha área global:

E esta parte retorna 2 erros durante a compilação. O que devo fazer com eles?
SecondPair' - expressão constante exigida MyEA!.mq4
ThirdPair' - expressão constante exigida MyEA!.mq4

Em seguida, declare seus outrosPairs da mesma forma que todos osPairs. E no OnInit, faça isso:

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

E para atribuir valores em Ask2, Bid2, Ask3, Bid3, faça isso no OnTick:

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

Em seguida, declare seus outrosPairs da mesma forma que todos osPairs. E no OnInit, faça isso:

E para atribuir valores em Ask2, Bid2, Ask3, Bid3, faça isso no OnTick:

Ele me dá 00 novamente :(
Minha área global:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

Diário:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: Erro GBPCAD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: Erro GBPUSD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPAUD tick número 221179, em 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: ==== Agora, carrapato do processo 221179



Onde eu estou enganado?
Sinto muito por minha habilidade de nível zero :D

 
HosseinKOGO:

Ele me dá 00 novamente :(
Minha área global:

OnInit:

OnDeinit:

OnTick:

Onde estou enganado?
Sinto muito pela minha habilidade de nível zero :D

OnInit - as 3 novas linhas devem ir antes de tudo.
 
HosseinKOGO:

Sinto muito pela minha habilidade de nível zero :D

É tudo sobre variáveis e funções, e a vontade de experimentar.
 
Seng Joo Thio:
OnInit - as 3 novas linhas devem ir antes de tudo.

Eu consegui. Mas é muito estranho: o temporizador desses dois pares extras não funciona...

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

Eu fiz isso. Mas é muito estranho: o temporizador desses dois pares extras não funciona...

Mostre-me a ea inteira, depois que você terminar de experimentar e ainda não conseguir descobrir o porquê. Posso dar uma olhada daqui a cerca de 8 horas :). Agora preciso de 😴... 😂
 
  1. Seng Joo Thio: OnInit - as 3 novas linhas devem ir antes de tudo.
    Não tente usar nenhum preço ou servidor relacionado a funções no OnInit (ou em carga), pois pode não haver conexão/carteira:
    1. O terminal é iniciado.
    2. Os indicadores/As são carregados. As variáveis estáticas e declaradas globalmente são inicializadas. (Não dependem de uma ordem específica).
    3. OnInit é chamado.
    4. Para os indicadores OnCalculate é chamado com qualquer histórico existente.
    5. Humanos podem ter que digitar senha, a conexão com o servidor é iniciada.
    6. Novo histórico é recebido, o OnCalculate é chamado novamente.
    7. Novo tick é recebido, OnCalculate/OnTick é chamado. Agora TickValue, TimeCurrent, informações de conta e preços são válidos.

  2. No MT4: A menos que o gráfico atual seja aquele par específico/TF referenciado, você deve lidar com o erro 4066/4073 antes de acessar os preços.
    Histórico de download no fórum de programação MQL4EA - MQL4 e MetaTrader 4 -MQL4
    Correção

    A função ligada a, abre um gráfico oculto para o símbolo/TF em questão (se ainda não estiver aberto), atualizando assim o histórico, e colocando temporariamente o símbolo emMarket Watch (se ainda não estiver lá), assim SymbolInfoDouble(symbol, SYMBOL_BID ) ou MarketInfo(symbol, MODE_BID ) também não retorna zero a primeira chamada.

 
William Roeder:
  1. Não tente usar nenhum preço ou servidor relacionado a funções no OnInit (ou em carga), pois pode não haver nenhuma conexão/carta:
    1. O terminal é iniciado.
    2. Os indicadores/As são carregados. As variáveis estáticas e declaradas globalmente são inicializadas. (Não dependem de uma ordem específica).
    3. OnInit é chamado.
    4. Para os indicadores OnCalculate é chamado com qualquer histórico existente.
    5. Humanos podem ter que digitar senha, a conexão com o servidor é iniciada.
    6. Novo histórico é recebido, o OnCalculate é chamado novamente.
    7. Novo tick é recebido, OnCalculate/OnTick é chamado. Agora TickValue, TimeCurrent, informações de conta e preços são válidos.

  2. No MT4: A menos que o gráfico atual seja aquele par específico/TF referenciado, você deve lidar com o erro 4066/4073 antes de acessar os preços.
    Histórico de download no fórum de programação MQL4EA - MQL4 e MetaTrader 4 -MQL4
    Correção

    A função ligada a, abre um gráfico oculto para o símbolo/TF em questão (se ainda não estiver aberto), atualizando assim o histórico, e colocando temporariamente o símbolo emMarket Watch (se ainda não estiver lá), assim SymbolInfoDouble(symbol, SYMBOL_BID ) ou MarketInfo(symbol, MODE_BID ) também não retorna zero a primeira chamada.

Você está certo. Mas não se preocupe, porque a única coisa que fazemos no OnInit, aqui, é inicializar arrays para armazenar nomes de símbolos e preparar algumas alças de arquivos para ler nossos próprios arquivos de dados. Quanto às ofertas e pedidos de preços (ou seja, dados 'tick'), só os acessamos no OnTick, e principalmente também de nossos próprios arquivos de dados, uma vez que o testador de estratégia MT4 sempre retorna zeros quando consultado sobre tais dados de outros símbolos (note que este comportamento difere da recuperação de dados OHLC, com os quais as pessoas estão mais familiarizadas).

Razão: