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

 
Alexey Belyakov:

Boa tarde!

Estou me debatendo com uma pergunta. Por favor, me diga como resolvê-la.

A idéia é a seguinte: eu traço uma linha no máximo anterior da vela. Quero que a linha seja deslocada de acordo com o máximo anterior.

Quem me impede de mudar o preço da linha em carrapatos quando eu preciso dele?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   PRH;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи

  if (rs1 >= rt) // условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же всечи, то...   
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
    Comment("ЦЕНА МАКС =======", PRH, "\n"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
Arquivos anexados:
 
Você pode me dizer como a MT5 sabe da história o preço e o tempo da primeira negociação ao abrir uma posição e o preço e o tempo da primeira negociação ao fechar essa posição? O objetivo é obter uma série de pontos de entrada da história, porque às vezes eu tenho equidade ao negociar manualmente, por isso quero entender se ela é eficaz ou não. Eu não sei nada sobre operações comerciais, eu uso uma classe, onde estas funções não foram implementadas :(
 
Aleksei Beliakov:
Há 2 opções
1. Eliminar um objeto antes de criá-lo
2. Estabelecer um preço depois que o objeto é criado

Olá homônimo!)


void OnTick()
  {
//---
   double   o1 = iOpen(Symbol(),Period(),1);
   double   h1 = iHigh(Symbol(),Period(),1);
   double   l1 = iLow(Symbol(),Period(),1);
   double   c1 = iClose(Symbol(),Period(),1);
   double   c0 = iClose(Symbol(),Period(),0);
   double   rt = 0;
   double   rs1 = 0;
   double   rs2 = 0;
   
rt=MathAbs(c1-o1)/_Point; //размер тела свечи
rs1=MathAbs(h1-c1)/_Point;// размер верхней тени свечи
rs2=MathAbs(l1-c1)/_Point; // размер нижней тени свечи

ObjectDelete(0,"HL");

if ((rs1>=rt)&&(c1>o1)) //[для ростовых свечей] условие для построения уровней (если верхняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRH=iHigh(Symbol(),_Period,1); // то это будет максимум
ObjectCreate(0,"HL",OBJ_HLINE,0,_Period,PRH); // и строим по этому максимуму, горизонтальную линию
}

ObjectDelete(0,"lL");

if ((rs2>=rt)&&(c1<o1)) // [для падающих свечей]условие для построения уровней (если нижняя тень предыдущей свечи, больше, или равна телу этой же свечи, то...   
{
double PRL=iLow(Symbol(),_Period,1); // то это будет минимум
ObjectCreate(0,"lL",OBJ_HLINE,0,_Period,PRL); // и строим по этому минимум, горизонтальную линию
}
}

Considerada a opção 1, algo próximo. Mas de alguma forma não acontece. Numa primeira fase de acordo com o planejado, depois numa confusão.

 
Mihail Matkovskij:

E quem o impede de simplesmente mudar o preço da linha nos carrapatos quando você precisa?


//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1>= rt)&&(c1>o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
   if ((rs2>= rt)&&(c1<o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    hLine.Price(0, PRL);  
  }
  
  
}
//+------------------------------------------------------------------+

Bem, mais ou menos, sim. Se você acrescentar condições apenas um pouco, há um problema. O que ele precisa é: se não há nenhuma nova linha alta/baixa, ele é salvo.

 
Alexey Belyakov:


Bem, mais ou menos, sim. Se você acrescentar condições apenas um pouco, há um problema. Ele traça uma linha: se não há nenhuma nova alta/baixa, ele é salvo.

Não sei, quem o impede de acrescentar outra linha para Low...?

//+------------------------------------------------------------------+
//|                                                  HiBkExample.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include <ChartObjects\ChartObjectsLines.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CChartObjectHLine hLine, lLine;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  hLine.Create(0, "hLine", 0, 0);
  hLine.Color(clrDarkViolet);
  lLine.Create(0, "lLine", 0, 0);
  lLine.Color(clrDodgerBlue);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  double   o1 = iOpen(NULL, PERIOD_CURRENT, 1);
  double   h1 = iHigh(NULL, PERIOD_CURRENT, 1);
  double   l1 = iLow(NULL, PERIOD_CURRENT, 1);
  double   c1 = iClose(NULL, PERIOD_CURRENT, 1);
  double   c0 = iClose(NULL, PERIOD_CURRENT, 0);
  double   rt = 0;
  double   rs1 = 0;
  double   rs2 = 0;
  double   PRH;
  double   PRL;

  rt=MathAbs(c1 - o1) / Point(); //размер тела свечи
  rs1=MathAbs(h1 - c1) / Point();// размер верхней тени свечи
  rs2=MathAbs(l1 - c1) / Point();// размер нижней тени свечи

  if ((rs1 >= rt) && (c1 > o1)) //условия для растущих свечей
  {
    PRH = iHigh(NULL, PERIOD_CURRENT, 1); // то это будет максимум
    hLine.Price(0, PRH);
  }
  
  if ((rs2 >= rt) && (c1 < o1)) //условия для падающих свечей 
  {
    PRL = iLow(NULL, PERIOD_CURRENT, 1);
    lLine.Price(0, PRL);  
  }
}
//+------------------------------------------------------------------+

Você pode adicionar toda uma série de linhas ou outros objetos e marcar cada Baixo e Alto com ele. Qual é o problema...?

 
Aleksey Vyazmikin:
Por favor, informe como obter o preço e o tempo do primeiro negócio ao abrir uma posição e o preço e o tempo do primeiro negócio para fechar esta posição da história. Meu propósito é obter uma série de pontos de entrada da história, porque às vezes eu tenho equidade ao negociar manualmente, por isso quero saber se ela é efetiva ou não. Eu não sei nada sobre comércio - estou usando uma classe, onde estas funções não foram implementadas :(

HistorySelectByPosition o ajudará

Depois, há várias opções:

  • Pegue as negociações, verifique oDEAL_ENTRY_IN ou DEAL_ENTRY_OUT propriedade para entrar ou sair do mercado e pegue o preço e o tempo dessa negociação.
  • Receber ordens. Com índice 0 esta é uma entrada no mercado, respectivamente OrdensTotal()-1 uma saída do mercado.
  • A melhor maneira é pegar os dois. A questão é que se a posição for aberta com um deslize, o preço do negócio ≠ o preço do pedido. Portanto, leve o que você precisa.
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
Existe alguma maneira de declarar um monte de amortecedores compactamente em mt5?
 
Mihail Matkovskij:

Não sei, quem o impede de acrescentar outra linha para Low...?

Você pode adicionar toda uma série de linhas ou outros objetos e marcar cada Baixo e Alto com eles. Qual é o problema...?

Sim! Está funcionando corretamente! Obrigado Mihail!


E se você tiver perfurado a linha de fundo e precisar apagá-la após o piercing, como por exemplo:

if (c0<PRL)  
  {
  lLine.Delete(0,"lLine"); 
  }

Certo?

 
Alexey Belyakov:

Sim! Funciona como deveria! Obrigado Mihail!


E se a linha de fundo for perfurada e você tiver que apagar no fato de perfurar, como por exemplo:

Certo?

O programa utiliza apenas duas linhas para destacar os níveis. Por que apagar e depois criar de novo se você pode simplesmente definir para 0...?

lLine.Price(0, 0.0);

A linha não será visível no gráfico... E então você pode mostrá-lo novamente:

lLine.Price(0, PRL);
 
Mihail Matkovskij:

O programa utiliza apenas duas linhas para destacar os níveis. Por que apagar e depois recriar quando você pode simplesmente colocar em 0...?

A linha não será visível no gráfico... E então você pode mostrá-lo novamente:

Assim? Ou é necessário declarar algo mais no OnInit?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}
Razão: