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

 
Alexey Viktorov:

Bem, tentarei fazer minha parte mais para educá-lo.

Eu me dirijo a você como "você" quando eu o enviar. Tenho uma foto do ponteiro...

Por favor me diga, não parece errado chamar a mesma função 5 vezes no mesmo carrapato? Mas isso é metade do problema. Esta função percorre todas as ordens. E tudo isso 5 vezes em um só tique... E eu conto 4 funções desse tipo. Não podemos pensar o suficiente em como encaixar mais 3 funções com o laço para procurar todas as ordens em um ciclo.

Aqui estão dois deles.

Isto é

Não está nem perto de ser seguido.

Para entender isto, precisamos entender claramente a definição de trilha. Não consigo me lembrar literalmente, mas é aproximadamente "Moving StopLoss level following the price in order to decrease possible losses or increase "guaranteed" profit.

E isto

como é quando você dirige o Expert Advisor? Provavelmente quatro linhas... eles são necessários?

E a última coisa por hoje: você não precisa ter uma biblioteca na cabeça. É suficiente ter documentação e saber como utilizá-la. Ainda não consigo me lembrar de todos os parâmetros do iMA(_Symbol, _Period, ,,,,,) e não posso ir mais longe sem estudar a documentação. E assim, quase todas as funções. Felizmente, eles fizeram pontas de ferramentas não há muito tempo, o que não ajuda muito. Eu não estou tentando memorizar como escrever estes ou aqueles enumeros. Por isso, tenho que olhar sempre a documentação.


Alexey, obrigado pela informação. Sim, admito que o código não é ótimo, apenas não sou um programador e não conheço as sutilezas que você descreveu. Eu simplesmente não entendo tais nuances, não entendo como otimizar tudo isso, talvez o faça mais tarde, se eu seguir em frente. Agora eu sei exatamente que se eu começar a otimizar, só quebrarei tudo. Vi códigos de outros EAs em meu site - há tantas coisas lá! - Com certeza se você é um programador profissional, talvez seu código seja menos exigente para o terminal do que o meu, mas por enquanto não posso levar em conta seus comentários, pois realmente não entendo essas nuances de otimização da programação. E se você remover algumas chamadas para funções no código - com certeza, o Expert Advisor começaria o caos lá e abriria ordens quando não fosse necessário. Eu codifiquei lá, testei - nada deu errado ou deu errado, corrigi e como resultado o código final ficou assim, não tive tempo para otimização, como vocês entendem com minha bagagem de conhecimento.

Quanto ao trilho - o mais importante é que ele trilha o lucro, neste estágio de desenvolvimento estou satisfeito com ele)))) Com certeza o antigo e o novo código de trilha igualmente e a quantidade de acordos é a mesma - claro que concluí que a trilha tem funcionado, mas como fazê-lo corretamente neste ambiente onde a trilha funciona ninguém me disse, e eu não tenho nenhuma idéia sobre isso - todo o meu código é Lego construtor - ou seja, eu o montei a partir de materiais de vídeo tutoriais. Naturalmente, há um pouco do meu próprio - é o algoritmo do próprio Expert Advisor, enquanto o código e as funções inteiras não são invenções minhas, mas vieram dos tutoriais em vídeo da TradeLikeaPro e eu o "editei" por analogia e para minhas próprias necessidades - para meu próprio algoritmo. No final, eu consegui o que tinha.

 
geratdc:   Todo meu código é um Lego construtor - ou seja, eu o montei a partir de materiais de vídeo tutoriais da TradeLikeaPro, além disso, eu "editei" o código exatamente por analogia e para minhas necessidades - para meu próprio algoritmo. No final, eu tenho o que tenho.

Veja o gráfico de depósito - interessou-se e baixou a primeira versão. Copiou-o no MetaEdit. Tenho dois avisos. Primeiro, eu a eliminei substituindo int timeprev=0; por datetime timeprev=0; Porque esta variável contém data. A segunda indica em

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

Eu removi as três últimas cordas. Traduz-se de forma limpa. Vamos mais longe...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

mudou (para esclarecimento, anexei o roteiro - execute-o, ele explicará) portanto

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
Aqui está o resultado


Esta função é removida - não há chamadas dela e seu corpo está vazio.

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Tentei executá-lo e serrar:

Foi

Eu o mudei somente ao executar o Expert Advisor em dois gráficos com o mesmo símbolo e Slippage - por que mudar este parâmetro? Depois pensei sobre isso e aumentei os parâmetros 10 vezes. E eu removi a função OnInit. Afinal, eu só utilizo o código de cinco dígitos. Por quê? Porque o spread de quatro dígitos é de 3 pontos, portanto é de 30. E o spread de cinco dígitos é de apenas 12.

tornou-se mais claro.

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

Eu cortei o topo do cabeçalho. Foi o que eu deixei:

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

esta linha aqui mesmo.

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

levou-o para a reivindicação. É assim.

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

Então eu joguei fora a descrição da variável op no início e a substituí por esta

   if (CalculateProfit()>=tp) CloseAll();

No início da função OnTick há um par de linhas. Isto é para garantir que o processamento seja realizado apenas uma vez por barra em vez de cada carrapato

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

Então o MA é calculado. Isto deve ser estudado em detalhes. Para este fim, fiz um roteiro e exibi o resultado

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

Podemos ver que o quarto parâmetro MaShift e o último são somados, ou seja, número de barras = sua soma. Tomamos o MA do bar 2, o terceiro do final.

Vou analisar a questão mais adiante. Interessado?

 
STARIJ:
...

Vou continuar procurando. Interessado?

Você continua falando nisso?

Já chega - as pessoas seguem o tema para aqueles que estão interessados e ele é desperdiçado.

Se você quiser que uma pessoa lhe responda, chame-a para a linha. Assim: @STARIJ. Mas você não precisa continuar levantando o assunto, editando seu último post.


 
Victor Nikolaev:

Isso significa que alguém está sem sorte. Mais uma vez. Este é um roteiro, não um Expert Advisor ou indicador

Imaginei que - aparentemente o terminal não tinha memória suficiente - fechava alguns gráficos e funcionava.

Obrigado - de fato, os cálculos acontecem.

E se as variáveis não são do tipo int, mas bool , o que fazer?

 

Olá, poderia me dizer, por favor?

1 - é registro somente como pessoa física ou também pode ser como pessoa jurídica e existem quaisquer restrições e condições

2 - Existe alguma sincronização com as redes sociais, para ter uma única conta (nome de usuário e senha)

3 - Eu também vi uma função "colocar um widget em sua página, compartilhar o sinal" - estamos falando do site ou de outra coisa


 
Olá, eu só recentemente comecei a aprender Mql4. Se eu lhe fiz uma pergunta no lugar errado, por favor, me encaminhe para o assunto certo. Minha pergunta é a seguinte: como trabalhar com indicadores que constroem várias zonas, retângulos, etc. Posso programar um cruzamento de linhas ou preço mais alto ou mais baixo, por exemplo, MA.) Anexei um indicador na parte inferior, o buffer é quatro e existem oito tipos de zonas. Portanto, na verdade, não consigo descobrir como codificar uma pausa ou quebra dessas zonas.
Arquivos anexados:
 
STARIJ:

Veja o gráfico de depósito - interessou-se e baixou a primeira versão. Copiou-o no MetaEdit. Tenho dois avisos. Primeiro, eu a eliminei substituindo int timeprev=0; por datetime timeprev=0; Porque esta variável contém data. A segunda aponta para

*

Resposta

Talvez tenha a ver com o fato de que o TP era do tipo int na aula de vídeo, mas eu o converti para o dobro e, portanto, o int permanece como está. OK, eu vou consertar isso. Mas como isso afeta a operação da EA? Na verdade, estas barras e tempo foram relevantes para a função TrailingStop do vídeo tutorial, mas como eu substituí esta função pela minha própria, ela simplesmente permanece como uma relíquia do código fonte e meu trailing stop não é na verdade baseado no tempo da barra.


Eu removi as três últimas linhas. Traduz-se de forma limpa. Eu fui mais longe...

Eu o mudei (para esclarecimento anexei um roteiro - execute-o, ele explicará) desta forma

Aqui está o resultado

*Resposta.

Para onde foi esse pedaço de código?

   return(INIT_SUCCEEDED);
  }

Talvez devesse ser assim?


nulo OnInit()

{

if(Dígitos == 3 || Dígitos == 5)

{

Passo *= 10;

TrailingStep *= 10;

TrailingStop *= 10;

Slippage *= 10;

}

return(INIT_SUCCEED);

}

Mas por que você fez TakeProfit do tipo int? Isso significa que será lucro em pontos, enquanto a função CalculateProfit() é do tipo duplo, então eu fiz TakeProfit do mesmo tipo para torná-los consistentes.


Eu deletei esta função - não há chamadas dela e seu corpo está vazio

*

Resposta

No código, há a função CloseAll() vazia. Pensei que estava de alguma forma relacionada a esta função

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

Resposta

Ok, vamos removê-lo.


Tentei executá-lo e serrar:

Foi

às custas de fazer mudanças - bem apenas acrescentou comentários e removeu o exterior da Magic

*

Resposta

Sim, talvez o externo seja redundante porque nunca o mudei e nem o Slippage - tudo isso é do código fonte do vídeo tutorial

- nós o alteramos somente quando executamos a EA em dois gráficos com a mesma ferramenta e Slippage - por que alterar este parâmetro? Depois pensei sobre isso e aumentei os parâmetros 10 vezes. E eu removi a função OnInit. Afinal, eu só utilizo o código de cinco dígitos. Por quê? Porque o spread de quatro dígitos é de 3 pontos, portanto é de 30. Em um spread de cinco dígitos, são apenas 12.

*

A resposta é .

Esta é a configuração padrão para que a EA trabalhe com todas as moedas. Eu vou manter Oninit ().

tornou-se mais claro.

Eu cortei o cabeçalho no topo. Aqui está o que eu deixei:

*

Resposta

Este cabeçalho é feito por padrão do editor. Vou deixar as coisas como estavam, caso algo não passe no corretor ou no terminal por causa da ausência dessas linhas.

Eu movi esta linha

passou para a reivindicação. Foi assim

Depois removi a descrição da variável op no início e a substituí por

*

Resposta

É bastante lógico.



No início da função OnTick, há um par de linhas. Isto é para garantir que o processamento seja realizado apenas uma vez por barra em vez de cada carrapato

Então o MA é calculado. Isto deve ser estudado em detalhes. Para este fim, fiz um roteiro e produzi o resultado.


Você pode ver que o quarto parâmetro MaShift e o último parâmetro são somados, ou seja, número de barras = sua soma. Tomamos o MA do bar 2, o terceiro do final.

*

Resposta

Devido ao fato de eu ter mudado o trailing - data/hora Moving Average não é relevante, acho eu. É uma relíquia do código fonte, eu costumava tentar arrastá-lo até a última das 3 (três) ordens abertas. O problema é que se o mercado vai na direção errada pelo valor de STep, a EA abre uma contra-ordem e então se o mercado continua na direção oposta, uma terceira ordem do tipo da segunda posição é adicionada, Ou vice-versa, se o preço for retornado, então a terceira ordem será aberta com o primeiro tipo de ordem (compra ou venda). Lá, o rastreamento é feito em três ordens usando a função CalculateProfit(); entretanto, se a primeira ordem abrir com sucesso e o preço se mover como deveria, nesta situação, o rastreamento na barra seria feito usando a data como no tutorial em vídeo - repito, mesmo em 1 ordem de rastreamento usando a função Calculateprofit()

Vou analisar a questão mais adiante. Interessado?

*

Resposta

Sim, eu tenho alguns problemas com o arrasto. Parece que ele segue o rastro, mas não quero que ninguém entenda o que eu fiz com ele. Trailing() funciona sem barras e sem data/hora - funciona com Trailing().

O período de MA é de aproximadamente 200, mas a questão é que é um valor ajustável. E o parâmetro-chave Valor parece estar faltando - expliquei seu significado na descrição do arquivo README.



Obrigado por se preocupar com tudo isso. Na verdade, o Expert Advisor não é realmente tão bom, mecânico, eu diria. Mas, basicamente, se você o montar e ocasionalmente monitorar seu trabalho, ele pode ser bastante bom. O tempo o dirá. Provavelmente, eles podem ganhar alguma coisa, mas vão falir sem sequer piscar um olho e não vão enviar uma mensagem de texto. Eu nem sequer me preocupei com isso, embora minha idéia fosse enviar um SMS se o saque for superior a 30% do depósito - isto significa que 3 pedidos já foram abertos e o mercado começou a contra-mover-se, nesta situação, cheira a parafina. Todos os outros casos são resolvidos pelo Consultor Especialista, se este for ajustado para o histórico comportamental do quadro de instrumentos comerciais.


Fiz recomendações (mas não todas) de mudanças no código do Bloco de Notas por enquanto. Por favor, verifique se eu corrigi o código?

Eu sou a favor da otimização, só que eu não considerei os momentos em que você removeu oninit - eu preciso disso para poder testar e trabalhar em todas as moedas))))

Arquivos anexados:
 
Aleksandr Verkhozin:
Olá, eu só recentemente comecei a aprender Mql4. Se eu lhe fiz uma pergunta no lugar errado, por favor, me encaminhe para o assunto certo. Minha pergunta é a seguinte: como trabalhar com indicadores que constroem várias zonas, retângulos, etc. Posso programar um cruzamento de linhas ou preço mais alto ou mais baixo, por exemplo, MA.) Anexei um indicador na parte inferior, o buffer é quatro e existem oito tipos de zonas. Por isso, não consigo descobrir como codificar uma quebra ou quebra dessas zonas.

Se você quiser saber mais sobre o programador, você deve olhar os exemplos e usar os botões coloridos. Você pode perguntar: Como você obtém o código mql4 como exemplo de programação e como você sabe o que fazer com ele?) Talvez você progredirá.
 

geratdc:

...
Sim, eu tenho algumas perguntas sobre a rede de arrasto. Parece arrasto, mas ninguém quer saber o que eu fiz com ele.

...

Se você souber, logo neste tópico coloquei um modelo de rede de arrasto que usa o valor indicador enviado a ela em seus cálculos. Procure, não seja preguiçoso.
 
geratdc:

Você pode precisar fazer o download de vídeos tutoriais de programação mql4 da TradeLikeApro no RuTracker. Eu acho que o princípio básico do mql4 é que você não precisa fazer nada complicado e não tem que fazer nada). Talvez você progredirá.


Assistiu ao vídeo sobre como trabalhar com o indicador externo, escreveu um pequeno código para ver os valores dos amortecedores no testador:

nulo OnTick()

{

duplo Buf1=iCustom(NULL,0, "Shved-Supply-and-Demandand-e600",0,1);

duplo Buf2=iCustom(NULL,0, "Shved-Supply-and-Demandand-e600",1,1);

duplo Buf3=iCustom(NULL,0, "Shved-Supply-and-Demandand-e600",2,1);

duplo Buf4=iCustom(NULL,0, "Shved-Supply-and-Demandand-e600",3,1);

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

As zonas aparecem e desaparecem no modo de visualização. Mas o valor dos amortecedores é sempre zero de qualquer forma. Não há maneira de formalizar essas zonas no código?

Talvez exista uma função, além do iCustom, que seria adequada para tais indicadores? Talvez alguém tenha escrito corujas com tais indicadores?

Razão: