[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 403

 
solnce600:
Que botão ele usa para fazer você sorrir ou para se alegrar?

Urri não sabia disso, e eu também não sei o botão, mas às vezes abanamos a cauda ... :)))
 
lottamer:

2 horas tentando escrever uma peça de teste, para testar ainda mais diferentes condições.

Não funciona!

Por favor, me dê o erro.

a questão é que as ordens são abertas após 2pp em sua própria direção.

abre venda e termina...



Tudo parece estar logicamente correto! Somente atenção - todas as variáveis devem ser declaradas acima do início, incluindo a que está entre parênteses.
 
hoz:


Estou me perguntando por que existe uma condição aqui?


Há um loop de tempo, que em princípio poderia ser infinito, por isso foram tomadas medidas para facilitar a retirada da EA da tabela ou o seu desligamento.

É melhor terminar se algo der errado, em vez de fazer um looping. No próximo tick, repita.

 
lottamer:

A função de Kim tem um parâmetro de tempo ="Data e hora em segundos desde 1970".

Eu experimentei 2 variantes.

e ambos dão um lucro não para o dia atual, mas um lucro completo ao longo de toda a história....

O dia atual começa no início da barra D1 atual (iTime (NULL, PERÍODO_D1, 0)), mas você não está procurando por caminhos fáceis? :)))
 
hoz:

Não entendo bem a lógica de escrever uma função separada. Afinal, a própria função RefreshRates() serve para atualizar dados de variáveis pré-definidas. E Bid and Ask são variáveis pré-definidas. Se a função RefreshRates() atualiza variáveis pré-definidas, por que escrever alguma função adicional?

Há ali uma peculiaridade:

bool RefreshRates( )

Atualização de dados em variáveis pré-definidas e matrizes de séries temporais. Esta função é utilizada quando um Expert Advisor ou roteiro tem realizado cálculos há muito tempo e precisa de dados atualizados. Ele retorna VERDADEIRO se os dados forem atualizados, caso contrário FALSO. Os dados não podem ser atualizados somente porque correspondem ao estado atual do terminal do cliente. Conselheiros especializados e roteiros trabalham com sua própria cópia de dados históricos. A cópia dos dados sobre o símbolo atual é criada no primeiro lançamento do Expert Advisor ou roteiro. A cada próximo lançamento do Expert Advisor (lembre-se que o roteiro é executado uma vez e não depende de ticks recebidos), a cópia inicialmente criada é atualizada. Enquanto o Expert Advisor ou roteiro estiver em execução, um ou vários tiquetaques novos podem chegar, para que os dados possam ficar desatualizados.

Os dados também não são atualizados instantaneamente. Isto tem que ser controlado.

 
Zhunko:

Há ali uma peculiaridade:

bool RefreshRates( )

Atualização de dados em variáveis pré-definidas e matrizes de séries temporais. Esta função é utilizada quando um Expert Advisor ou roteiro tem realizado cálculos há muito tempo e precisa de dados atualizados. Ele retorna VERDADEIRO se os dados forem atualizados, caso contrário FALSO. Os dados não podem ser atualizados somente porque correspondem ao estado atual do terminal do cliente. Conselheiros especializados e roteiros trabalham com sua própria cópia de dados históricos. A cópia dos dados sobre o símbolo atual é criada no primeiro lançamento do Expert Advisor ou roteiro. A cada próximo lançamento do Expert Advisor (lembre-se que o roteiro é executado uma vez e não depende de ticks recebidos), a cópia inicialmente criada é atualizada. Enquanto o Expert Advisor ou roteiro estiver em execução, um ou vários tiquetaques novos podem chegar, para que os dados possam ficar desatualizados.

Os dados também não são atualizados instantaneamente. Isto tem que ser controlado.


Com base na referência dada, vamos tomar o preço ASK. Se executarmos RefreshRates(), os dados nas matrizes de variáveis pré-definidas são atualizados. Se o preço ASC mudou, então depois de executarRefreshRates(), oASC assumirá o novo valor. E se isso acontecer:

Os dados não podem ser atualizados apenas porque correspondem ao estado atual do terminal do cliente.

então o valor ASC não foi alterado. Assim, o valor ASK anterior será utilizado no cálculo, como era, uma vez que não mudou.

Afinal, seRefreshRates() retorna o valor de TRU, significa que atualizou os dados com sucesso, então não há necessidade de verificá-los! Você não concorda?

 
hoz:


Com base nesta referência, vamos tomar o preço ASC. Se executarmos RefreshRates(), os dados nas matrizes de variáveis pré-definidas são atualizados. Portanto, se o preço ASC mudou, então depois de executarRefreshRates() oASC tomará o novo valor. E se for assim:

então o valor ASC não foi alterado. Assim, o valor ASK anterior será utilizado nos cálculos, que é o que era porque não mudou.

Afinal de contas, seRefreshRates() retorna o valor TRU, ele atualizou os dados com sucesso e não precisamos verificá-los! Você não concorda?

Não. Ele pode retornar FALSO e os dados estarão frescos.

A única razão pela qual os dados podem não ser atualizados é porque correspondem ao estado atual do terminal do cliente.

Você tem que encontrar uma indicação que lhe diga que os dados estão frescos. Pode ser diferente para diferentes tarefas.
 
Zhunko:

Não. Ele pode retornar FALSO e os dados estarão frescos.

Então há um erro óbvio na documentação? E a documentação não pode ser confiável?

Zhunko:

Você tem que encontrar uma indicação que lhe permita assumir que os dados estão frescos. Pode ser diferente para diferentes tarefas.

Suponha que estejamos falando do preço ASK. Temos duas variáveis:

ASC - Pedir valor apósRefreshRates().

_ASK - valor de Ask last conhecido.

_____________________________________________________________________________________

É difícil dizer. O que poderia ser o sinal aqui? Há duas possibilidades:

1. O valor da variável predefinida foi alterado. RefreshRates() retorna Verdadeiro.

2. O valor da variável predefinida não foi alterado. RefreshRates() retorna Falso.

Se olharmos para o outro lado, sobre como encontrar um sinal. Há 2 possibilidades:

1. O valor da variável predefinida foi alterado. Isto é, no nosso caso Ask = ASC

2. O valor da variável predefinida não foi alterado. Isto é, perguntar = _ASK

Há um valor alterado ou um valor inalterado, não há outra opção. O que você quer fazer então?

 
hoz:

Então há um erro gritante na documentação? E a documentação não pode ser confiável?

Digamos que estamos falando sobre o preço ASK. Temos 2 variáveis:

ASC - Pedir valor apósRefreshRates().

_ASK - valor de Ask last conhecido.

_____________________________________________________________________________________

É difícil dizer. O que poderia ser o sinal aqui? Há duas possibilidades:

1. O valor da variável predefinida foi alterado. RefreshRates() retorna Verdadeiro.

2. O valor da variável predefinida não foi alterado. RefreshRates() retorna Falso.

Se olharmos para o outro lado, sobre como encontrar um sinal. Há 2 possibilidades:

1. O valor da variável predefinida foi alterado. Isto é, no nosso caso Ask = ASC

2. O valor da variável predefinida não foi alterado. Isto é, perguntar = _ASK

Há um valor alterado ou um valor inalterado, não há outra opção. Como você quer proceder então?

A documentação está toda em ordem. Está exatamente descrito e foi isso que eu lhes indiquei.

TRUE é devolvido se os dados foram atualizados, caso contrário FALSE é devolvido. A única razão pela qual os dados podem não ser atualizados é porque eles correspondem ao estado atual do terminal do cliente.

Portanto, esta função diz apenas que novos dados foram recebidos.

Eu não sei como você quer fazer o resto. Eu verifico os dados do servidor (MarketInfo()) com barra zero. Espero que eles sejam os mesmos. A propósito, isto não garante que não haja um "buraco" na história do futuro próximo. Pode haver facilmente 1, 2 ou 3 barras ou várias barras em falta, e a barra zero estará lá. Às vezes eles vêm depois. Às vezes não o fazem.

 
Zhunko:

Ou seja, esta função diz que novos dados chegaram, mas é só isso.

Então, se novos dados chegarem, é isso que precisamos, não é?
Zhunko:

Eu comparo os dados do servidor (MarketInfo()) com a barra de zero. Espero que eles sejam os mesmos. A propósito, isso não garante que não exista um "buraco" na história mais próxima. Pode haver facilmente 1, 2 ou 3 barras ou várias barras em falta, e a barra zero estará lá. Às vezes eles vêm mais tarde. Às vezes não.

Bem, sim, precisamos dos dados da barra 0. MarketInfo() puxa os dados da barra de zero, é isso mesmo. Por que devemos verificar isso com outra coisa?
Zhunko:

A propósito, ela não garante a ausência de um "buraco" na história mais próxima. Pode haver facilmente 1, 2 ou 3 barras ou várias barras em falta e zero estará lá. Às vezes eles vêm mais tarde. Às vezes não.

Mesmo que haja uma lacuna na história, ela não afetará os cálculos atuais. Teria sido no momento do buraco. Isto é, se obtivermos o Ask atual, não nos importamos realmente com os preços de vários bares atrás (não formalmente, mas com o momento atual em relação a uma determinada variável do mercado, porque a função RefreshRates() fará o truque em relação ao momento atual no tempo no 0º bar!

É claro que estou cavando fundo, mas quero entender como me comportar melhor.

Você, Vadim, disse que eu escrevi incorretamente a função acima, vou duplicá-la novamente, com linhas adicionadas:

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
   
    if (ld_price != 0)
        return (ld_price);
}

O que há de errado nisso em sua opinião?

Razão: