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

 
Chiripaha:

: )))))))) Sim - isso mesmo. Todas as reprovações são aceitas! - Por isso, peço desculpas novamente. - São todas as conseqüências de um desenvolvimento forte (através de exercícios especiais)

criativo, imaginativo, poético, etc. - mesmo assim, existem dois hemisférios em um ser humano: criativo e racional. Minha culpa é que eu o vi e não o corrigi.

Portanto, todas as suas reivindicações são verdadeiras e eu sou culpado.

Mas apenas a questão permanece sem solução...

Como resolvê-lo no final?

Se você acha que eu não ouvi nada, por favor, esclareça. Entendo a técnica de feedback (por poder "ouvir"), mas ainda não vi uma solução.

Como obter o número certo sem arredondamento em Duplo, até a 3ª casa decimal, por exemplo no valor de Ask = 1.20667 ?- Uma solução como "StrToDouble(DoubleToStr(Ask,3)) = 1,2100 // 1,2100 é o resultado (ou seja, arredondamento)" não funcionou.

Obrigado antecipadamente por sua tolerância e compreensão.

DoubleToStr(Pergunte,3) !!! - Isso era algo para se ver.

E a solução está no arquivo (é um roteiro de teste).

Arquivos anexados:
test_ind.mq4  2 kb
 
alsu:

Veja o seu código.... Você está muito confuso))))

Não entendo bem porque precisamos acumular carrapatos, porque é suficiente armazenar em memória (ou até não armazenar, porque a barra atual deve ser escrita em HST - caso contrário o gráfico não será atualizado) parâmetros da barra atual - seis números TOHLCV, e atualizá-los conforme necessário no recebimento do carrapato, e fazer o corte das barras por uma determinada condição (TimeCurrent()-O>1).

Tente reformular o código desta forma, ele será reduzido em 8 vezes, eu o garanto (eu o verifiquei:)


Assim? Reformulou o algoritmo, removeu o acumulador, converteu-o para Expert Advisor, adicionou gradação de carrapatos para em alta, adicionou caudas de castiçal usando um algoritmo diferente, comentou tudo. Não tenho nada com que checar, não há carrapatos no fim de semana. Quanto ao volume - parece-me que estava em FileFlush, ele funciona com o buffer. Para o futuro, recuso-me a colocar qualquer coisa entre FileSeek e FileFlush.
Arquivos anexados:
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Pergunte,3) !!! - isto deveria ter sido visto.

E a solução está no arquivo (é um roteiro de teste).


Muito obrigado.

Ainda não entendo o mecanismo - por que na minha versão não funcionou e por que "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Aparentemente, nem todas as características das funções são divulgadas no manual.

Sua função foi analisada - entendi a forma como foi resolvida. Mas eu tinha certeza de que deveria haver uma maneira "mais simples" de resolvê-lo, pois o conjunto de funções em uma linguagem de programação é projetado para resolver problemas típicos com elas, em vez de criar estas funções típicas para cada usuário em si. Eu ingenuamente assumi que a DoubleToStr() resolve exatamente este problema. - Não entendo então a utilidade de usá-la (quais são suas nuances). Sou um usuário comum, não um programador, para "descer a tais detalhes". Quando utilizar produtos de criação neste caso, se todo o tempo será gasto em programação detalhada.

Mais uma vez, obrigado. Agora vou tentar colocar tudo isso no código. Esperamos que tudo isso funcione.

 
Chiripaha:

Muito obrigado.

Eu ainda não entendo o mecanismo - por que minha versão não funcionou e por que "DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits)" - Aparentemente, nem todas as características das funções são divulgadas no livro de referência.

Sua função foi analisada - entendi a forma como foi resolvida. Mas eu tinha certeza de que deveria haver uma maneira "mais simples" de resolvê-lo, pois o conjunto de funções em uma linguagem de programação é projetado para resolver problemas típicos com elas, em vez de criar estas funções típicas para cada usuário em si. Eu ingenuamente assumi que a DoubleToStr() resolve exatamente este problema. - Não entendo então a utilidade de usá-la (quais são suas nuances). Sou um usuário comum, não um programador, para "descer a tais detalhes". Quando utilizar produtos de criação neste caso, se todo o tempo será gasto em programação detalhada.

Mais uma vez, obrigado. Agora vou tentar colocar tudo isso no código. Esperamos que tudo isso funcione.

DoubleToStr() realiza uma conversão com um número em duas etapas: primeiro arredonda (de acordo com as regras da matemática) o número para o sinal certo e depois o converte para uma cadeia.
 

Experimente seu caso

duplo x = MathFloor(y*1000)/1000;

 
IgRU4ek:
DoubleToStr() realiza a conversão para um número em duas etapas: primeiro arredonda (por regras matemáticas) o número para o sinal certo e depois o converte para uma cadeia.


Obrigado pelo esclarecimento. Eu não sabia disso, é claro, e estava culpando StrToDouble() neste caso. Mas depois de seu esclarecimento, presumo agora que ambos estão arredondando :(

Por que o arredondamento não é claro. Se o arredondamento fosse necessário, seria melhor neste caso, em primeiro lugar, usar alguma função de arredondamento (conforme necessário) - a mesma normalização. Então haveria ambas as possibilidades com arredondamento e sem arredondamento. Caso contrário, teríamos uma desordem desnecessária. Além disso, não entendo por que ele é arredondado quando preciso apenas fazer um número existente de um tipo diferente. Eu já o tenho (um número), por que eu deveria complementá-lo.

 
Roger:

Experimente seu caso

duplo x = MathFloor(y*1000)/1000;


Exatamente! Essa é uma boa solução. Eu já vi isso antes, mas perdi algo no meu caso. Muito obrigado, Alexander, muito obrigado também! - Agora eu terei 2 soluções! : )) (Para o desenho animado "Prostokvashino")
 

Uma questão tão teórica. O preço final, em termos de carrapato, é um lance ou um pedido do último carrapato na vela? Notei que se a oferta for escrita em Close[0], então a citação na corrediça é a mesma que na ata.

Pensei sobre isso... Lance na idéia...

 
Zhunko:
Muitos erros. Talvez você devesse olhar para um exemplo e fazer isso por analogia?


Basicamente, a mesma coisa. Meu entendimento, embora não haja nada sobre isso no tutorial, é que a inclusão é necessária apenas como um link entre o Expert Advisor e a biblioteca.

A função é importada na linha, e as funções a serem importadas são declaradas. Você coloca um sinal . entre as declarações;

Aqui eu escrevi um inlude e uma biblioteca (com apenas uma função, mas é apenas para testes).

A inclusão está aqui:

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

Quando todas as funções necessárias (usadas por coruja específica) forem declaradas, coloque#importar no final

Aqui está a própria biblioteca:

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

Ele nem sequer se compila.

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

Você não declara nada na biblioteca e não tem erros, mas eu declaro, por alguma razão. Eu não vi nenhuma diferença.

 

Victor, você tem muitas variáveis em sua função e nenhuma declarada.

O compilador disse:

variável não definida

Uma variável não é definida. São 18 deles.

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

A julgar pelo projeto da função, é uma função altamente especializada. Por que você o colocaria na biblioteca? Especialmente porque provavelmente será chamado no loop em cada barra.

Você estava dizendo algo sobre velocidade e otimização. Você está criando um código muito lento. Na MQL4 não se deve colocar funções em loop. Quanto menos chamadas de função em um loop, mais rápido o código é executado.

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

Há muito tempo atrás, quando comecei a escrever na MQL4, escrevi meu primeiro indicador de índice forex. Lá também havia funções, operações com cordas... Que bagunça... Levei 5 minutos para trocar os TFs.

Depois sentei-me e pensei, eliminei todas as funções e as abri bem no bloco de laço. Trabalho eliminado com cordas, substituindo-as por identificadores. Tudo o que podia ser calculado com antecedência e que não mudou - foi assim que eu calculei (otimização). Mudou o código para Expert Advisor. Como resultado, o cálculo mais pesado ao trocar os TFs foi de 15 segundos. Em seguida, transferi os cálculos para a DLL. Agora leva cerca de 5 segundos.