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

 
Valeriy Yastremskiy:

Eu entendo isso, mas o mql5 é difícil de entender, infelizmente. Concordo com o fxsaber, acho que é mais fácil usar o 4 e para otimização e outras coisas devemos usar o 5. Em geral, eu gostaria de saber se há alguém que tenha dominado o mql5 sem a prática do OOP? É claro, depois de C++ 4 não é relevante, embora eu possa estar errado.

Os dois idiomas são absolutamente idênticos. Nem mais nem menos. E o OOP (pelo qual todos foram intimidados) é exatamente o mesmo em ambos. Você não sabia? Você já leu histórias de horror na Internet e viu blogueiros no YouTube que "semeiam o bem, o sábio e o eterno"? Que falam asneiras de forma inteligente, deliberadamente afugentando as pessoas da MQL5.

Eu me apresso a desapontar - ambos os idiomas são exatamente os mesmos. Tanto na facilidade de compreensão, quanto nas características e presença do OOP.
Mas a MQL5 tem mais possibilidades.

 
Alexey Viktorov:

Mandei o espanhol até você lá - bem, assuste-o. Faça dele um indicador - eu não tenho tempo. Está em inglês. Explicarei se houver alguma coisa. Mas... você vai descobrir.

 
Alexey Viktorov:

Não me lembro da resposta de Artem e não vou procurar por ela. Todos os códigos em seus artigos são ou multi-terminais ou duas versões, para mql5 e mql4. Verifiquei estas versões no mql4. Tudo funciona corretamente e detecta o fechamento por parada ou tomada e não comete erros.

Sim, estes artigos são difíceis de entender, mas vale a pena se você não for mais velho do que eu. E eu, para um programador, sou obscenamente velho.

A outra variante é mais simples, mas será muito mais lenta. Escreva o ticket de pedido em uma matriz e, através desta matriz, selecione o pedido e verifique o horário de fechamento do pedido. Se for maior que zero, significa que a ordem está fechada. Se o comentário de uma ordem fechada contém as letras "sl", isso significa que a ordem é fechada usando uma parada. Se o pedido for fechado, ele é excluído da matriz. Ou, depois que a matriz é completada, ela é reabastecida com os pedidos em aberto restantes. A imaginação é voar em geral.

Qual a opção que você escolhe, depende de você. E leia alguns dos meus posts no livro de Kovalev. É o livro de texto que sugere escrever int start(), enquanto no mql4 atualizado, OnTick() vazio deve ser escrito para Expert Advisors.

Para indicadores e roteiros, consulte a documentação. E, a propósito, é muito mais fácil escrever indicadores em mql4 atualizado do que quando Sergey escreveu este tutorial.

Muito obrigado. Suas informações foram muito valiosas para mim. Especialmente sobre a função start().

 
Alexey Viktorov:

Não me lembro da resposta de Artem, e não vou procurá-la, posso adivinhar o que ele poderia ter respondido. ...

Aqui está minha resposta. Com uma clara indicação do que precisa ser feito:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos

Artyom Trishkin, 2020.04.28 08:22

Esta é uma explicação simples: você precisa monitorar o número de pedidos e posições, e compará-las com o estado anterior. Se tivermos 12 posições no tick anterior, e 8 posições no tick atual, temos uma mudança de 4 posições. Assim, devemos tomar as quatro últimas posições (por ocasião do fechamento) para entender o que aconteceu com elas.

Mas, a julgar pelo código anexo, no qual "milagres" estão escritos, você realmente não precisa de uma explicação em palavras. Mas está aqui para ajudar, não para escrever para/fora.


 
ANDREY:

Muito obrigado. Suas informações foram muito valiosas para mim. Especialmente sobre a função start()

O bom é criar no editor o que precisamos, EA, roteiro, indicador e o editor criará um modelo com os campos certos.
 
Artyom Trishkin:

E o que seu código faz além de abrir duas posições de venda, cada uma em um horário estritamente especificado, e imprime a hora de abertura da última posição quando ela é permitida? Tudo. Usando variáveis não inicializadas, o que pode levar a "maravilhas" no comportamento do código, e um manipulador de início muito, muito antigo(), que foi puxado de uma prateleira poeirenta com anos de teias de aranha, e no mercado (um dia você quer vender algo) com manipuladores antigos nunca faltará o validador - ele dirá que o tipo de programa errado.

Obrigado pela contribuição. No par GBP/USD, encontrei um padrão no comportamento dos preços ao testar. Este padrão com pequenas correções, assim como com pequenos drawdowns, o gráfico de equilíbrio leva constantemente para cima desde 2008 e até o momento atual. Como eu disse, as correções e drawdowns do gráfico de equilíbrio não são grandes, mas podem durar vários meses.
Comecei a testar diferentes variantes deste padrão e recorri à otimização para este fim. Mas, no final, a otimização usando vários parâmetros ao mesmo tempo leva um tempo enorme. No meu caso, levou cerca de um ano. Um algoritmo genético não me convém.
Depois cheguei à idéia de que os testes e a otimização podem ser realizados mais rapidamente com a ajuda de código devidamente formulado, a função Pront() e a tabela Excel.

O código abaixo é apenas uma tentativa de escrever tal código. Irei melhorar ainda mais este código. Mas eu encontrei um problema que me faltava conhecimento para resolver.
Por favor, não me julgue e meu código muito severamente.... Sou um principiante que só agora começou a entender o básico da codificação e pouco mais. Mas eu levo as críticas com calma e não me ofendo..... especialmente às críticas construtivas.

Obrigado por sua ajuda.

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

Se dois ou mais pedidos forem fechados por stop ou assumirem o mesmo tique, o programa imprime () somente após o último pedido fechado neste tique. Preciso imprimir() após cada pedido ser fechado. Eu não sei como conseguir isso. Mas se eu vir o código necessário, eu o entenderei imediatamente e o lembrarei.

Abaixo está um exemplo do meu problema.


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
O bom é criar no editor o que precisamos, um EA, um roteiro, um indicador e o editor criará um modelo com os campos certos.

Sim. Notei estes campos corretos, ou seja, novas funções em vez de START. Mas não lhes prestei muita atenção e usei START para testes como antes.
Eu não sei onde posso ler mais detalhes sobre as últimas atualizações da MQL4. Eu gosto muito do livro de Kovalev, porque todas as informações são logicamente estruturadas e de fácil compreensão. E é suficientemente detalhado para compreender todos os detalhes necessários. Eu me pergunto por que ele não escreveu o mesmo livro didático para a MQL5.

 
Artyom Trishkin:

Dois idiomas absolutamente idênticos. Nem mais nem menos. E o OOP (pelo qual todos foram intimidados) é exatamente o mesmo em ambos. Você não sabia? Você já leu histórias de horror na Internet e viu blogueiros no YouTube que "semeiam o bem, o sábio e o eterno"? Que falam asneiras de forma inteligente, deliberadamente afugentando as pessoas da MQL5.

Eu me apresso a desapontar - ambos os idiomas são exatamente os mesmos. Tanto na facilidade de compreensão, quanto nas características e presença do OOP.
Mas a MQL5 tem mais possibilidades.

Sim em geral eu concordo, e OOP em 4ka feliz))) mas no acesso de iniciantes em meus livros de experiência Kovalev, Zhdan em 4ka e incompreensível Mishin em 5ka e OOP. Não sei como entendê-lo. Não importa quantas vezes você repita o encapsulamento, o entendimento poliformista não virá. E você não entende quais os artigos a serem lidos primeiro. E onde procurar o quê. É por isso que até agora no codobase in ontik a saída da função de início é encontrada )))))
 
ANDREY:

Sim. Eu notei esses campos corretos, ou seja, novas funções em vez de START. Mas não prestei muita atenção a eles, então usei START para testes como antes.
Eu não sei onde posso ler mais detalhes sobre as últimas atualizações da MQL4. Eu gosto muito do livro de Kovalev, porque todas as informações são logicamente estruturadas e de fácil compreensão. E é suficientemente detalhado para compreender todos os detalhes necessários. Eu me pergunto por que ele não escreveu o mesmo livro didático para a MQL5.

Como disseAlexey Viktorov:Entenda a verdade simples, mql5 difere do mql4 somente em OrderSend() e algumas outras funções, das quais não me lembro. Outra diferença importante é a direção da indexaçãodos amortecedores indicadores. Entretanto, pode ser resolvido muito rapidamente, mas é melhor você se acostumar às novas características. Mas a obtenção de valores indicadores permanece a mesma.
Os artigos do OOP para iniciantes têm ajudado. E a ajuda do editor.
 
ANDREY:

Obrigado por sua participação.

...

O código abaixo é apenas uma tentativa de escrever tal código. Eu estarei melhorando este código no futuro. Mas encontrei um problema que me faltava conhecimento para resolver.
Por favor, não me julgue e meu código muito severamente.... Sou um principiante que só agora começou a entender o básico da codificação e pouco mais. Mas eu levo as críticas com calma e não me ofendo..... especialmente às críticas construtivas.

Obrigado por sua ajuda.

Se dois ou mais pedidos forem fechados por stop ou assumirem o mesmo tick, o programa imprime Print() somente depois que o último pedido for fechado neste tick. Preciso imprimir() após cada pedido ser fechado. Eu não sei como conseguir isso. Mas se eu vir o código necessário, eu o entenderei imediatamente e o lembrarei.

Abaixo está um exemplo do meu problema.


Eu já respondi a vocês:

A explicação em palavras: você precisa monitorar o número de ordens e posições e compará-las com o estado anterior. Se tivéssemos 12 posições no tick anterior e 8 no tick atual, temos uma mudança de 4 posições. Assim, devemos tomar as quatro últimas posições (por hora de fechamento) para ver o que aconteceu com elas.

Você pega a última ordem da lista:

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

E você precisa primeiro descobrir o quanto o estado da lista de pedidos mudou. Você costumava ter 12, agora você tem 8 - esta é uma mudança de 4 pedidos. Assim, você precisa imprimir os quatro pedidos. E você sempre imprime apenas o último pedido da lista.

Como sei o quanto mudou? Precisamos escrever o número de ordens em uma variável, por exemplo int last_total, quando executamos a EA. Então, em cada tick, compare OrderTotal() com last_total. Se eles NÃO são iguais, isso é uma mudança. Escreva a diferença entre OrdersTotal() e last_total em uma variável, por exemplo, num_changes e salve o novo estado de OrdersTotal() para last_total.
Pode haver aqui algumas sutilezas, por exemplo, quando uma ordem pendente é acionada. Mas, por enquanto, você deve fazer o que precisa fazer primeiro.
Sabendo o número de pedidos pendentes, você pode consultá-los na história. Entretanto, você também pode limitar o monitoramento das ordens na lista histórica - faça tudo o que foi dito acima para a lista de ordens históricas, e não para a lista de ordens de mercado. A diferença entre o que foi e o que se tornou - esta é a quantidade de pedidos que você precisa analisar. Você sempre analisa apenas a última ordem da lista.

No entanto, isto não pode garantir que a última ordem na lista histórica seja a última ordem fechada. Esta é também uma nuance que deve ser considerada. Mas então.