Wednesday 5 July 2017

Php Moving Average Script


Eu tenho um pequeno problema. Eu tenho laboratório virtual, um estudante irá completar uma pesquisa com 5 perguntas, cada um custa 2 pontos. Escolha ruim - 2 pontos, boa escolha 2 pontos. Então, no final, quando um aluno pressionar Mostra-me os resultados, eu quero que o script para atualizar o campo de mídia de usuários de tabela e atualizar o campo de nota do laboratório de tabela. Esse aluno receberá mais resultados, mas se ele tiver o resultado 4, a média deve ser 4, sem considerar outros resultados. Eu anexado um script PHP, ele não funciona, ele didnt calcular média que eu quero. PS: media significa média, nota significado resultado ou nota, suma significando soma, nrnote significado número de notas. Se eu executar select if (notalt4,4, AVG (nota)) como medie de laborator onde studentteodorescuyahoo mostra 4 thats errado. Eu não tenho 4 em minhas anotações. O que está errado aqui Se eu tiver um 4, a média retorna 4, é bom aqui. Perguntou Jul 3 11 at 15:16 fechado como pouco claro o que você está perguntando por tripleee. Andrewsi. HaveNoDisplayName. Himanshu. Alex Dec 19 15 at 5:10 Esclareça seu problema específico ou adicione detalhes adicionais para realçar exatamente o que você precisa. Como é atualmente escrito, é difícil dizer exatamente o que você está pedindo. Consulte a página Como pedir para obter ajuda para esclarecer esta questão. Se esta pergunta puder ser reformulada para se adequar às regras na Central de Ajuda. Por favor, edite a pergunta. Não funciona, ele didn39t calcular a média que eu want. quot O que ele calcula então Quais são os resultados Há algum erro ndash user456814 Jul 3 11 at 15: 25AFL Scripting Host NOTA IMPORTANTE. Desde a introdução do laço nativo e declarações de controle de fluxo como if-else e enquanto na versão 4.40 o significado do script foi muito reduzido. Atualmente, a maioria das tarefas que exigem scripts em versões anteriores podem ser manipuladas na AFL nativa. Whats mais AFL loops são 3-6 vezes mais rápido do que JScriptVBScript. O AFL scripting host é uma interface entre o mecanismo AFL e os mecanismos JScriptVBScript (também conhecidos como Active Scripting Technologies) disponíveis como parte da plataforma de tecnologias de amplificação da Internet fornecida pela Microsoft. Ele permite que você crie as fórmulas que têm partes no código AFL e partes em JScriptVBScript. Requisitos AmiBroker 3.59 ou superior Mecanismos Microsoft JScriptVBScript instalados Os motores Microsoft JScriptVBScript vêm com o Internet Explorer 4 ou superior (Windows 98, Millenium, 2000 tem incluído no sistema operacional). No entanto, é aconselhável instalar a versão mais recente do Internet Explorer (5.5) ou baixar e instalar a versão mais recente do Windows Scripting Host (5.5) da Microsoft: A documentação do JScriptVBScript pode ser encontrada na página de scripting oficial em: msdn. microsoftscripting Ativando o AFL Scripting Host Se você quiser usar scripts dentro de suas fórmulas você tem que chamar a função EnableScript () no início de sua fórmula. A função tem um parâmetro de entrada - nome do motor: a partir de então, você será capaz de incorporar as peças escritas em linguagem de script em suas fórmulas. O começo e o fim do script devem ser marcados com as seqüências lt e gt, como mostrado no exemplo abaixo: quotnormalquot declarações AFL buy cross (macd (), 0) sell cross (0, macd ()) lt. Seu código de script aqui. Gt quotnormalquot Declarações de AFL comprar ExRem (comprar, vender) Atualmente, a única maneira de trocar as informações entre a parte de AFL e parte de script é usar variáveis. O host de script AFL expõe um objeto (predefinido, sem necessidade de criação) chamado AFL. O objeto AFL tem uma propriedade parametrizada (padrão) chamada Var (varname) que pode ser usada para acessar variáveis ​​AFL do lado do script: Como Var é a propriedade padrão, você pode omitir seu nome e escrever simplesmente AFL (varname) como mostrado no exemplo Abaixo: Na AFL existem três tipos de dados possíveis: array (de números de ponto flutuante), um número (ponto flutuante) e uma string. Os motores VBScript e JScript usam tipos de dados variantes que podem conter qualquer tipo de variável, incluindo três usados ​​pela AFL. Como na AFL, você não declara variáveis ​​em linguagens de script, o tipo é determinado pela primeira atribuição. No caso do VBScript você pode getets AFL variáveis ​​de qualquer tipo suportado usando a sintaxe mostrada acima. Mas no JScript, devido à diferença fundamental no manuseio de arrays em JScript (elementos de matriz em JScript são implementados como properites dinâmicos de um objeto de matriz), você precisa usar o seguinte código para obter o valor da matriz AFL na matriz JScript: O GetArray ) Mostrada acima facilita a conversão da matriz segura do tipo automação em matriz JScript. Este exemplo mostra também como definir e usar funções no JScript Atribuir variáveis ​​AFL a partir de arrays do lado do script é muito mais simples, AFL scripting host detecta arrays JScript e pode obter seu conteúdo diretamente: Todos os outros tipos de dados são tratados da mesma forma em JScript e VBScript Iterando através de arrays Uma das tarefas mais básicas que todo mundo provavelmente faria é iterar através de array. No VBScript isso pode ser feito usando For..To..Next instrução, em JScript usando para () instrução. Ambas as construções precisam saber o tamanho da matriz ou o número de elementos na matriz. No VBScript você deve usar a função UBound (arrary) para obter o limite superior da matriz, no JScript você apenas usa a propriedade length da matriz. Os exemplos a seguir mostram isso. (Por favor, lembre-se de que as matrizes VBScript e JScript são baseadas em zero). A) Exemplo de indicador - média móvel exponencial: b) Exemplo de parada de lucro-alvo Aqui vem o exemplo da fórmula que percebe a meta de lucro na porcentagem fixa de 10 Do preço de compra. Note que a condição de compra é satisfeita quando o preço atinge um novo patamar, por isso acontece várias vezes após a compra inicial. Portanto, ValueWhen (comprar, fechar) não pode dar-lhe preço de compra inicial e esse tipo de regra comercial não poderia ser implementado na própria AFL. Mas, com script não há problema. Mais informações Mais exemplos de scripts estão disponíveis na biblioteca on-line da AFL em: amibrokerlibrarylist. php Em caso de dúvidas, comentários e sugestões, entre em contato com: supportamibroker. Observe que o script AFL é bastante avançado tópico e você deve jogar um pouco com AFL primeiro antes de ir muito fundo em scripting. Im tentando recuperar o último EMA de um grande conjunto de dados (15000 valores). Trata-se de um algoritmo com muitos recursos, já que cada valor depende do anterior. Aqui está o meu código: O que eu já fiz: Isolar k para que ele não é computado 10000 vezes Mantenha apenas o mais recente EMA computado, e não manter todos eles em um uso de matriz para () em vez de foreach () a matriz de dados não tem chaves É uma matriz básica Isso me permitiu reduzir o tempo de execução de 2000ms para cerca de 500ms para 15000 valores O que não funcionou: Use SplFixedArray (), isso raspou apenas 10ms executando 1.000.000 valores Use extensão PHPTrader. Isso retorna uma matriz contendo todas as EMAs em vez de apenas o mais recente, e sua escrita mais lenta e executando o mesmo algoritmo em C e executá-lo mais de 2.000.000 de valores leva apenas 13ms Então, obviamente, usando um compilado, linguagem de nível inferior parece ajudar P Onde Devo ir a partir daqui O código será finalmente executado no Ubuntu, de modo que a linguagem devo escolher Will PHP ser capaz de chamar e passar um argumento tão grande para o script pediu Jul 11 ​​14 at 19:21 Claramente a implementação com uma extensão dá-lhe um Significativo. Além disso, o cálculo pode ser melhorado como ele próprio e que o ganho você pode adicionar em qualquer idioma que você escolher. É fácil ver que lastEMA pode ser calculado da seguinte forma: Isto pode ser reescrito da seguinte forma para tirar o máximo possível do loop: Para explicar a extração do k acho que na formulação anterior é como se todos os Os dados brutos originais são multiplicados por k praticamente você pode multiplicar o resultado final. Observe que, reescrita desta maneira, você tem 2 operações dentro do loop em vez de 3 (para ser preciso dentro do loop, há também i incremento, i comparação com classificaç~ao sizeata e lastEMA), desta forma você pode esperar obter um Aceleração no intervalo entre os 16 e 33. Além disso, há outras melhorias que podem ser consideradas pelo menos em algumas circunstâncias: Considere apenas os últimos valores Os primeiros valores são multiplicados várias vezes por k1m 1 - k para que o seu contributo pode ser pouco ou mesmo ir Sob a precisão de ponto flutuante (ou o erro aceitável). Esta idéia é particularmente útil se você pode fazer a suposição de que os dados mais antigos são da mesma ordem de magnitude que o mais recente, porque se você considerar apenas os últimos n valores o erro que você faz é err EMAofdiscardeddata (1-k) n. Portanto, se a ordem de magnitude é amplamente a mesma, podemos dizer que o erro relativo feito é relerr err lastEMA EMAofdiscardeddata (1-k) n lastEMA que é quase igual a simplesmente (1-k) n. Sob a suposição de que lastEMA é quase igual a EMAofdiscardeddata: Vamos dizer que você pode aceitar um erro relativo relerr você pode seguramente considerar apenas os últimos n valores onde (1 - k) n lt relerr. Significa que você pode pré-calcular (antes do loop) n log (relerr) log (1-k) e calcular tudo considerando somente os últimos n valores. Se o conjunto de dados é muito grande, isso pode dar uma aceleração sensata. Considere que para números de ponto flutuante de 64 bits você tem uma precisão relativa (relacionada à mantissa) que é 2-53 (cerca de 1.1e-16 e apenas 2-24 5.96e-8 para números de ponto flutuante de 32 bits) para que você não possa obter Melhor do que este erro relativo, então basicamente você nunca deve ter uma vantagem no cálculo de mais de n log (1.1e-16) log (1-k) valores. Para dar um exemplo se intervalo 2000, em seguida, n log (1.1e-16) log (1-22001) 36746. Acho que é interessante saber que cálculos extras iria perder dentro dos arredondamentos é inútil é melhor não fazer. Agora um exemplo para o caso onde você pode aceitar um erro relativo maior do que a precisão de ponto flutuante relerr 1ppm 1e-6 0.00001 6 dígitos decimais significativos que você tem n log (1.1e-16) log (1-22001) 13815 Eu acho que é bastante Número pequeno comparado a seus últimos números das amostras assim que nesse casos o speedup poderia ser evidente (Im que supor que a escala 2000 é significativa ou elevada para sua aplicação mas thi que eu não posso saber). Apenas outros poucos números, porque eu não sei quais são suas figuras típicas: relerr 1e-3 intervalo 2000 n 6907 relerr 1e-3 intervalo 200 n 691 relerr 1e-3 intervalo 20 n 69 relerr 1e-6 intervalo 2000 n 13815 relerr 1e - 6 gama 200 n 1381 relerr 1e-6 gama 20 n 138 Se a suposição lastEMA quase igual a EMAofdiscardeddata não pode ser tomada as coisas são menos fáceis, mas uma vez que a vantagem cam ser significativo pode ser significativo para continuar: temos de re-considerar o (1-k) o ponto central é calcular lastEMA (1-k) o ponto central é calcular lastEMA (1-k) EMAofdiscardeddata (sem realmente cálculo lastEMA ou EMAofdiscardeddata de curso) um caso é quando sabemos a priori que, por exemplo EMAofdiscardeddata lastEMA lt M (por exemplo M 1000 ou M 1e6) nesse caso n lt (log (relerrM)) log (1 - k) se você não pode dar qualquer número M você tem que encontrar um bom id Ea sobre-estimar EMA de dados descodificados lastEMA uma maneira rápida poderia ser tomar M max (dados) min (dados) Paralelização O cálculo pode ser reescrita de uma forma em que é uma simples adição de termos independentes: Então, se o linguagem de implementação suporta O conjunto de dados pode ser dividido em 4 (ou 8 ou n. Basicamente o número de núcleos de CPU disponíveis) e pode ser computada a soma de termos em cada pedaço em paralelo somando os resultados individuais no final. Eu não vou em detalhes com isso, uma vez que esta resposta já é terrivelmente longa e eu acho que o conceito já está expresso. Obrigado por este I39m usando isso em dados do mercado de ações, de modo que o fato de que os dados mais antigos estão na mesma ordem de magnitude como os dados mais recentes depende do período de tempo usado. Suponha um intervalo de 200, haverá uma variação muito maior nos preços em um período de tempo diário (200 dias) do que 5 minutos (16 horas). Vou experimentar com diferentes cenários em dados reais e simulados. Em dados novos, com um range lt 200, eu uso um conjunto de dados de 1000 elementos. Mas eu também fazer alguns testes de volta ao longo dos últimos anos, então eu ainda preciso carregar todo o conjunto de dados. Você ajudou para ambas as situações, obrigado ndash Lykegenes Jul 16 14 at 15:11 Construindo sua própria extensão definitivamente melhora o desempenho. Heres um bom tutorial do site Zend. Alguns números de desempenho: Hardware: Ubuntu 14.04, PHP 5.5.9, 1-core Intel CPU3.3Ghz, 128MB RAM (é um VPS). Antes (somente PHP, 16.000 valores). 500ms C Extensão, 16.000 valores. Extensão de 0,3 ms C (100 000 valores). Extensão 3.7ms C (500.000 valores). 28.0ms Mas Im memória limitada neste momento, usando 70MB. Vou corrigir isso e atualizar os números em conformidade.

No comments:

Post a Comment