Как определить в какую сторону закрылась свеча.

 
Как определить в какую сторону закрылась свеча с индексом i+1
 
Igor Kryuchkov:
Как определить в какую сторону закрылась свеча с индексом i+1

В индикаторе - в OnCalculate() есть все необходимые массивы таймсерии - только с индексированием не перепутайте. В советнике - при помощи CopyOpen() и CopyClose().

 

Вот пример советника "The direction of the closed candle.mq5":

//+------------------------------------------------------------------+
//|                           The direction of the closed candle.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.000"
#property description "The direction of the closed candle"
//--- input parameters
input int     InpNumberCandle=1; // number of a candle (the most right has the index "0")
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
   double open=iOpen(InpNumberCandle);
   double close=iClose(InpNumberCandle);
//--- protection
   if(open==0 || close==0)
      return;

   double direction=close-open;
   if(direction>0)
      text="UP";
   if(direction<0)
      text="DOWN";
   if(direction==0)
      text="---";

   Comment("The candle No. ",IntegerToString(InpNumberCandle)," was closed: ",text);
  }
//+------------------------------------------------------------------+
//| Get Open for specified bar index                                 |
//+------------------------------------------------------------------+
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[];
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[];
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+

И картинка:

The direction of the closed candle 

 
Vladimir Karputov:

Вот пример советника "The direction of the closed candle.mq5":

//+------------------------------------------------------------------+
//|                           The direction of the closed candle.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.000"
#property description "The direction of the closed candle"
//--- input parameters
input int     InpNumberCandle=1; // number of a candle (the most right has the index "0")
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   string text="";
   double open=iOpen(InpNumberCandle);
   double close=iClose(InpNumberCandle);
//--- protection
   if(open==0 || close==0)
      return;

   double direction=close-open;
   if(direction>0)
      text="UP";
   if(direction<0)
      text="DOWN";
   if(direction==0)
      text="---";

   Comment("The candle No. ",IntegerToString(InpNumberCandle)," was closed: ",text);
  }
//+------------------------------------------------------------------+
//| Get Open for specified bar index                                 |
//+------------------------------------------------------------------+
double iOpen(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Open[];
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(symbol,timeframe,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[];
   double close=0;
   ArraySetAsSeries(Close,true);
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }
//+------------------------------------------------------------------+

И картинка:

...Увидев код... хочется схватиться за голову. Вот столько всего ради того, чтобы решить такой простой вопрос? Владимир, такими темпами Вы точно не популяризируете mql5. Понимаю, собрано из кусочков с намеком на универсальность и подобие mql4, но для новичков - это жесть. 

Сейчас последует что-то типа: "Предложите свой вариант..." и Вы будете правы, не предложу (ночь на дворе). 

Высказал исключительно свое ИМХО. 

 
Alexey Kozitsyn:

...Увидев код... хочется схватиться за голову. Вот столько всего ради того, чтобы решить такой простой вопрос? Владимир, такими темпами Вы точно не популяризируете mql5. Понимаю, собрано из кусочков с намеком на универсальность и подобие mql4, но для новичков - это жесть. 

Сейчас последует что-то типа: "Предложите свой вариант..." и Вы будете правы, не предложу (ночь на дворе). 

Высказал исключительно свое ИМХО. 

Это действительно собрано из готовых кусочков. И, заметьте - это Вам не оголтелый код MQL4 без единой проверки результата - здесь результат проверяется, например здесь:

   if(copied>0) close=Close[0];
   return(close);

.

И не вижу ничего плохого в наличии готовых кирпичиков, из которых можно построить быстрый пример. 
 

Добавлено: и никакого "подобия mql4" - не нужно выражаться. 

 
Vladimir Karputov:

Это действительно собрано из готовых кусочков. И, заметьте - это Вам не оголтелый код MQL4 без единой проверки результата - здесь результат проверяется, например здесь:

   if(copied>0) close=Close[0];
   return(close);

.

И не вижу ничего плохого в наличии готовых кирпичиков, из которых можно построить быстрый пример. 
 

Добавлено: и никакого "подобия mql4" - не нужно выражаться

Владимир, да вы экстремист...(задумчиво)
 
Vladimir Karputov:

Это действительно собрано из готовых кусочков. И, заметьте - это Вам не оголтелый код MQL4 без единой проверки результата - здесь результат проверяется, например здесь:

...

И не вижу ничего плохого в наличии готовых кирпичиков, из которых можно построить быстрый пример. 
 

Добавлено: и никакого "подобия mql4" - не нужно выражаться. 

С чего вы взяли, что MQL4 "оголтелый" и "матерщинный"?

Это вы так MetaQuotes уважаете?

Так ведь и на mql5 можно написать великую лажу...

Добавлено. Владимир, а что вы скажете о mql5, когда на свет появится mql6 ? Тоже попросите не выражаться и не поминать всуе?

И, да, чтобы популяризировать mql5, не достаточно поливать грязью прошлый язык этой же компании. Нужно грамотно и красиво, не задевая никого, уметь объяснить, показать и рассказать.

Желаю вам успехов в овладении этим мастерством - не каждому может даться такое искусство.

 
Vladimir Karputov:

Это действительно собрано из готовых кусочков. И, заметьте - это Вам не оголтелый код MQL4 без единой проверки результата - здесь результат проверяется, например здесь:

   if(copied>0) close=Close[0];
   return(close);

.

И не вижу ничего плохого в наличии готовых кирпичиков, из которых можно построить быстрый пример. 
 

Добавлено: и никакого "подобия mql4" - не нужно выражаться. 

Поясню, что я имел ввиду под "подобие mql4". Это не стиль написания функций, а только лишь названия iOpen() и iClose(). Думаю, совпадение не случайно.

Про наличие кирпичиков я также ничего против не имею. Лишь заметил, что эти кирпичики начинающему будет достаточно сложно понять и можно будет подумать, что язык достаточно сложен. Причем эти кирпичики достаточно специфичны, т.е. на любителя.

И если уж зашел разговор про проверку результата... в случае получения более, чем 1 элемента с такой проверкой могут возникнуть проблемы, т.к. не проверяется точное количество получаемых элементов:

При запросе данных из эксперта или скрипта, будет инициирована загрузка с сервера, если локально этих данных у терминала нет, либо начнется построение нужной таймсерии, если данные можно построить из локальной истории, но они еще не готовы. Функция вернет то количество данных, которые будут готовы к моменту истечения таймаута, но загрузка истории будет продолжаться, и при следующем аналогичном запросе функция вернет уже больше данных. 

 
Vladimir Karputov:

 

Добавлено: и никакого "подобия mql4" - не нужно выражаться. 

Привет от MQL4

//+------------------------------------------------------------------+
string GreetingsFromMQL4(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift)
  {
   MqlRates rates[1];
   string result="Нифига не вышло :(";
   if(CopyRates(symbol_name,timeframe,shift,1,rates)<0) Print(__FUNCTION__," > Шайтанаме! Не скопировались данные, насяльнике!!!");
   else result=rates[0].close>rates[0].open?"Бар "+(string)shift+" бычий":rates[0].close<rates[0].open?"Бар "+(string)shift+" медвежий": "Бар "+(string)shift+" додж";
   return(result);
  }
//+------------------------------------------------------------------+

Подобие mql5 можно?

 
Artyom Trishkin:

Привет от MQL4

//+------------------------------------------------------------------+
string GreetingsFromMQL4(string symbol_name, ENUM_TIMEFRAMES timeframe, int shift)
  {
   MqlRates rates[1];
   string result="Нифига не вышло :(";
   if(CopyRates(symbol_name,timeframe,shift,1,rates)<0) Print(__FUNCTION__," > Шайтанаме! Не скопировались данные, насяльнике!!!");
   else result=rates[0].close>rates[0].open?"Бар "+(string)shift+" бычий":rates[0].close<rates[0].open?"Бар "+(string)shift+" медвежий": "Бар "+(string)shift+" додж";
   return(result);
  }
//+------------------------------------------------------------------+

Подобие mql5 можно?

Артём, этот код будет работать и в МТ5 с тем-же успехом. Проблема лишь в том что у барабашки не хватит знаний, опыта и способностей это понять.
 
Alexey Viktorov:
Артём, этот код будет работать и в МТ5 с тем-же успехом. Проблема лишь в том что у барабашки не хватит знаний, опыта и способностей это понять.

Фанатеющие люди не замечают хорошего в том, что не является предметом их поклонения

Причина обращения: