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

 
rajak:

Olá a todos!

Você pode aconselhar, se alguém souber qual é o problema, depois de compilar o arquivo ex4 não aparece, através do metalang também. O que posso fazer a respeito, e há alguns dias tudo estava funcionando bem.

A compilação funciona sem erros, mesmo que você os apresente propositalmente.

Se você tem janelas7, tente procurar na pasta virtual

c:UtentesSua pastaAppDataSua pastaAppDataSalocal\VirtualStore\Arquivos de programas (x86)pastaMT4Peritos

Ao invés de sua pasta e pasta MT4, substitua seus diretórios reais.

 
lottamer:

Há algum tempo, pessoas gentis me disseram como fazer a função "bilhete de retorno da última posição fechada" a partir da função "bilhete de retorno das duas últimas posições fechadas".

E quando precisei da função "ingressos de três posições fechadas", não pude (por semelhança e método de seleção) implementá-la

ajude, por favor,

você pode ver que há duas cópias, a segunda com algumas mudanças, mas eu pude continuar...

Tenho esta variante para o terceiro bilhete... e devolve o bilhete da primeira posição novamente por algum motivo...


Substitua

if(OrderTicket()==A && (OrderTicket()==B) )continue;

para

if(OrderTicket()==A || (OrderTicket()==B) )continue;

Só não está claro o que você está fazendo para retornar três valores de uma função

 
Roger:


Substitua

em

Só não está claro o que você está fazendo para retornar três valores de uma função



o objetivo é calcular o resultado das últimas posições N. para isso eu chamo seus bilhetes, e então é uma questão de técnica

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


Substituir por

para


Funcionou! Honestamente, eu tive esta idéia de substituir OR por AND...., mas ... :)))))))))))))))))))))

obrigado! agora entendo a lógica, embora para contar 15 fechados, terei que soprar o código até o tamanho de um balão!

tudo isso pode ser espremido em um loop ? e apenas substituir o parâmetro do número de negócios necessários N ?

 
Zhunko:

1. você não deve fazer isso. Ela expressa até minha admiração por seu algoritmo. Esse é o HENRYFIX. Naquela época, ele tinha um apelido diferente.

O prefixo do nome do roteiro são as primeiras letras de nossos apelidos.

===============

2. Dmitry, não importa o que aconteça, estou sinceramente feliz que você tenha resolvido algum problema secreto com algum algoritmo secreto, que não está sujeito a divulgação.

3. Tudo parecia muito misterioso. Obrigado por se vangloriar. Você é sem dúvida o programador mais legal neste fórum e talvez até mesmo em todo o universo!

1. Oh sim! depois de descobrir que era o seu código, ou o de seu amigo. Abalde, era o mais fodido e embaraçoso, agora se tornou imediatamente admirável.

2. Com o que sou um programador, o que sei e como sei e posso fazer, com o que não sei e não sei - vou lidar com isso de alguma forma.

3. A tarefa não é absolutamente secreta, é absolutamente clara, ela foi definida abertamente aqui. Todos os que são capazes de entendê-lo, o entenderam de uma vez sem problemas. Foi resolvido não por alguns métodos secretos e mágicos, mas pelos padrões habituais e óbvios (e mundialmente conhecidos). Eu não estou me gabando aqui, e para você, milagre, estou rindo. Somente sua megalomania o impede de entender e perceber isto.

 
Integer:

1. Oh sim! depois que acabou sendo o seu código, ou o de seu cônjuge. Abaldez, era o mais fodido e embaraçoso, agora é imediatamente admirável.

2. Com o que sou um programador, o que sei e como sei e posso fazer, com o que não sei e não sei - vou lidar com isso de alguma forma.

3. A tarefa não é absolutamente secreta, é absolutamente clara, ela foi definida aqui de forma aberta. Todos os que são capazes de entendê-lo, o entenderam de uma vez sem problemas. Foi resolvido não por alguns métodos secretos e mágicos, mas pelos padrões habituais e óbvios (e mundialmente conhecidos). Eu não estou me gabando aqui, e para você, milagre, estou rindo. Somente sua megalomania o impede de entender e perceber isso.




Vocês, vão esfregar em outro lugar! As pessoas estão resolvendo problemas PRÁTICOS aqui... e vocês estão jogando o fio com emoção...
 
lottamer:


Vocêsvão esfregá-lo em outro lugar! as pessoas estão resolvendo problemas PRÁTICOS aqui. você está jogando o fio com emoção...


Por que você está me escrevendo sobre isso? Pegue Junko e escreva que, é seu quarto dia aqui ele não consegue entender do que estamos falando, todos os outros entenderam no primeiro dia.
 

Naturalmente, tem que haver limites para qualquer debate. Caso contrário, pode já ultrapassar os limites da razoabilidade.

Após ambas as posições terem sido declaradas, as partes podem ou não concordar. - Esse é o direito deles. Mesmo se as pessoas estiverem erradas. Todos têm o direito de estar errados.

Se for um debate público, como este, então quem assiste vê os argumentos de cada lado e, independentemente do consenso alcançado (ou não) sobre a questão, todos têm a oportunidade de escolher sua versão da solução (ou ambas).

Mas recorrer a acusações e apelos ao indivíduo (ao invés da tarefa, a questão, o caso) já é diminuir a credibilidade de alguém. É desnecessário e condenável (por insultar uma pessoa).


Uma vez que os argumentos e as formas de resolver o problema já foram expostos há muito tempo, sugiro que ambos os lados parem com esta questão e apelem um para o outro.

Aparentemente, se os debatedores são profissionais na resolução de questões programáticas, eles são novatos no debate. O que não está fora de linha com o tópico da linha, mas permite que seja dado aconselhamento profissional. Espero que este conselho seja atendido.

 
Integer:

1. Oh sim! depois que acabou sendo o seu código, ou o de seu cônjuge. Abaldez, era o mais fodido e embaraçoso, agora é imediatamente admirável.

2. Com o que sou um programador, o que sei e como sei e posso fazer, com o que não sei e não sei - vou lidar com isso de alguma forma.

3. A tarefa não é absolutamente secreta, é absolutamente clara, ela foi definida abertamente aqui. Todos os que são capazes de entendê-lo, o entenderam de uma vez sem problemas. Foi resolvido não por alguns métodos secretos e mágicos, mas pelos padrões habituais e óbvios (e mundialmente conhecidos). Eu não estou me gabando aqui, estou rindo de você, milagre. Somente sua megalomania o impede de entender e perceber isto.

1. Você sabe a diferença entre um código e um algoritmo? Além disso, o algoritmo não tem nada a ver com a abertura da janela do gráfico. Eu consertei o código, é claro. O local onde a tabela se abre não mudou virtualmente. Não havia outra maneira de fazer isso naquela época. Eu o fiz de uma maneira diferente na DLL. É mais confiável.

2. Isso foi ótimo! Você é o melhor!

3:

FAQ:

1) Problema : cada roteiro (EA) tem que estar ciente da presença de todos os outros.

2) Problema: se houver um fracasso, os globais do fracassado serão pendurados desocupados e a fila ficará presa.

3) Solução :

Cada exp exp exp expõe 1 globalka com nome - prefixo comum + alavanca de janela + símbolo. valor da globalka é o tempo do último tick nesse instrumento. 2 global comum com sua própria alça (depois de trabalhar, escreve sua própria alça ou a limpa se for a mais antiga)

A fila é organizada em ordem ascendente (alças), o mais alto define o segundo globale a zero

em cada exp, criamos três arrays (por falta de estruturas) - símbolo/manual/último tempo de acesso/último tempo de carrapato.

todos os EXPs mantêm registro de (último tempo de acesso/último tempo de registro) para todos eles e assim que são diferentes (um dos EXPs falha) ambos os globais do EXP falhado são excluídos e o EXP é considerado inativo. suas células nas matrizes são excluídas (a matriz é reconstruída).

a fila é restaurada

isto será realmente feito pela EA de pé no gráfico mais ativo (carrapatos freqüentes).

quando desinicializada normalmente, cada expo limpará depois de si mesma.

max skip - um carrapato.

ZS. e em geral, é melhor fazer uma moeda única

Portanto, isto é graças às habilidades telepáticas de Rustam. É um problema hipotético e uma solução hipotética. O que isso tem a ver com seu problema? Você nunca disse nada sobre isso. Tive que bisbilhotar. A resposta é nada mais que profanidade em vez de palavras construtivas, que você continua sugerindo, mas não implementa.

Eu tive um desafio semelhante em 2008. Os segredos não servem, como alguns. Vou dar um exemplo concreto de que tipo de problema, como resolvê-lo, e porque acho que resolver tais problemas desta maneira não é bem sucedido.

============================

Os dados iniciais do problema:

1. A tarefa tem vários Expert Advisors com laços idênticos. Isto é, roscas totalmente independentes.

2. Existe um banco de dados de coeficientes dividido em 8 grupos, que é acessado por alguns especialistas. O tamanho do DB começa a partir de 2 Gb.

3. DB às vezes é reabastecido. Reabastecido em períodos múltiplos de 2 horas. O tempo de processamento depende de múltiplos períodos do dia. A duração varia de 5 minutos a 45 minutos, dependendo da multiplicidade do tempo do dia e da capacidade da CPU.

Tarefa:

Uma vez que complementar o banco de dados leva muito tempo, apenas um especialista deve ser responsável por complementar o banco de dados. Caso contrário, talvez você não consiga esperar pelo seu término.

2. É necessário proibir o acesso ao banco de dados enquanto ele estiver sendo atualizado. Faça isso em grupos, para não retardar significativamente a atualização dos coeficientes, com os quais os especialistas trabalham.

Especialistas que trabalham com coeficientes, que estão sendo atualizados atualmente, devem trabalhar com coeficientes antigos.

Especialistas que foram trocados para um grupo específico de coeficientes durante o período de atualização devem trabalhar com um único coeficiente e informar sobre ele. Quando a atualização terminar, eles deverão mudar para o novo coeficiente. O mesmo se aplica ao ponto 3.

Solução na época:

1. É feita uma fila comum de identificadores de especialistas que consiste em seus índices.

2. É feita uma fila de identificadores de especialistas, que acessam o banco de dados, que consiste em seus índices.

As duas filas são um recurso comum. O acesso às filas é sincronizado por um único objeto de sincronização.

O primeiro especialista da segunda fila é responsável pela atualização do banco de dados. 4.

5. Além disso, é quase como Rustam descreveu. É um pouco mais fácil devido à implementação em DLL.

Os identificadores são os índices através de índices. Quando apagamos um Expert Advisor, o identificador é removido da fila. A reindexação não é realizada. Os demais especialistas deixarão seus índices.

Ao adicionar um novo especialista, se o índice do último especialista não corresponder ao seu número, é atribuído o primeiro índice antigo gratuito. Caso contrário, são atribuídos novos índices.

Não é necessária a vinculação ao descritor e ao instrumento gráfico. Além disso, não há necessidade de se manter a par de uma falha de descarga. Nunca houve um fracasso. Mesmo que isso tenha acontecido, não é um desastre. A EA continuaria a trabalhar com os antigos rácios. Na próxima atualização, o controlador do contador de atualização não teria detectado nenhuma atualização e largado a identificação da EA principal da segunda fila. O próximo especialista pegaria a missão do mestre. O mesmo controlador faria a mesma coisa quando o Expert Advisor entrasse no modo de conexão de banco de dados. Ou seja, ele entra na segunda fila. Isto é, somente especialistas trabalhando com M1, onde o valor do coeficiente não é crítico, seriam afetados.

Tal solução cumpriu plenamente a tarefa, mas não gostei muito dela por causa da ligação dos Conselheiros Especialistas entre si e da tarefa incomum para o Conselheiro Especialista, que estava alimentando o banco de dados, o que não contribui para a confiabilidade. Naquela época, eu não sabia e não sabia como fazer muitas coisas. Um ano mais tarde, eu o redizi.

Solução 2:

O banco de dados é mantido em uma linha separada, onde ele se reabastece em um temporizador.

2. O acesso ao banco de dados no momento de seu reabastecimento é protegido pelo objeto de sincronização.

Tudo se tornou muito mais simples. Sem filas de espera. Mas eu também não gostei muito. Antes de um reabastecimento, o banco de dados chamou o script de troca de citações que às vezes levava ao transbordamento da memória. O que diminuiu muito a velocidade do MT4. Naquele tempo, o MT4 trabalhava com 2 GB de memória. Agora está funcionando com 4GB.

Solução 3:

1. DB é uma aplicação separada. Isto é, outro processo com sua própria memória dedicada, independente do MT4.

2) A DB está se reabastecendo.

O intercâmbio de dados ocorre por meio de mapeamento. Aumentou a velocidade da troca de dados e o reabastecimento do banco de dados. Antes, tudo era lido a partir do disco. Era impossível fazer isso de outra forma. A memória de trabalho de МТ4 é muito limitada.

4. O histórico é bombeado pelo MT4 remotamente a partir da aplicação DB, onde você o chuta conforme necessário. Qualquer falha do MT4 - seu descarregamento e carregamento subseqüente.

5. O ponto 4 é feito através da criação de um link simbólico para o diretório MT4 atual. Ou seja, é uma cópia completa do atual MT4. O histórico é atualizado diretamente nos diretórios MT4, sem esperar pelo upload do MT4 em funcionamento.

6. Sincronização do acesso ao banco de dados no momento de sua atualização através do mutex, pois a seção crítica funciona apenas para um processo.

========================

Portanto, Dmitry, sem conhecer sua tarefa, você pode supor que ela pode ser resolvida sem organizar filas e manter os fios do Expert Advisor independentes. Ele aumentará a confiabilidade e o desempenho geral. Já venho falando sobre isso (independência dos fios) há várias páginas.

 

Desculpe. Nenhuma resposta a isso:

Integer:

É uma unidade de acesso atômico e sem sincronização. Não faz sentido abordar apenas o depósito desta forma. A chamada de qualquer uma das funções dos parâmetros de depósito será atômica por si só, sem nenhum ajuste. Se você o faz atomicamente, todo o trabalho do Expert Advisor. É assim que você resolve problemas - você pensa que fez algo, mas na verdade é uma ilusão.

Dmitry, você não deve pensar que só os tolos estão por perto. A partir da pergunta de Sergey, você pode ver que ele tem uma boa compreensão do problema.

Naturalmente, uma simples referência aos parâmetros do depósito com sincronização não tem sentido. A sincronização é necessária para alterar estes parâmetros. Para que o Expert Advisor paralelo receba o parâmetro correto que já foi alterado, em vez de recebê-lo no processo de mudá-lo.

Razão: