Auto-aprendizagem da linguagem MQL5 a partir do zero - página 14

 
MrBrooklin:

No futuro, de acordo com o plano de auto-estudo, a tarefa é modificar o roteiro passo a passo, ou seja, passo a passo:

  1. adicionar Stop Loss e Take Profit;
  2. adicionar o trailing;
  3. adicionar o risco máximo;
  4. ampliar a gama de ordens pendentes.
Atenciosamente, Vladimir.
Claro que é uma pena que você não tenha seguido os conselhos do tutorial. Você aprenderá como colocar linhas, pedidos, etc., mas não poderá escrever uma estratégia de qualquer maneira, porque não tem base teórica. Todas estas linhas e scripts não o ajudarão a entender as coisas básicas de programação, e você não pode ir longe sem ele. Eu passei os primeiros 4 meses apenas aprendendo, sem sequer tentar escrever nada. Claro que eu poderia ter descaradamente, como você fez, mas a qualidade de tal conhecimento é baixa - há muitas lacunas no básico, que terão de ser preenchidas no futuro...
 
Реter Konow:
Naturalmente, você não deveria ter seguido os conselhos do tutorial. Você pode ter o conhecimento de como estabelecer linhas, ordens, etc., mas não será capaz de desenvolver a estratégia de qualquer maneira, porque não tem a base teórica. Todas estas linhas e scripts não o ajudarão a entender as coisas básicas de programação, e você não pode ir longe sem ele. Eu passei os primeiros 4 meses apenas aprendendo, sem sequer tentar escrever nada. É claro que eu poderia ter descaradamente, como você, mas a qualidade de tal conhecimento é pobre. Há sempre lacunas no básico, que terão de ser preenchidas no futuro...

Olá, Peter! Estudo o livro didático conforme necessário, ou seja, quando vejo uma lacuna em meu conhecimento. Agora, sinto que terei que fazer uma pequena pausa e estudar o livro didático mais de perto. Todas as recomendações dos participantes do fórum são levadas em consideração e eu estou tentando aderir a elas. E agora me surpreende que eu tenha conseguido escrever algo usando apenas o livro de referência MQL5 por tão pouco tempo.

Cumprimentos, Vladimir.

 
MrBrooklin:

Boa noite a todos e boa disposição!

Estou colando um novo script New6.mq5 que o ajuda a colocar uma SellStop e uma BuyStop ordem pendente com um tamanho de lote fixo a uma certa distância do preço atual no gráfico atual. Neste roteiro, tentei descrever tudo como prometi anteriormente, de forma clara e compreensível para um programador da 1ª série.

Usei as informações retiradas da Referência MQL5 somente quando escrevi o roteiro!

Com os melhores cumprimentos, Vladimir.

Este é um bom exemplo. Sugiro usá-la como ponto de partida. Noções básicas.

MrBrooklin:

No futuro, de acordo com o plano de auto-estudo, a tarefa é modificar o roteiro passo a passo, ou seja

  1. adicionar Stop Loss e Take Profit;
  2. adicionar o trailing;
  3. adicionar o risco máximo;
  4. expandir a escolha de ordens pendentes.
Atenciosamente, Vladimir.

Não, não. Não conecte ainda a nova funcionalidade. Agora melhore a lógica existente. Ao mesmo tempo, livrar-se dos problemas na implementação do roteiro (eles já estão aparecendo). Se você quiser saber o que reescrever, eu lhe direi.

 
Vasiliy Sokolov:

O exemplo é um bom exemplo. Sugiro usá-la como ponto de partida. Linha de base.

Não, não. Não conecte nenhuma nova funcionalidade por enquanto. Agora melhore a lógica existente. Ao mesmo tempo, livrar-se de problemas na implementação do roteiro (eles já estão aparecendo). O que você precisa exatamente para reescrever, se estiver interessado, eu lhe direi.

Olá Vasily! É claro, diga-me o que você precisa reescrever, seria interessante para mim!

Cumprimentos, Vladimir.

 
MrBrooklin:

Olá Vasily! Claro que me diga o que você precisa para reescrever, estou muito interessado!

Atenciosamente, Vladimir.

Os programadores têm dois problemas: erros produzidos pelo compilador e problemas de arquitetura. Enquanto você é um novato, você se concentra em lutar com o compilador enquanto seu objetivo final é um programa que funcione corretamente. No entanto, muito rapidamente um programa para iniciantes se transforma no chamado código spaghetti, que o próprio autor não consegue descobrir em tempo hábil. É por isso que sugiro que você se concentre não no compilador e na exatidão do roteiro final, mas em questões arquitetônicas. É como aprender a tocar piano: primeiro você aprende a segurar os dedos corretamente e a sentar-se no instrumento corretamente, ninguém exige tocar Bach de um iniciante.

//+------------------------------------------------------------------+
//|                                                         New6.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#property script_show_inputs
//---

#define       orderType1 "BUY_STOP"   //Тип ордера UP
#define       orderType2 "SELL_STOP"  //Тип ордера DOWN
input int    Distance=100;           //Отступ отложенного ордера от текущей цены
input double Lots=0.01;              //Фиксированный размер лота
input long   Pending_magic=86513;    //Магический номер ордера

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()                                                    
  {
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   request.action=TRADE_ACTION_PENDING;
   request.symbol=Symbol();
   request.volume=Lots;
   request.deviation=2;
   request.magic=Pending_magic;
   double price;
   double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   if(orderType1=="BUY_STOP")
     {
      request.type=ORDER_TYPE_BUY_STOP;
      price=SymbolInfoDouble(Symbol(),SYMBOL_ASK)+Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   if(orderType2=="SELL_STOP")
     {
      request.type=ORDER_TYPE_SELL_STOP; 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID)-Distance*point;
      request.price=NormalizeDouble(price,digits);
     }
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
  }

Você tem dois grupos de parâmetros que determinam o comportamento de seu roteiro: o primeiro é definido estaticamente, como uma macro. O segundo é definido pelo usuário ao carregar o script no gráfico. Agora o usuário não poderá selecionar o tipo do pedido a ser feito sem recompilar este script. Isto não é bom. Portanto, seria melhor abandonar estas macros em favor do parâmetro adicional:

enum ENUM_ORDER_TYPE_FLAGS
{
    BuyStop = 1,                // Только BuyStop
    SellStop = 2,               // Только SellStop
    BuyStopAndSellStop = 4      // BuyStop и SellStop
};

input ENUM_ORDER_TYPE_FLAGS TypeSendOrders = BuyStop;   // Тип Выставляемого ордера(ов)

Assim, definimos uma nova enumeração, que implementamos como um parâmetro de seleção para o usuário.

 
Vasiliy Sokolov:

Os programadores têm dois problemas: erros de compilação e problemas de arquitetura. Enquanto você é um iniciante, você se concentra em combater o compilador, e seu objetivo final é um programa que funcione corretamente. No entanto, muito rapidamente um programa para iniciantes se transforma no chamado código spaghetti, que o próprio autor não consegue descobrir em tempo hábil. É por isso que sugiro que você se concentre não no compilador e na exatidão do roteiro final, mas em questões arquitetônicas. É como aprender a tocar piano: primeiro você aprende a segurar os dedos corretamente e a sentar-se no instrumento corretamente, ninguém exige tocar Bach de um iniciante.

Você tem dois grupos de parâmetros que determinam o comportamento de seu roteiro: o primeiro é definido estaticamente, como uma macro. O segundo é definido pelo usuário ao carregar o script no gráfico. Agora o usuário não poderá selecionar o tipo do pedido a ser feito sem recompilar este script. Isto não é bom. Portanto, seria melhor abandonar estas macros em favor do parâmetro adicional:

Assim, definimos uma nova enumeração, que implementamos como um parâmetro de seleção para o usuário.

Ótimo, de fato, você me motivou o que está escrito no passo 4 da modificação passo a passo do roteiro, ou seja, a expandir a seleção de ordens pendentes.

Obrigado!

Cumprimentos, Vladimir.

 

O próximo problema com seu código é que ele se espalha para fora em uma longa folha de procedimento. Todos os iniciantes escrevem desta maneira. E este é um problema que permanece com eles por anos. Aprenda a quebrar seu algoritmo em partes, a partir do básico como este roteiro. Há duas maneiras de fazer isso: através de funções e classes. O conceito de aulas é muito difícil de entender no início, por isso sugiro que você se concentre em trabalhar com funções. Pense sobre a importância das funções:

  • Todos os códigos escritos em MQL (e isto é tudo scripts, indicadores e Expert Advisors em CodeBase, por exemplo) estão dentro das funções do sistema ou dentro das funções do usuário.
  • Qualquer código MQL chama dezenas de funções MQL incorporadas. Toda interação com o MetaTrader e seu ambiente comercial é realizada através da chamada desta ou daquela função do sistema.
  • Qualquer função que não dependa de parâmetros externos sempre retorna o mesmo resultado. Tal função pode ser simplesmente copiada de um roteiro/indicador/conselheiro para outro e funcionará corretamente. Por outro lado, a cópia de um código de procedimento arbitrário dificilmente funcionará.
  • Você pode escrever qualquer função personalizada que faça um trabalho útil. E ao fazer isso, ele expandirá a funcionalidade padrão do MQL da maneira que você precisa. Por exemplo, você pensa: "Como seria legal se a MQL tivesse tal função....". - Mas por que não escrevê-lo você mesmo?
 
Vasiliy Sokolov:

O próximo problema com seu código é que ele se espalha para fora em uma longa folha de procedimento. Todos os iniciantes escrevem desta maneira. E este é um problema que permanece com eles por anos. Aprenda a quebrar seu algoritmo em partes, a partir do básico como este roteiro. Há duas maneiras de fazer isso: através de funções e classes. O conceito de aulas é muito difícil de entender no início, por isso sugiro que você se concentre em trabalhar com funções. Pense sobre a importância das funções:

  • Todos os códigos escritos em MQL (e isto é tudo scripts, indicadores e Expert Advisors em CodeBase, por exemplo) estão dentro das funções do sistema ou dentro das funções do usuário.
  • Qualquer código MQL chama dezenas de funções MQL incorporadas. Todas as interações com o MetaTrader e seu ambiente comercial são realizadas através da chamada de uma função do sistema.
  • Qualquer função que não dependa de parâmetros externos sempre retorna o mesmo resultado. Tal função pode ser simplesmente copiada de um roteiro/indicador/conselheiro para outro e funcionará corretamente. Por outro lado, a cópia de um código de procedimento arbitrário dificilmente funcionará.
  • Você pode escrever qualquer função personalizada que faça um trabalho útil. E ao fazer isso, ele expandirá a funcionalidade padrão do MQL da maneira que você precisa. Por exemplo, você pensa: "Como seria legal se a MQL tivesse tal função....". - Mas por que não escrevê-lo você mesmo?

Obrigado, Vasily, por um conselho tão abrangente. Certamente levarei isso em conta e tentarei fazer o meu melhor.

Cumprimentos, Vladimir.

 
Vasiliy Sokolov:

O próximo problema com seu código é que ele se espalha para fora em uma longa folha de procedimento. Todos os iniciantes escrevem desta maneira. E este é um problema que permanece com eles por anos. Aprenda a quebrar seu algoritmo em partes, a partir do básico como este roteiro. Há duas maneiras de fazer isso: através de funções e classes. O conceito de aulas é muito difícil de entender no início, por isso sugiro que você se concentre em trabalhar com funções. Pense sobre a importância das funções:

  • Todos os códigos escritos em MQL (e isto é tudo scripts, indicadores e Expert Advisors em CodeBase, por exemplo) estão dentro das funções do sistema ou dentro das funções do usuário.
  • Qualquer código MQL chama dezenas de funções MQL incorporadas. Todas as interações com o MetaTrader e seu ambiente comercial são realizadas através da chamada de uma função do sistema.
  • Qualquer função que não dependa de parâmetros externos sempre retorna o mesmo resultado. Tal função pode ser simplesmente copiada de um roteiro/indicador/conselheiro para outro e funcionará corretamente. Por outro lado, a cópia de um código de procedimento arbitrário dificilmente funcionará.
  • Você pode escrever qualquer função personalizada que faça um trabalho útil. E ao fazer isso, ele expandirá a funcionalidade padrão do MQL da maneira que você precisa. Por exemplo, você pensa: "Como seria legal se a MQL tivesse tal função....". - Mas por que não escrevê-lo você mesmo?
Vasily, o homem ainda nem sequer dominou as arraias. É muito cedo para que ele ouça tais palestras).
 
Реter Konow:
Vasily, o homem ainda não dominou nem mesmo as matrizes. É muito cedo para que ele ouça tais palestras).

Peter, todos os conselhos construtivos são importantes para mim, inclusive os seus!

Cumprimentos, Vladimir.

Razão: