[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 404

 
hoz:
1. Bem, se novos dados chegaram, isto é o que precisamos, não é?
2. Bem, sim, precisamos de dados da barra 0, é claro. MarketInfo() puxa os dados da barra de zero, é isso mesmo. Então por que compará-lo com algo mais?

3. Mesmo se houver um buraco na história, ele não afetará os cálculos atuais. Teria tido um impacto no momento em que o buraco estivesse lá. 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, eu cavei fundo, mas eu quero entender como me comportar melhor.

4. Você, Vadim, me disse que eu escrevi a função incorretamente acima:

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); // Некорректно! Что функция будет возвращать, если цена равна нулю?
}

Na sua opinião, o que há de errado nisso?

1. Se não há dados, mas não sabemos nada sobre isso? Ele retorna FALSO. Como deve ser avaliado? Nenhum dado ou um erro, ou ainda há dados?
2. Você tem que se reconciliar para resolver o problema do 1º item.
3. Você não considera a dinâmica do processo. Ligue o computador, o terminal. Todos os dados parecem ter chegado. Tudo convergia para a barra zero. Os sinais são encontrados. O negócio está feito. Acontece que nem todos os dados chegaram. Cinco minutos depois, temos as barras em falta com os números 1,2,3,4,5. O sinal desapareceu. O que fazer?

4. Eu o marquei em vermelho. Um possível erro de escolha de um identificador errado no interruptor ainda não foi resolvido. Escrevi acima como isso deve ser feito.

É inútil chamar a RefreshRates() sem esperar pelo resultado. Pode falhar por um longo tempo.

 
Olá a todos. Tenho uma pergunta a fazer. Eu negocio em várias contas (duas em uma corretora e uma em outra), então eu uso a melhor copiadora, é muito conveniente. Ela é instalada em uma conta (o exportador) em qualquer gráfico e copiada em outras contas (importadores), onde esta EA também é instalada no mesmo gráfico (se você colocá-la, no importador, em vários gráficos, ela abrirá tantos pedidos quantos forem necessários). Uma vez, quando eu quis verificar o trabalho com ele em uma das corretoras e estabelecer uma conta demo), em um momento maravilhoso, ele foi colocado espontaneamente em vários gráficos e, claro, abriu tantas ordens. Depois não prestei muita atenção e achei que era uma falha deste terminal de corretagem. Depois negociei por muito tempo nas contas mencionadas acima e nada parecido aconteceu. Mas ontem mesmo durante o comunicado à imprensa tal situação aconteceu novamente em uma das contas (para outra corretora, não aquela com exportador instalado). Em 6 gráficos foram colocados automaticamente conselheiros e o mais interessante foi que 16 pedidos foram abertos em um símbolo. Por que isso acontece e qual é a razão? É uma desvantagem do próprio Expert Advisor ou algum outro motivo? Existe alguma maneira de consertá-la? Obrigado de antemão.
 
// Зачем этот тормоз без обработки возвращаемого значения?

Quem faz tal pergunta?
 
hoz:

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


Não é errado, é apenas lamacento.

Término:

 if (ld_price != 0)
return (ld_price); 

Se ld_price = 0, a função retornará 0 por si só. Portanto, não precisamos de um cheque.

Esta é uma avaria:

 if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);

Também desnecessário. Você pode usar o MraketInfo() em todos os casos.

No final, a função se transforma em uma função MarketInfo() pura (se você remover todas as coisas desnecessárias).

 

Em princípio, teoricamente, estes são os lugares certos:

RefreshRates();
ld_price = Bid;
RefreshRates();
ld_price = Ask;

Nós não nos importamos com o que a RefreshRates() retorna, é importante que as variáveis Ask e Bid tenham os últimos valores conhecidos pelo terminal.

 

Olá!

Qual é a razão dos diferentes resultados do testador para a mesma EA?

O período testado, o par de moedas e o cronograma são os mesmos, mas os resultados obtidos hoje são muito diferentes dos anteriores, a EA parou de abrir posições longas.

Não sei se a culpa é das citações dos terminais ou se é o fim de semana. Talvez as pessoas conhecedoras possam abrir meus olhos para a razão óbvia?

 
skyjet:

Olá!

Qual é a razão dos diferentes resultados do testador para a mesma EA?

O período testado, o par de moedas e o cronograma são os mesmos, mas os resultados obtidos hoje são muito diferentes dos anteriores, a EA parou de abrir posições longas.

Não sei se a culpa é das citações do terminal ou se é o fim de semana. Talvez as pessoas conhecedoras possam abrir meus olhos para a razão óbvia?


Mesmo dois testes feitos em uma fila, um após o outro, podem ser diferentes, e isso é muito perceptível. O corretor muda o spread e os testes são feitos com um spread diferente. Uma mudança de um ponto é suficiente.

Se houve um teste anterior há muito tempo, talvez as configurações tenham se afrouxado.

 
Zhunko:

1. Se não há dados e ao mesmo tempo há todos esses dados, mas não sabemos nada sobre eles... Ele retorna FALSO. Como isto deve ser interpretado? Não há dados ou um erro, ou ainda há dados?

Não estou entendendo você. Vamos em ordem... Chamamos de RefreshRates(), não entraram dados... Mas existem dados. O que temos aqui é uma bagunça. Se os dados não vieram, os dados não estarão disponíveis ou não foram atualizados porque a variável de mercado não mudou... Há apenas duas opções.

Se a TRU retornar após ligar paraRefreshRates(), então os dados foram atualizados. E se ele retornar FELS, então ou eles não atualizaram, porque há um erro ou eles não atualizaram, porque os dados estão frescos e não precisam ser atualizados.

Portanto, entendo que isto pode ser visto da seguinte forma:RefreshRates() verifica os dados, se os dados não são novos, não atualiza os dados que não são novos, ou seja, não mudaram, e se são novos, atualiza. Portanto, você só pode contar com a bandeira devolvida pelaRefreshRates(). Você tem alguma outra opção?

Zhunko:

2. Você precisa se reconciliar para resolver o problema do 1º item.

Você disse isso:

Eu reconcilio os dados do servidor (MarketInfo()) com a barra zero. Esperando que eles sejam os mesmos.

Well MarketInfo() está puxando da barra zero como está... O que VOCÊ quer dizer com o acima?

Zhunko:

3. Você não considera a dinâmica do processo. Ligado ao computador, o terminal. Todos os dados parecem ter chegado. Tudo convergia para a barra zero. Os sinais são encontrados. O negócio está feito. Acontece que nem todos os dados chegaram. 5 minutos depois, temos as barras em falta com os números 1,2,3,4,5. O sinal desapareceu. O que fazer?

Decidi atualizá-lo novamente. Mas e se chamarmos RefreshRates() e ele atualizar os dados lentamente? Isto é, alguns dos cálculos serão realizados com alguns dados de mercado e outros com outros dados... O que então?

Zhunko:

4. Marcado a vermelho. Além disso, um possível erro de seleção do identificador errado no interruptor não é tratado. Eu escrevi acima como deve ser tratado.

É inútil chamar a RefreshRates() sem esperar pelo resultado. Pode falhar por um longo tempo.

Hm. Bem, se esperarmos por ela, a citação pode mudar. Existe aqui uma via de mão dupla?

RefreshRates(); // Por que este freio sem processamento de valor de retorno?

Você o menciona várias vezes, mas ainda sem detalhes específicos. Quero dizer, por mais que eu veja esta função normalmente utilizada, ela está logo antes do código onde as variáveis de dados do mercado são utilizadas e é só isso. Eles realmente não pensam sobre isso. Mas pensei sobre isso e decidi descobrir como fazer as coisas direito. Saber com certeza que tal e tal abordagem é de fato correta e funcionará em todas as condições normais.

Então Vadim, o que você quer dizer com esta expressão:

"

Por que este freio sem processar o valor de retorno"?

Como eles podem ser processados? Eu escrevi minha lógica acima, mas não obtive resposta. Eu o descrevi com bastante precisão e sem nenhuma variante.

 
Integer:


Não é errado, é apenas lamacento.

Término:

if (ld_price != 0)
    return (ld_price); 

Se ld_price = 0, a função retornará 0 por si só. Portanto, nenhum controle é necessário.

Por que eu faria isso? Basta acrescentar mais, para que a função retorne algum outro valor, o que significaria "Sem preço". Parece lógico. Quando eu joguei a função, estava pensando mais na lógica anterior, então não prestei atenção ao seu fim. E não entendo porque a função 0 retorna 0 por si só.
Inteiro:


Essa é a avaria:

if (fs_symbol == Symbol())
{
    RefreshRates();
    ld_price = Bid;
}
else
    ld_price = MarketInfo(fs_symbol, MODE_BID);

Também não é necessário. Você pode usar o MraketInfo() em todos os casos.

No final, a função se transforma em uma função MarketInfo() pura (se você remover todas as coisas desnecessárias).


E então por que perguntar (se estamos falando de preço de compra especificamente), se podemos sempre usar MarketInfo(fs_symbol, MODE_ASK) ? Afinal de contas, se você olhar dessa forma, ao se referir à Ask, não pode ter certeza de que ela é precisa neste momento?
 
Integer:

Não importa o que a função RefreshRates() retorna, é importante que as variáveis Ask e Bid tenham os últimos valores conhecidos pelo terminal.


Praticamente, precisamos de algo mais, tanto quanto eu entendo. E precisamos do último servidor Ask e Bid e não dos terminais locais. Certo?

Foi por isso que comecei uma discussão aqui, para entender de uma vez por todas como organizá-la de forma mais lógica e correta. Pois em teoria isto é correto, mas na prática...

Razão: