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

 
MrBrooklin:

Eu criei um modelo padrão. Foi aqui que comecei a escrever o código, e aqui comecei a afixar aqueles fragmentos que já foram escritos. Ainda não pensei na estrutura do algoritmo com minhas próprias funções, obrigado pela dica! Obrigado também pela dica sobre a conta netting!


Existe tal técnica de programação de alfabetização - ela permite escrever de forma muito rápida e inteligível.

Em geral, em estilo literário, escreva nos comentários o que você vai fazer (apenas a seqüência direta principal)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Basicamente, tudo. Além disso, após cada comentário você escreve um código de 3-5 (um pouco em geral) linhas. Toda sua função do início ao fim deve caber na tela que você vê. Se você conseguir mais, isso significa que os fragmentos devem ser separados em funções/métodos separados.

Quando uma coisa tão elementar começa a funcionar no testador, então você pode generalizar, adicionar condições da vida real, mudança de passos, por exemplo, ou de freqüência, levar em conta as condições do mercado, não há limite para a perfeição...

 
Maxim Kuznetsov:

abstrato, existe uma técnica de alfabetização-programação que permite escrever de forma muito rápida e clara.

Em geral, em estilo literário, escreva nos comentários o que você vai fazer (apenas a seqüência direta principal)

// тралим стоп-лосс единственного ордера по сигналу от тиков

// прим.) трал - подтягиваем стоп-лосс следом за ценой, 

void TrallOnTick() {

// берём рыночный ордер (для 5-ки позицию)

        // смотрим сколько пунктов от текущей цены до стоп-лосс

        // если больше чем требуемая дистанция

        // переносим стоп-лосс

}

Basicamente, tudo. Além disso, após cada comentário você escreve um código de 3-5 (um pouco em geral) linhas. Toda sua função do início ao fim deve caber na tela que você vê. Se você conseguir mais, isso significa que os fragmentos devem ser separados em funções/métodos separados.

Quando uma coisa tão elementar começa a funcionar no testador, você pode generalizar, adicionar condições da vida real, mudança de passos ou freqüência, por exemplo, levar em conta as condições do mercado, não há limite para a perfeição...

Olá Maxim! Você é muito útil com sua dica! Estou aqui sentado me perguntando como preencher um modelo padrão da EA.

Cumprimentos, Vladimir.

 
MrBrooklin:

Prezados especialistas em programação!

Por favor, explique duas perguntas:

  1. Primeira pergunta sobre o Magic Number - ele é criado em parâmetros de entrada apenas para ordens pendentes e posições abertas (ou apenas para posições abertas?), ou para a própria EA ele também pode ser criado? Se a resposta for "sim", para que propósito isto deve ser feito. Eu realmente me confundi com esta pergunta e não tenho uma boa resposta.
  2. A segunda pergunta sobre o Magic Number - se houver mais de uma posição aberta no gráfico atual, então é possível aplicar tal parâmetro de entrada para determinar cada posição:

Talvez eu tenha um entendimento errado sobre a aplicação do Magic Number na programação.

Cumprimentos, Vladimir.

Quando uma ordem é aceita para execução todas as suas características (símbolo, tempo, tipo de ordem, bilhete) são atribuídas pelo terminal (solicitado pelo usuário e atribuído pelo terminal) e não pelo usuário e o mesmo com a posição, a posição armazena informações sobre suas ordens, mas pode haver muitas delas. E o número mágico é um identificador de usuário. Citação:

Quando criamos um novo pedido pendente, precisamos marcá-lo de alguma forma - para que o programa possa saber que este pedido em particular foi colocado pela NAMI neste pedido pendente em particular - ou seja, precisamos identificar e associar de forma única um pedido ou posição com um pedido pendente em particular.

NAMI está faltando em seu significado. E então a Artem coloca a classificação das ordens no número Magik. Por que não, os 2 primeiros dígitos indicam algo, por exemplo, o tipo de pedido, os 4 dígitos seguintes indicam a data do pedido.

Em relação ao algoritmo de alguma coisa. Definir inicialmente as condições iniciais. Há ordens em nosso símbolo e não as levamos em conta ou as levamos em conta. Sem condições iniciais de retrabalho ao criar o algoritmo, e ainda mais para que o código possa ser eterno)

 
Maxim Kuznetsov:

abstrato, existe uma técnica de alfabetização-programação que permite escrever de forma muito rápida e inteligível.

Em geral, estilo de programação de alfabetização, escreva nos comentários o que você vai fazer (apenas a seqüência direta principal) ...

... Basicamente, tudo. Em seguida, após cada comentário você escreve o código 3-5 (não muito em geral) linhas. Toda a função do início ao fim deve caber na tela que você vê. Se você conseguir mais, isso significa que você tem que separar os fragmentos em funções/métodos separados.

Maxim, por favor verifique se entendi bem sua dica ou há algo mais que eu precise acrescentar? Refiro-me à parte do teste, porque eu ainda não escrevi os códigos.

Cumprimentos, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры: "Уровень перестановки Stop Loss в безубыток" и "Шаг трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---

// 1. берём позицию Buy
// 2. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 4. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

Maxim, por favor, veja se entendi bem sua dica, ou há algo mais que eu precise acrescentar? Refiro-me à parte do teste, além dos códigos.

Atenciosamente, Vladimir.

Condições iniciais. Calculamos que há uma posição em nosso símbolo e a vemos no gráfico.

Se temos uma posição, é apenas uma, ou comprar ou vender. Portanto, começamos por procurar posições em nosso símbolo. Solicitar / obter características. Determinação do tipo de posição - comprar ou vender. E assim por diante através do texto.

 
Valeriy Yastremskiy:

Quando uma ordem é aceita para execução todas as suas características (símbolo, hora de emissão, tipo de ordem, bilhete) são atribuídas pelo terminal (solicitado pelo usuário e atribuído pelo terminal), não pelo usuário, e o mesmo acontece com a posição, a posição armazena informações sobre suas ordens, mas pode haver muitas delas. E o número mágico é um identificador de usuário. Citação:

Quando criamos um novo pedido pendente, precisamos marcá-lo de alguma forma - para que o programa possa saber que este pedido em particular foi colocado pela NAMI neste pedido pendente em particular - ou seja, precisamos identificar e associar de forma única um pedido ou posição com um pedido pendente em particular.

NAMI está faltando em seu significado. E então a Artem coloca a classificação das ordens no número Magik. Por que não, os 2 primeiros dígitos indicam algo, por exemplo, o tipo de pedido, os 4 dígitos seguintes indicam a data do pedido.

Em relação ao algoritmo de alguma coisa. Definir inicialmente as condições iniciais. Há ordens em nosso símbolo e não as levamos em conta ou as levamos em conta. Sem as condições iniciais retrabalhar ao criar o algoritmo, e ainda mais, o código pode levar uma eternidade)

Obrigado, Valeriy, pela resposta detalhada. Muitas coisas se tornaram mais claras. Eu sinto o mesmo sobre o algoritmo, mas Vassily já explicou porque não precisamos do Número Mágico neste EA.

Cumprimentos, Vladimir

 
MrBrooklin:

Obrigado, Valery, pela resposta detalhada. Isso esclareceu muita coisa. Tenho a mesma opinião sobre o algoritmo, mas Vasiliy já explicou porque não precisamos do Número Mágico neste EA.

Atenciosamente, Vladimir.

Abrimos um gráfico e há uma posição no símbolo do gráfico, não sabemos o que é e queremos abri-lo no breakeven e depois arrastá-lo SL para reduzir as perdas caso o preço se inverta.

 

Com as correções da Valery, o modelo EA com comentários ganhou um novo visual.

Cumprimentos, Vladimir.

//+------------------------------------------------------------------+
//|                                                Trailing_Stop.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"
// установим входные параметры для "Уровня перестановки Stop Loss в безубыток" и "Шага трейлинга"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
//    тралим стоп-лосс единственной открытой позиции по сигналу от тиков
void OnTick()
  {
//---
// 1. ищем все позиции на текущем символе:
//    - отправляем запрос на сервер и получаем характеристики открытых позиций
//    - определяем тип открытой позиции - Buy или Sell 
// 2. берём позицию Buy
// 3. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, по которой открылась позиция:
//    - если количество пунктов больше, чем задано во входном параметре "Уровень перестановки Stop Loss в безубыток"
//    - тогда переносим стоп-лосс на уровень цены, по которой открылась эта позиция
// 4. смотрим сколько пунктов прошла текущая цена в нужном направлении от той цены, при которой мы перенесли 
//    стоп-лосс на уровень цены открытия позиции:
//    - если количество пунктов больше, чем задано во входном параметре "Шаг трейлинга"
//    - тогда переносим стоп-лосс на количество пунктов, укзанных во входном параметре "Шаг трейлинга"
// 5. берём позицию Sell и выполняем все те же действия, описанные в пунктах 2 и 3
  }
//+------------------------------------------------------------------+
 

Vladimir, você não precisa aproveitá-lo por muito tempo. Vamos entrar na ação. Escrevi um modelo da trilha desejada para você:

//+------------------------------------------------------------------+
//|                                                  TestingTral.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MrBrooklin"
#property link      "http://www.mql5.com"
#property version   "1.00"
input double BreakevenValue = 100.0; // Величина безубытка, в пунктах инструмента
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //-- Выбираем позиции по текущему символу. Если позиции нет выбирать нечего - выходим
   if(!PositionSelect(Symbol()))
      return;
   //-- Стоп-лосс длинной позиции переставляем в безубыток и тралим его
   if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
   {
      SetBreakevenForBuyPosition();
      TrailingStopLossForBuyPosition();
   }
   //-- Стоп-лосс короткой позиции переставляем в безубыток и тралим его
   else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
   {
      SetBreakevenForSellPosition();
      TrailingStopLossForSellPosition();
   }
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции BUY в безубыток                         |
//+------------------------------------------------------------------+
void SetBreakevenForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForBuyPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Устанавливает sl позиции SELL в безубыток                        |
//+------------------------------------------------------------------+
void SetBreakevenForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+
//| Тралит стоп-лосс позиции BUY вслед за ценой                      |
//+------------------------------------------------------------------+
void TrailingStopLossForSellPosition()
  {
   ;   
  }
//+------------------------------------------------------------------+

Tudo que você precisa fazer é preencher as funções com a lógica correspondente a seus nomes. Como você pode ver, o modelo é elementar. E estruturalmente semelhante aos ToR.

Note que este código compila, ou seja, do ponto de vista do compilador, está correto. Sempre se esforçar por este estado: ou seja, fazer pequenas mudanças durante o desenvolvimento, para que, após fazê-las, o código possa compilar. Também se esforçar para ter o relatório do compilador "0 erro, o avisos". É claro que não se pode executar o programa com erros, mas os avisos do compilador devem ser percebidos como a Oração de nosso Pai: se houver um aviso, ele deve ser corrigido. Este modelo é feito com "0 erro, o avisos" - salve este status até o final do desenvolvimento.

Uma vez entendida a lógica e entendido o compilador, tudo o que precisamos fazer é equipar as funções com a lógica necessária.

O segundo parâmetro, o valor da trilha, será movido para a próxima versão, por enquanto. Isso exigirá cálculos adicionais. É por isso que ela não está presente neste modelo. A rede de arrasto será ajustada a cada tique.

 
Vasiliy Sokolov:

Vladimir, você não precisa aproveitá-lo por muito tempo. Vamos entrar na ação. Escrevi um modelo da trilha desejada para você:

Tudo que você precisa fazer é preencher as funções com a lógica correspondente a seus nomes. Como você pode ver, o modelo é elementar. E estruturalmente semelhante aos ToR.

Note que este código compila, ou seja, do ponto de vista do compilador, está correto. Sempre se esforçar por este estado: ou seja, fazer pequenas mudanças durante o desenvolvimento, para que, após fazê-las, o código possa compilar. Também se esforçar para ter o relatório do compilador "0 erro, o avisos". É claro que não se pode executar o programa com erros, mas os avisos do compilador devem ser percebidos como a Oração de nosso Pai: se houver um aviso, ele deve ser corrigido. Este modelo é feito com "0 erro, o avisos" - salve este status até o final do desenvolvimento.

Uma vez entendida a lógica e entendido o compilador, tudo o que precisamos fazer é equipar as funções com a lógica que precisamos.

O segundo parâmetro, o valor da trilha, será movido para a próxima versão, por enquanto. Isso exigirá cálculos adicionais. É por isso que ela não está presente neste modelo. A rede de arrasto será atualizada a cada tique.

Vasiliy, claro que quero agradecer-lhe por fazer tanto trabalho, mas isso não me ajuda a entender de onde vêm essas funções e operadores e, o mais importante, por que eles estão lá. Teria sido mais correto chegar ao ponto de escrever esse código, o que você me sugeriu. Eu mesmo queria chegar a este ponto e agora quero fazê-lo.

Entendo que vocês, como muitos outros, estão cansados de minha constante soletração de todas as linhas de código e pisoteio no local, mas o problema é que ainda não entendo como tudo é construído, desde o algoritmo até a escrita do código. Devo acrescentar a falta de conhecimento de inglês ao problema, pois tenho que copiar e colar quase todas as mensagens de erro e aviso do compilador, e outras palavras em inglês, no Google Translator. A propósito, se alguém tentou executar esses micro-códigos, mesmo nano-códigos que coloquei neste tópico, todos eles passaram na compilação com "0 erro, 0 avisos".

Agora eu preciso de algum tempo para perceber, ou melhor, para entender por que estas funções e operadores apareceram. Portanto, em resumo, é um horror silencioso. E eu sou um mau aluno quando não entendo as coisas elementares.

Obrigado e a todos os outros programadores por tolerarem a minha lentidão. Embora eu perceba que sua paciência não é ilimitada.

Atenciosamente, Vladimir.