Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1202

 
Alexey Belyakov:

¡Buenas tardes!

Tengo una duda, por favor, dígame cómo resolverla.

La idea es la siguiente: trazo una línea en el máximo anterior de la vela. Quiero que la línea se desplace en función del máximo anterior.

¿Quién me impide cambiar el precio de la línea en los ticks cuando lo necesito?

//+------------------------------------------------------------------+
//|                                                  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"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
Archivos adjuntos:
 
¿Me pueden decir cómo MT5 sabe por el historial el precio y la hora de la primera operación al abrir una posición y el precio y la hora de la primera operación al cerrar esa posición? El propósito es obtener una matriz de puntos de entrada del historial, porque a veces la equidad cuando el comercio de forma manual, así que quiero entender si es eficaz o no. No sé nada de las operaciones comerciales, uso una clase, donde estas funciones no han sido implementadas :(
 
Aleksei Beliakov:
Hay dos opciones
1. Eliminar un objeto antes de crearlo
2. Establecer un precio después de la creación del objeto

Hola tocayo)


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); // и строим по этому минимум, горизонтальную линию
}
}

Consideró la opción 1, algo cercano. Pero no es correcto de alguna manera sucede. En las primeras etapas de acuerdo con el plan, a continuación, en un lío.

 
Mihail Matkovskij:

¿Y quién le impide cambiar simplemente el precio de la línea en los ticks cuando lo necesite?


//+------------------------------------------------------------------+
//|                                                  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);  
  }
  
  
}
//+------------------------------------------------------------------+

Bueno, más o menos, sí. Si añades condiciones sólo un poco, hay un problema. Traza una línea. Lo que necesita es: si no hay un nuevo máximo/mínimo, se guarda.

 
Alexey Belyakov:


Bueno, más o menos, sí. Si añades condiciones sólo un poco, hay un problema. Traza una línea. Lo que necesita es: si no hay un nuevo máximo/mínimo, se guarda.

No sé, ¿quién te impide añadir otra línea 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);  
  }
}
//+------------------------------------------------------------------+

Puedes añadir toda una serie de líneas u otros objetos y marcar cada mínimo y máximo con ellos. ¿Cuál es el problema...?

 
Aleksey Vyazmikin:
Por favor, aconséjeme cómo obtener el precio y la hora de la primera operación al abrir una posición y el precio y la hora de la primera operación al cerrar esta posición desde el historial. Mi propósito es obtener una matriz de puntos de entrada del historial, ya que a veces hago equidad al operar manualmente, por lo que quiero saber si es efectivo o no. No sé nada sobre el comercio - Estoy usando una clase, donde estas funciones no se han implementado :(

HistorySelectByPosition le ayudará a

Entonces hay varias opciones:

  • Tomar operaciones, comprobar la propiedadDEAL_ENTRY_IN o DEAL_ENTRY_OUT para entrar o salir del mercado y tomar el precio y el tiempo de esa operación.
  • Toma los pedidos. Con el índice 0 se trata de una entrada en el mercado, respectivamente OrdersTotal()-1 una salida del mercado.
  • Lo mejor es tomar ambos. La cuestión es que si la posición se abre con un deslizamiento, el precio de la operación ≠ el precio de la orden. En consecuencia, tome lo que necesite.
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
¿Hay alguna manera de declarar un montón de buffers de forma compacta en mt5?
 
Mihail Matkovskij:

No sé, ¿quién te impide añadir otra línea para Low...?

Puedes añadir toda una serie de líneas u otros objetos y marcar cada mínimo y máximo con ellos. ¿Cuál es el problema...?

¡Sí! ¡Funciona correctamente! ¡Gracias Mihail!


Y si has perforado la línea de fondo y necesitas borrarla después de la perforación, como:

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

¿Verdad?

 
Alexey Belyakov:

¡Sí! ¡Funciona como debería! ¡Gracias Mihail!


Y si la línea de fondo está perforada y tienes que borrarla cuando está perforada, como:

¿Verdad?

El programa sólo utiliza dos líneas para resaltar los niveles. ¿Por qué borrarlo y volver a crearlo si puedes ponerlo a 0?

lLine.Price(0, 0.0);

La línea no será visible en el gráfico... Y luego puedes volver a mostrarlo:

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

El programa sólo utiliza dos líneas para resaltar los niveles. ¿Por qué borrar y volver a crear cuando puedes ponerlo a 0?

La línea no será visible en el gráfico... Y luego puedes volver a mostrarlo:

¿Así? ¿O es necesario declarar algo más en OnInit?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}