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

Skyrider

Активный участник
Не могу найти информации о том, как в советнике создать буфер. Нужно создать например 2-3 буфера для хранения значений 1 и -1.
Подскажите как это сделать.
В индикаторе все просто, а как делать в советнике забыл.
 

angel999

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

Ugar

Гуру форума
Не могу найти информации о том, как в советнике создать буфер. Нужно создать например 2-3 буфера для хранения значений 1 и -1.
Подскажите как это сделать.
В индикаторе все просто, а как делать в советнике забыл.
Буфер в индикаторе, это просто динамический массив. При появлении новых баров размер увеличивается и сдвигаются данные.
В советнике создать массив, при появлении новых баров менять размер и двигать данные
 

star603

Новичок форума
Код:
Expand Collapse Copy
double svecha[10][31];//Информация о свечах
//-----------------------------------------------------
void uo(double &gh[11][31])//Массив свечей
  {
   for(int i = 0; i < ArrayRange(gh, 1); i++)
     {
      gh[0][i] = Open[i];//Открытие свечи
      gh[1][i] = Close[i];//Закрытие свечи
      gh[2][i] = High[i];//Макс свечи
      gh[3][i] = Low[i];//Мин свечи
      gh[4][i] = Open[i]-Close[i];//Тело свечи
      gh[5][i] = High[i]-Low[i];//Высота свечи
      gh[6][i] = High[i]-Open[i];//верхняя тень черной свечи
      gh[7][i] = High[i]-Close[i];//Верхняя тень белой свечи
      gh[8][i] = Open[i]-Low[i];//Нижняя тень белой свечи
      gh[9][i] = Close[i]-Low[i];//Нижняя тень черной свечи
     }
  };
//-----------------------------------------------------
int Sl1()
{
 uo(svecha);
 svecha[3][31];/*Мне нужно из этого массива. Без этой строчки работает но не понятно откуда берет
 значения. С этой строчкой вообще пишет :
 expression has no effect    Umr.mq4    329    2
 Вот думаю как быть.*/
 int Nsvec = ArrayMinimum(svecha,WHOLE_ARRAY,0);
 Print(Nsvec);
  return(Nsvec);
};

Скажите пожалуйста что не так? И можно ли с удачных кодов создавать контент в соц сетях?
 

Ugar

Гуру форума
Код:
Expand Collapse Copy
double svecha[10][31];//Информация о свечах
//-----------------------------------------------------
void uo(double &gh[11][31])//Массив свечей
  {
   for(int i = 0; i < ArrayRange(gh, 1); i++)
     {
      gh[0][i] = Open[i];//Открытие свечи
      gh[1][i] = Close[i];//Закрытие свечи
      gh[2][i] = High[i];//Макс свечи
      gh[3][i] = Low[i];//Мин свечи
      gh[4][i] = Open[i]-Close[i];//Тело свечи
      gh[5][i] = High[i]-Low[i];//Высота свечи
      gh[6][i] = High[i]-Open[i];//верхняя тень черной свечи
      gh[7][i] = High[i]-Close[i];//Верхняя тень белой свечи
      gh[8][i] = Open[i]-Low[i];//Нижняя тень белой свечи
      gh[9][i] = Close[i]-Low[i];//Нижняя тень черной свечи
     }
  };
//-----------------------------------------------------
int Sl1()
{
 uo(svecha);
 svecha[3][31];/*Мне нужно из этого массива. Без этой строчки работает но не понятно откуда берет
 значения. С этой строчкой вообще пишет :
 expression has no effect    Umr.mq4    329    2
 Вот думаю как быть.*/
 int Nsvec = ArrayMinimum(svecha,WHOLE_ARRAY,0);
 Print(Nsvec);
  return(Nsvec);
};

Скажите пожалуйста что не так? И можно ли с удачных кодов создавать контент в соц сетях?
double svecha[10][31];//Информация о свечах
Этот массив объявлен на глобальном уровне. А значит он работает и во всех функциях.

svecha[3][31];/*Мне нужно
Этот массив объявлен внутри функции. Должен работать внутри этой функции. Но массив объявленный на глобальном уровне то же работает внутри всех функций и имеет то же имя. В итоге конфликт.
 

star603

Новичок форума
double svecha[10][31];//Информация о свечах
Этот массив объявлен на глобальном уровне. А значит он работает и во всех функциях.

svecha[3][31];/*Мне нужно
Этот массив объявлен внутри функции. Должен работать внутри этой функции. Но массив объявленный на глобальном уровне то же работает внутри всех функций и имеет то же имя. В итоге конфликт.
Код:
Expand Collapse Copy
void Sl1()
{
 uo(svecha);
 for(int i = 0; i<31; i++)
  {
    double dert [32];
    dert[i] = svecha[3][i];
  }
  double dert1 = dert[20];
  Print(dert1);
};

Как то так получается.
Выдает эту ошибку 'dert' - undeclared identifier    Umr.mq4    334    18
Сейчас то что не так? Скажите пожалуйта.
 

AlexeyVik

Программист mql4 mql5
Код:
Expand Collapse Copy
void Sl1()
{
 uo(svecha);
 for(int i = 0; i<31; i++)
  {
    double dert [32];
    dert[i] = svecha[3][i];
  }

  double dert1 = dert[20];
  Print(dert1);
};

Как то так получается.
Выдает эту ошибку 'dert' - undeclared identifier    Umr.mq4    334    18
Сейчас то что не так? Скажите пожалуйта.
Доступность локально объявленной переменной ограничивается кривыми скобками. Соответственно переменная dert дальше закрывающей скобки уже недоступна.
Так будет правильно.
Код:
Expand Collapse Copy
void Sl1()
{
 uo(svecha);
     double dert [32];
 for(int i = 0; i<31; i++)
  {
    dert[i] = svecha[3][i];
  }
  double dert1 = dert[20];
  Print(dert1);
};
 

asdqwe

Местный житель
Потому, что у alertsMessage свой файл звука. По коду: сперва отрабатывает AlertsSound и не дожидаясь его завершения, тут же, начинает выполнятся alertsMessage, у которого свой, фиксированный файл alert.wav - вот он в итоге и воспроизводится.
Спасибо. А как сделать чтобы они просто друг за другом сработали? Я воткнул между ними Sleep(), но он все равно сигналит только стандартным алертом, независимо от числа миллисекунд в слипе.
 

mobidik

-----
Спасибо. А как сделать чтобы они просто друг за другом сработали? Я воткнул между ними Sleep(), но он все равно сигналит только стандартным алертом, независимо от числа миллисекунд в слипе.
Sleep() в индикаторах не работает.
Подобным не заморачивался ранее, по пробуйте алерты переставить местами по коду, т.е., сперва Message, а потом Sound. Если не поможет, тогда нужно сделать, что на первом тике будет отрабатываться Message и только, а уже на втором тике - Sound, тем самым получится подобие задержки, псевдослип.
 

asdqwe

Местный житель
Sleep() в индикаторах не работает.
Подобным не заморачивался ранее, по пробуйте алерты переставить местами по коду, т.е., сперва Message, а потом Sound. Если не поможет, тогда нужно сделать, что на первом тике будет отрабатываться Message и только, а уже на втором тике - Sound, тем самым получится подобие задержки, псевдослип.
спасибо. перестановка не работает. буду пробывать с тиками
 

star603

Новичок форума
Доступность локально объявленной переменной ограничивается кривыми скобками. Соответственно переменная dert дальше закрывающей скобки уже недоступна.
Так будет правильно.
Код:
Expand Collapse Copy
void Sl1()
{
 uo(svecha);
     double dert [32];
 for(int i = 0; i<31; i++)
  {
    dert[i] = svecha[3][i];
  }
  double dert1 = dert[20];
  Print(dert1);
};
Окончательный вариант получился такой:
Код:
Expand Collapse Copy
void Sl2()
  {
   uo(svecha);
   double dert1 [32];
   for(int i = 0; i<31; i++)
     {
      dert1[i] = svecha[2][i];
     }
   int R = ArrayMinimum(dert1,31,0);
   Print("Index=",R,"----Znach=",dert1[R]);
  };
не знаю как сделать так что отразился пробел вместо ----
Теперь я думаю это давить в вариант трелинг стопа. Это будет посложнее обыграть с учетом что у меня дофига енум списков.
 

Ugar

Гуру форума
Окончательный вариант получился такой:
Код:
Expand Collapse Copy
void Sl2()
  {
   uo(svecha);
   double dert1 [32];
   for(int i = 0; i<31; i++)
     {
      dert1[i] = svecha[2][i];
     }
   int R = ArrayMinimum(dert1,31,0);
   Print("Index=",R,"----Znach=",dert1[R]);
  };
не знаю как сделать так что отразился пробел вместо ----
Поставить пробелы
Print("Index=",R," Znach=",dert1[R]);
 

vitto.mq4

Местный знаток
Господа специалисты, вставьте пожалуйста в этот код , привязку к номеру счета .

//+------------------------------------------------------------------+
int OnInit()
{
//---
D=1;
if (Digits==5 || Digits==3)
{D=10;}
//---
HLineCreate("LineBuy",Ask+Dist*D*Point,BuyLine);
HLineCreate("LineSell",Bid-Dist*D*Point,SellLine);
//---
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0,OBJ_HLINE);
}
//+------------------------------------------------------------------+
void OnTick(){
//+------------------------------------------------------------------+
Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
//+------------------------------------------------------------------+
 

Ugar

Гуру форума
Господа специалисты, вставьте пожалуйста в этот код , привязку к номеру счета .

//+------------------------------------------------------------------+
int OnInit()
{
//---
D=1;
if (Digits==5 || Digits==3)
{D=10;}
//---
HLineCreate("LineBuy",Ask+Dist*D*Point,BuyLine);
HLineCreate("LineSell",Bid-Dist*D*Point,SellLine);
//---
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0,OBJ_HLINE);
}
//+------------------------------------------------------------------+
void OnTick(){
//+------------------------------------------------------------------+
Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
//+------------------------------------------------------------------+
Это маленький огрызок кода. Даже компилироваться не будет.
 

MERFY

Местный знаток
Привет!

Пишу индикаторную функцю в советнике, не могу получить значение, возвращает 0 либо 1.
Где я ошибся?

Спасибо за ответ. Код приложил

Код:
Expand Collapse Copy
int nBar = 1;// Смещение, 0 - текущий, 1- предыдущий
int period = 100;
int nBars = 1000;

int init()
{
    SetIndexBuffer(0,ibuffer);
    SetIndexStyle(0,DRAW_NONE);
}

int start()
{
   double p_test = get_volatility_ratio(Symbol(), PERIOD_D1, period, nBar);
   Print(p_test);
 
     return (0);
}  



double get_volatility_ratio (string symbol, int _tf, int period, int shift)  
  {
     
   int bars = iBars(symbol,_tf);
   if (bars < period) return (0);
 
   int i, limit;
   double buff = 0.0;

//---- последний посчитанный бар будет пересчитан
   static int nCountedBars;  
   nCountedBars=bars-1;
   if(nCountedBars<0) return (0);
   if(nCountedBars>0) nCountedBars--;
 
      if (nBars>0)
            limit = MathMin(nBars,MathMin(bars-nCountedBars,bars-1));
      else  limit = MathMin(bars-nCountedBars,bars-1);
     
//----+ Обьявляем массивы

   double High_[],Low_[],Close_[], Open_[];
 
   ArraySetAsSeries(High_,true);
   ArraySetAsSeries(Low_,true);
   ArraySetAsSeries(Close_,true);
   ArraySetAsSeries(Open_,true);
 
   CopyHigh(symbol,_tf,0,bars,High_);
   CopyLow(symbol,_tf,0,bars,Low_);
   CopyClose(symbol,_tf,0,bars,Close_);
   CopyOpen(symbol,_tf,0,bars,Open_);
 
 
  //----+ ЦИКЛ ВЫЧИСЛЕНИЯ ИНДИКАТОРА
 
   for(i=limit; i>=0 && !IsStopped(); i--)
     {
      int bl=Lowest(_tf, period, i);
      int bh=Highest(_tf, period, i);
      if(bl==WRONG_VALUE || bh==WRONG_VALUE)
         continue;
      double min=Low_[bl];
      double max=High_[bh];
      double pr=fmax(max,Open_[i+period-1])-fmin(min,Open_[i+period-1]);
      double hl=fabs(High_[i]-Low_[i]);
      double hc=fabs(High_[i]-Close_[i+1]);
      double lc=fabs(Low_[i]-Close_[i+1]);
      double tr=fmax(hl,fmin(hc,lc));
      ibuffer[i]=tr/(pr!=0 ? pr : 1.0);
     
      buff = ibuffer[i+shift];
     }
//----+
   return(buff);
  }

//+------------------------------------------------------------------+
//| Возвращает индекс максимального значения таймсерии High          |
//+------------------------------------------------------------------+
int Highest(int _tf, const int count,const int start)
  {
   double array[];
   ArraySetAsSeries(array,true);
   if(CopyHigh(Symbol(),_tf,start,count,array)==count)
      return ArrayMaximum(array)+start;
   return WRONG_VALUE;
  }
//+------------------------------------------------------------------+
//| Возвращает индекс максимального значения таймсерии Low           |
//+------------------------------------------------------------------+
int Lowest(int _tf, const int count,const int start)
  {
   double array[];
   ArraySetAsSeries(array,true);
   if(CopyLow(Symbol(),_tf,start,count,array)==count)
      return ArrayMinimum(array)+start;
   return WRONG_VALUE;
  }
//+------------------------------------------------------------------+
 
Последнее редактирование:
Верх