Ваши вопросы по языку MQL4

блондинка

Элитный участник
Такой вопрос)Очень интересно)
Можно ли в код индикатора прописать невозможность его бросить на график, но в то же время что бы он работал через iCustom(..........) как внешний в другом индикаторе (т.е. вызывался)?
Как выглядит такой код и куда его вставить(надо MQL4)?
Заранее благодарна за ответ)
 

Абдулхаким

Почетный гражданин
Можно ли в код индикатора прописать невозможность его бросить на график
Если бы у меня была такая задача, я бы пробовал методом тыка :)
INIT_FAILED при инициализации,
ChartIndicatorDelete() в конце OnCalculate(),
Экспорт функций, но тут уже без iCustom и придётся переписать код.
Если буквально нужно чтобы индикатор нельзя было бросить на график и варианты с его удалением не подходят, можно записать его как скрипт или эксперт (наверно с нюансами), поместить в папку индикаторов, и в коде сделать экспорт функций.
 

mobidik

-----
Такой вопрос)Очень интересно)
Можно ли в код индикатора прописать невозможность его бросить на график, но в то же время что бы он работал через iCustom(..........) как внешний в другом индикаторе (т.е. вызывался)?
Как выглядит такой код и куда его вставить(надо MQL4)?
Заранее благодарна за ответ)
Как вариант, нужно добавить в настройках строку типа ввода ключа, пароля. Но, можно и не добавлять новую строку, а использовать имеющиеся параметры. Например: если в перечне настроек есть строки настроек не влияющих на работу индикатора (см скрин), то можно к ним привязаться. Если установить с параметрами по умолчанию - индикатор самоудалится, используя ф-цию ChartIndicatorDelete(), а вот когда вместо знаков равно "=====" прописать волшебное слово - индикатор будет работать. Получается скрытый ввод ключа. Можно подобное проделать и с вводом цвета, например, задать "рабочий" цвет как: 240,39,174, а по умолчанию указать DeepSkyBlue, но это уже будет при работе фиксированное значение параметра. Соответственно, в самом коде нужно реализовать нужные проверки, а при вызове, в списке параметров, указывать верные значения.
 

Вложения

  • 001.png
    001.png
    21,7 КБ · Просмотры: 24

mobidik

-----
Ups, все оказывается гораздо проще: нужно использовать ф-цию ChartWindowFind() - если она возвращает значение больше 0 - индикатор находится на графике, а при его вызове через iCustom(), данная ф-ция вернет -1. Т.е., если ChartWindowFind()>=0, тогда ChartIndicatorDelete().

Все как обычно, ларчик просто открывался...
 

блондинка

Элитный участник
Ups, все оказывается гораздо проще: нужно использовать ф-цию ChartWindowFind() - если она возвращает значение больше 0 - индикатор находится на графике, а при его вызове через iCustom(), данная ф-ция вернет -1. Т.е., если ChartWindowFind()>=0, тогда ChartIndicatorDelete().

Все как обычно, ларчик просто открывался...
Александр! Мне бы лучше на примере)У меня ведь со знаниями совсем не очень) В код который я понимаю как это вставить?Например в этот.Или в другой (простой) на Ваш выбор.
Спасибо за поддержку!)
 

Вложения

mobidik

-----
Александр! Мне бы лучше на примере)
Да не вопрос, забирай:

Малость поторопился, т.к, прописал в ф-ции start(), нет смысла проверок более одной, так, что, разместишь это участок кода в init().
 

Вложения

блондинка

Элитный участник
Да не вопрос, забирай:

Малость поторопился, т.к, прописал в ф-ции start(), нет смысла проверок более одной, так, что, разместишь это участок кода в init().
Класс!!!!
огромное спасибо!)
Есть что либо невозможное для Вас?)))
Вот ещё вопрос появился)))
У меня постоянно с ними-а знаний не хватает увы(
Написала мульти валютную стрелку и где то слышала, что бывают в них ставят проверку на наличие в терминале котировок нужных пар (а то стрелка вдруг может неправильно показывать)
Как выглядят (строчки кода) проверки на наличие котировок всех пар (если хоть одной нет то блокировать стрелку)?
Извините что надоедаю)
 

mobidik

-----
Написала мульти валютную стрелку и где то слышала, что бывают в них ставят проверку на наличие в терминале котировок нужных пар (а то стрелка вдруг может неправильно показывать)
Раз ты сама написала, то сможешь сделать следующие: коль мультивалютная стрела, то есть перебор по символам, тогда, кроме запроса данных от индикатора по символу, для формирования твоей стрелы, тебе нужно узнать текущие время бара. За образец берешь время нулевого бара по символу на котором установлен индикатор/советник со стрелой. Далее сравниваешь "образцовое" время с полученными значениями времени от каждого символа. Если не совпало - отмена, ждешь следующего тика... Как-то так, пробуй.
 

блондинка

Элитный участник
Раз ты сама написала, то сможешь сделать следующие: коль мультивалютная стрела, то есть перебор по символам, тогда, кроме запроса данных от индикатора по символу, для формирования твоей стрелы, тебе нужно узнать текущие время бара. За образец берешь время нулевого бара по символу на котором установлен индикатор/советник со стрелой. Далее сравниваешь "образцовое" время с полученными значениями времени от каждого символа. Если не совпало - отмена, ждешь следующего тика... Как-то так, пробуй.
дилетанский вопрос-а что значит вообще отсутствие котировки-ее вообще нет(нет значения или величины цены которую надо брать в расчёт)
или она есть (но неправильная), застряла на каком то раннем моменте?
 

Fillelin

Элитный участник
дилетанский вопрос-а что значит вообще отсутствие котировки-ее вообще нет(нет значения или величины цены которую надо брать в расчёт)
или она есть (но неправильная), застряла на каком то раннем моменте?
Извиняюсь, что вмешиваюсь, но возможно вы имели в виду это:

Код:
   for(int i=0; i<ArraySize(TradePair); i++)
   {
      if(SymbolInfoDouble(TradePair[i],SYMBOL_ASK)> 0)
      {
 

блондинка

Элитный участник
Извиняюсь, что вмешиваюсь, но возможно вы имели в виду это:

Код:
   for(int i=0; i<ArraySize(TradePair); i++)
   {
      if(SymbolInfoDouble(TradePair[i],SYMBOL_ASK)> 0)
      {
этот индикатор похоже с такой проверкой)
пока мне не попадалась функция размер множества(
 

Вложения

  • USDX.mq4
    USDX.mq4
    2,5 КБ · Просмотры: 17

mobidik

-----
дилетанский вопрос-а что значит вообще отсутствие котировки-ее вообще нет(нет значения или величины цены которую надо брать в расчёт)
или она есть (но неправильная), застряла на каком то раннем моменте?
Котировка = изменение цены, котировок нет - цена стоит.
По отношению к твоей мультивалютной стрелке: скажем, твоя стрела формируется на основании 5 символов, так вот, в начале нового бара по времени, на 3-х символах уже есть новый бар, а по двум еще не поступили котировки. Если не контролировать время бара по символам, то твой индикатор по трем символам возьмет в расчет новые бары, а по двум символам - предыдущие. Даже, если твой индикатор работает по закрытому бару, в такой ситуации, после обновления индикатора, сигналы либо пропадут, либо появятся новые, что не феншуйно. Нужна синхронизация: есть новый бар по всем символам - делаем расчет. Но, тут есть одна заковырка, в какой-то день, будь-то национальный праздник или еще что-то, по какому-то символу могут не поступать котировки или, например, золото - у него есть перерыв на 1 час.
 

блондинка

Элитный участник
Котировка = изменение цены, котировок нет - цена стоит.
По отношению к твоей мультивалютной стрелке: скажем, твоя стрела формируется на основании 5 символов, так вот, в начале нового бара по времени, на 3-х символах уже есть новый бар, а по двум еще не поступили котировки. Если не контролировать время бара по символам, то твой индикатор по трем символам возьмет в расчет новые бары, а по двум символам - предыдущие. Даже, если твой индикатор работает по закрытому бару, в такой ситуации, после обновления индикатора, сигналы либо пропадут, либо появятся новые, что не феншуйно. Нужна синхронизация: есть новый бар по всем символам - делаем расчет. Но, тут есть одна заковырка, в какой-то день, будь-то национальный праздник или еще что-то, по какому-то символу могут не поступать котировки или, например, золото - у него есть перерыв на 1 час.
большое спасибо за разъяснения)
а можно по простому проверять так например?
if(
iRSI("xxxxxx",0, 2,PRICE_CLOSE,i) !=
iRSI(("xxxxxx",0, 2,PRICE_CLOSE,i+1)
)
для каждой пары,там всё равно доджей не будет(не планируются)?
или то же самое с
iClose(
тут вот вроде и будет фиксация изменения цены
 
Последнее редактирование:

MakarFX

Элитный участник
большое спасибо за разъяснения)
а можно по простому проверять так например?
if(
iRSI("xxxxxx",0, 2,PRICE_CLOSE,i) !=
iRSI(("xxxxxx",0, 2,PRICE_CLOSE,i+1)
)
для каждой пары,там всё равно доджей не будет(не планируются)?
или то же самое с
iClose(
тут вот вроде и будет фиксация изменения цены
Вы можете проверять так


C:
   for(i=limit;i>=0;i--)
     {
      if(iTime("GBPUSD",_Period,i)==0) {Comment("No bar GBPUSD"); continue;}
      if(iTime("EURUSD",_Period,i)==0) {Comment("No bar EURUSD"); continue;}
      if(iTime("GBPJPY",_Period,i)==0) {Comment("No bar GBPJPY"); continue;}
      _GBPUSD=iRSI("GBPUSD",0, 2,PRICE_CLOSE,i);
      _EURUSD=iRSI("EURUSD",0, 2,PRICE_CLOSE,i);
      _GBPJPY=iRSI("GBPJPY",0, 2,PRICE_CLOSE,i);
      Comment("Ok");
     }
 

mobidik

-----
а можно по простому проверять так например?
Проверять можно как угодно, вопрос в другом: какой нужен результат? Что бы все было чЁтко - нужна синхронизация баров по проверяемым символам. Вот смотри, имеем закрытый бар по первому символу, его индекс = 1, по второму символу, третьему и всех остальных - везде есть первый бар, но не факт, что время этих всех первых баров одинаковое. Ты получила сигнал, имеешь стрелу, вошла в позицию, а спустя некоторое время, не более рабочего ТФ, по какому-то символу произошло обновление, вернее, появился новый бар. твой стрелочник пересчитал данные и убрал стрелу - не думаю, что ты будешь рада такому событию.

Вы можете проверять так
if(iTime("GBPUSD",_Period,i)==0) - время у бара есть всегда, а вот нужный бар по индексу и времени может и не быть.
 

MakarFX

Элитный участник
а вот нужный бар по индексу и времени может и не быть.
Возможно так
C-подобный:
   for(i=limit;i>=0;i--)
     {
      if(iTime("GBPUSD",_Period,i)!=Time[i]) {Comment("No bar GBPUSD"); continue;}
      if(iTime("EURUSD",_Period,i)!=Time[i]) {Comment("No bar EURUSD"); continue;}
      if(iTime("GBPJPY",_Period,i)!=Time[i]) {Comment("No bar GBPJPY"); continue;}
      _GBPUSD=iRSI("GBPUSD",0, 2,PRICE_CLOSE,i);
      _EURUSD=iRSI("EURUSD",0, 2,PRICE_CLOSE,i);
      _GBPJPY=iRSI("GBPJPY",0, 2,PRICE_CLOSE,i);
      Comment("Ok");
     }
 

блондинка

Элитный участник
Большое спасибо всем!)))
Буду пробовать!
Вопрос возник потому что количество стрелок (а значит и результат их работы) меняется при обновлении графика (несколько раз надо что бы устаканилось),
даже авторефрешер уже подумала ставить,
наверное это из-за несовершенства сделанного мной кода,
а может котировки "гуляют,плавают" как нибудь взаимно между собой (нестабильность), тем более это на M1.
Такое (может и ложное) создалось впечатление.
Посмотрим)))
 
Последнее редактирование:

star603

Новичок форума
C++:
/+------------------------------------------------------------------+
//|                                                    Lavina 30.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern datetime firstday = D'01.01.2004';
extern datetime secondday = D'01.01.2004';
extern int chas = 5;
extern int minuta = 5;
extern int secunda = 5;
extern int nbar = 5;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class Date
  {
private:
   int               hour;
   int               min;
   int               sec;
   int               year;
   int               month;
   int               day;
   datetime          timecurent;
public:
   void              Date();
   void              DatePeriod(datetime begin, datetime end, bool trade);
   void              ThisUhr(int hour);
   void              Nbar(int thisbar);
   void              NewBar(bool newbar);
  };

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Date::Date()
  {
   MqlDateTime mdt;
   datetime t=TimeCurrent(mdt);
   year=mdt.year;
   month=mdt.mon;
   day=mdt.day;
   hour=mdt.hour;
   min=mdt.min;
   sec=mdt.sec;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Date::DatePeriod(datetime begin, datetime end, bool trade)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Date::ThisUhr(int our)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Date::Nbar(int thisbar)
  {

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Date::NewBar(bool newbar)
  {

  }
    
Date mql;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Начало правильное?
 

star603

Новичок форума
MqlDateTime timeStruct1;//Структура даты содержит в себе восемь полей типа int.
MqlDateTime timeStruct2;//Структура даты содержит в себе восемь полей типа int.

C++:
//+------------------------------------------------------------------+
//|                                                       Sova 1.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
MqlDateTime timeStruct1;//Структура даты содержит в себе восемь полей типа int.
MqlDateTime timeStruct2;//Структура даты содержит в себе восемь полей типа int.
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(NewBar2()==true)
      Print("1");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool NewBar()
  {
   bool new_bar = false;
   if(Open[0]==Close[0]==High[0]==Low[0])
      new_bar=true;
   else
      new_bar= false;
   return(new_bar);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool NewBar2()
  {
   bool new_bar = false;
   TimeToStruct(Time[0],timeStruct1);
   TimeToStruct(TimeCurrent(),timeStruct2);
   if(timeStruct1.day==timeStruct2.day && timeStruct1.mon== timeStruct2.mon)
      if(timeStruct1.hour== timeStruct2.hour && timeStruct1.min == timeStruct2.min && timeStruct1.sec == timeStruct2.sec)
         new_bar=true;
      else
         new_bar= false;
   return(new_bar);
  }

при втором варианте получается 9 и 11 марта 2015 по 2 раза почему-то :

C++:
2024.05.04 19:40:07.619    2015.03.19 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:06.599    2015.03.18 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:05.907    2015.03.17 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:04.930    2015.03.16 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:04.233    2015.03.13 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:03.524    2015.03.12 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.780    2015.03.11 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.772    2015.03.11 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:02.209    2015.03.10 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:01.775    2015.03.09 00:00:00  Sova 1 EURUSD,Daily: 1
2024.05.04 19:40:01.775    2015.03.09 00:00:00  Sova 1 EURUSD,Daily: 1

Почему так?
 

Отслеживают (500) Посмотреть

Верх