Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 204

 
STARIJ:

A travessia de MA ocorre entre barras - um exemplo claro

O MA nas barras à esquerda e à direita do cruzamento é diferente do preço no ponto de passagem. Entendo que o questionador quer o valor no ponto exato de cruzamento ao invés do valor em uma das barras adjacentes. Este valor exato pode ser obtido usando interpolação linear - porque o MA entre barras é construído como segmentos de linha reta. Ou tomar as coordenadas de cada MA em barras adjacentes. Construir analiticamente 2 linhas retas e calcular seu ponto de interseção. É possível calcular considerando 2 triângulos semelhantes. Surge uma pergunta contrária - por que precisamos dela? Os custos são proporcionais ao valor do resultado? Afinal, os pontos de interseção se moverão se os parâmetros MA forem mudados minimamente. O mais provável é que seja exigido pelo chefe do projeto do curso

Obrigado pelo esclarecimento, entendo que não é fácil de fazer
 
missha32:

Não consigo encontrar o erro em meus cálculos.
Preciso encontrar o alto e o baixo do dia anterior, mas por alguma razão o baixo foi no dia anterior

Melhor usar CopyHigh e CopyLow com período PERÍODO_D1 e barra ou tempo correspondente.

CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
CopyHigh - Доступ к таймсериям и индикаторам - Справочник MQL4
 
missha32: Eu preciso encontrar o alto e o baixo do dia anterior, mas por alguma razão o baixo é encontrado no dia anterior
  // iHigh и iLow дают макс и мин цены указанного бара. Если PERIOD_D1, то целых суток  если 1 то вчерашних последних завершенных суток

   Alert("Максимум вчерашнего дня = ", iHigh(_Symbol, PERIOD_D1, 1));
   Alert("Минимум  вчерашнего дня = ", iLow(_Symbol,  PERIOD_D1, 1));
Qualquer barra de qualquer intervalo de tempo contém informações generalizadas do intervalo correspondente das barras de intervalos de tempo inferiores: Máximo; Mínimo; Tempo de abertura igual ao tempo da primeira barra no intervalo; Tempo de fechamento igual ao tempo da última barra no intervalo; Volume igual à soma dos volumes das barras no intervalo. Mais precisamente, estas informações estão contidas nas respectivas matrizes
 
STARIJ:
Qualquer barra de qualquer Quadro de tempo contém informações generalizadas do intervalo correspondente das barras de intervalos de tempo inferiores: máximo, mínimo, tempo de abertura e fechamento e volume igual à soma dos volumes das barras inferiores. Mais precisamente, estas informações estão contidas nas matrizes correspondentes

Eu o faria, mas posso não ser capaz de calcular os dados usando um algoritmo adicional, pois posso ter que procurar por outros valores de ontem e será uma tarefa reescrever as funções novamente.

Se você pudesse me dizer onde está o erro em meu código, eu não o entendo. Quando tento exibir o número de barras todas encaixam, mas quando tento obter o máximo ou mínimo, ele não mostra o que deveria.

 
missha32:

Eu o faria, mas poderia não ser capaz de calcular os dados porque poderia ter que procurar outros valores de ontem e seria uma chatice reescrever as funções novamente.

Quando mostro o número de barras na tela, tudo converge, mas quando tento obter o máximo ou mínimo, não mostra o que deveria.

Você fez tanta confusão que eu nem consigo entender. Uma montanha de conversões de um para o outro.

E tudo para encontrar o máximo e o mínimo do dia?

Então, o que não está funcionando para você?

//+------------------------------------------------------------------+
double GetPriceMaximum(const string symbol_name,const ENUM_TIMEFRAMES timeframe,int shift){
   double array[1];
   ResetLastError();
   if(CopyHigh(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Ошибка копирования цены High: ",GetLastError());
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+
double GetPriceMinimum(const string symbol_name,const ENUM_TIMEFRAMES timeframe,int shift){
   double array[1];
   ResetLastError();
   if(CopyLow(symbol_name,timeframe,shift,1,array)==1) return(array[0]);
   Print(__FUNCTION__," > Ошибка копирования цены Low: ",GetLastError());
   return(WRONG_VALUE);
}
//+------------------------------------------------------------------+

Precisa descobrir os altos do dia? Por favor:

double max_price=GetPriceMaximum(Symbol(),PERIOD_D1,0);

Precisa descobrir o máximo de ontem? Fácil:

double max_price=GetPriceMaximum(Symbol(),PERIOD_D1,1);

Precisa saber o mínimo do dia antes de ontem? Não há problema:

double min_price=GetPriceMinimum(Symbol(),PERIOD_D1,2);

Bem, você poderia tomar a saída fácil e usar funções quádruplas puras:

double price_max=iHigh(Symbol(),PERIOD_D1,1);

Mas eu não aconselharia - usando novas construções lingüísticas, você se preparará e seu código para que um dia quádruplo não seja suportado, e autodisciplina e tudo isso ;)

 
Artyom Trishkin:

Você fez uma bagunça tão grande que é difícil até mesmo resolvê-la. Uma montanha de conversões de uma coisa para outra...

Tudo para encontrar os altos e baixos do dia?

Então, o que não está funcionando para você?

Precisa descobrir os altos do dia? Por favor:

Precisa descobrir o máximo de ontem? Fácil:

Precisa saber o mínimo do dia antes de ontem? Não há problema:

Bem, você poderia tomar a saída mais fácil, e usar funções quádruplas puras:

Mas eu não aconselharia - usando novas construções lingüísticas, você se preparará e seus códigos que um dia o quaternion não será apoiado, e a autodisciplina e tudo isso ;)

Eu mesmo encontrei um erro (toda a desatenção lê mal os parâmetros iHighest, iLowest ).

Portanto, não é adequado, pois necessitará de outros cálculos de ontem.

 
missha32:

Eu mesmo encontrei o erro (todos os desatentos leram mal os parâmetros iHighest,iLowest).

Isto não é adequado, pois outros cálculos de ontem serão necessários

Eu não entendo porque você é impedido de obter os dados de uma maneira simples e natural para outros cálculos.
 
missha32 cada sinal vermelho para compra e cada sinal azul para venda para permitir o preenchimento em cada sinal

if(Red ) OrderSend( ... Buy ...) ; if( Blue ) OrderSend( ... Sell ...) ;

Só o oposto, vender em cima, comprar em baixo.

A função OnInit (a antiga pedindo init) é executada no início do indicador (ao mudar o cronograma, recompilar, ...). Todas as variáveis utilizadas devem ter um valor atribuído a elas. A linha SetIndexDrawBegin(0,i-1) está presente na função OnInit; à variável i deve ser atribuído um valor ou deve ser usada uma constante

 
STARIJ:

if(Red ) OrderSend( ... Buy ...) ; if( Blue ) OrderSend( ... Sell ...) ;

Só o oposto, vender em cima, comprar em baixo.

A função OnInit (a antiga pedindo init) é executada no início do indicador (ao mudar o cronograma, recompilar, ...). Todas as variáveis utilizadas devem ter um valor atribuído a elas. Na função OnInit, existe a linha SetIndexDrawBegin(0,i-1); à variável i deve ser atribuído um valor ou usar uma constante

Para ser honesto, não entendo nada, sou novo na programação do Mql4, portanto, por favor, me ajude com o código.
 
missha32:
Para ser honesto, eu não entendo nada, sou novo na programação Mql4, se você não se importa em me ajudar com o código.

O código geralmente ajuda no freelance.

Aqui - ou o algoritmo ou para corrigir seus erros. Mas não para reescrever novamente para você.