Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1202

 
Alexey Belyakov:

Добрый день!

Мучаюсь тут над одним вопросом, подскажите пожалста, как его решить.

Суть, такая:  Рисуется линия по предыдущему максимуму свечи. Мне нужно чтобы линия смещалась в зависимости от предыдущего максимума.

А кто мешает просто менять цену линии на тиках, когда нужно?

//+------------------------------------------------------------------+
//|                                                  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"); // комментарий пред. максимума
  }
}
//+------------------------------------------------------------------+
Файлы:
 
Подскажите, пожалуйста, как  MT5 узнать из истории цену и время первой сделки при открытии позиции и цену и время первой сделки закрытия этой позиции? Цель - из истории получить массив точек входа, так как при ручной торговле иногда доливаюсь, то хочу понять эффективно это или нет. В торговых операциях совсем не разбираюсь - использую класс, в котором эти функции не реализованы :(
 
Aleksei Beliakov:
Есть 2 варианта
1. Удаляй объект перед созданием
2. Устанавливай цену после создания обьекта

Привет тёзка по имени и фамилии!)


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

Рассмотрел вариант №1, что то близко. Но не корректно как-то происходит.На первых этапах по плану, потом  в разнос.

 
Mihail Matkovskij:

А кто мешает просто менять цену линии на тиках, когда нужно?


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

Ну как-бы да. Если чуть-чуть добавить условия, то будет проблема. Он рисует  одну линию.  А нужно чтобы: если не появился новый high/low, то он сохраняется.

 
Alexey Belyakov:


Ну как-бы да. Если чуть-чуть добавить условия, то будет проблема. Он рисует  одну линию.  А нужно чтобы: если не появился новый high/low, то он сохраняется.

Не знаю, кто вам помешал взять и добавить еще одну линию для 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);  
  }
}
//+------------------------------------------------------------------+

Можно добавить хоть целый массив линий или других объектов и помечать ими хоть каждый Low и High. В чём проблема?...

 
Aleksey Vyazmikin:
Подскажите, пожалуйста, как  MT5 узнать из истории цену и время первой сделки при открытии позиции и цену и время первой сделки закрытия этой позиции? Цель - из истории получить массив точек входа, так как при ручной торговле иногда доливаюсь, то хочу понять эффективно это или нет. В торговых операциях совсем не разбираюсь - использую класс, в котором эти функции не реализованы :(

Вам поможет HistorySelectByPosition

Дальше несколько вариантов:

  • Брать сделки, проверять свойство DEAL_ENTRY_IN или DEAL_ENTRY_OUT вход в рынок или выход и брать цену и время этой сделки.
  • Брать ордера. С индексом 0 это вход в рынок, соответственно OrdersTotal()-1 выход из рынка.
  • А лучше всего брать оба варианта. Дело в том, что если позиция открылась с проскальзыванием, то цена сделки ≠ цене ордера. Соответственно берите то что вам надо.
Документация по MQL5: Торговые функции / HistorySelectByPosition
Документация по MQL5: Торговые функции / HistorySelectByPosition
  • www.mql5.com
Не следует путать между собой ордера из торговой истории и действующие отложенные ордера, которые отображаются на вкладке "Торговля" в панели "Инструменты". Список ордеров, которые были отменены или привели к проведению торговой операции, можно посмотреть  в закладке "История" на панели "Инструменты" клиентского терминала. Функция...
 
Можно как-то в мт5 компактно объявить кучу буферов?
 
Mihail Matkovskij:

Не знаю, кто вам помешал взять и добавить еще одну линию для Low?...

Можно добавить хоть целый массив линий или других объектов и помечать ими хоть каждый Low и High. В чём проблема?...

Да! Работает как надо! Спасибо Mihail!


А если пробили линию нижнюю, и надо удалить по факту пробития, типа:

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

Верно?

 
Alexey Belyakov:

Да! Работает как надо! Спасибо Mihail!


А если пробили линию нижнюю, и надо удалить по факту пробития, типа:

Верно?

В программе для подсветки уровней используется всего две линии. Зачем удалять, а затем снова создавать, если можно просто установить в 0?...

lLine.Price(0, 0.0);

Линию не будет видно на графике... А затем можно снова её показать:

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

В программе для подсветки уровней используется всего две линии. Зачем удалять, а затем снова создавать, если можно просто установить в 0?...

Линию не будет видно на графике... А затем можно снова её показать:

Таким образом? Или нужно ещё в OnInit что-то объявлять?

if (c0<PRL)  
{
lLine.Price(0,0.0);
}
Причина обращения: