Через переменные не получается сделать то, что мне нужно. Нужен буферда как обычно, через переменные это делается. Просто записываешь туда нужное значение, а потом в нужный момент достаешь.
Буфер в индикаторе, это просто динамический массив. При появлении новых баров размер увеличивается и сдвигаются данные.Не могу найти информации о том, как в советнике создать буфер. Нужно создать например 2-3 буфера для хранения значений 1 и -1.
Подскажите как это сделать.
В индикаторе все просто, а как делать в советнике забыл.
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];//Информация о свечахКод: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];/*Мне нужно
Этот массив объявлен внутри функции. Должен работать внутри этой функции. Но массив объявленный на глобальном уровне то же работает внутри всех функций и имеет то же имя. В итоге конфликт.
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 дальше закрывающей скобки уже недоступна.Код: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 Сейчас то что не так? Скажите пожалуйта.
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);
};
Спасибо. А как сделать чтобы они просто друг за другом сработали? Я воткнул между ними Sleep(), но он все равно сигналит только стандартным алертом, независимо от числа миллисекунд в слипе.Потому, что у alertsMessage свой файл звука. По коду: сперва отрабатывает AlertsSound и не дожидаясь его завершения, тут же, начинает выполнятся alertsMessage, у которого свой, фиксированный файл alert.wav - вот он в итоге и воспроизводится.
Sleep() в индикаторах не работает.Спасибо. А как сделать чтобы они просто друг за другом сработали? Я воткнул между ними Sleep(), но он все равно сигналит только стандартным алертом, независимо от числа миллисекунд в слипе.
спасибо. перестановка не работает. буду пробывать с тикамиSleep() в индикаторах не работает.
Подобным не заморачивался ранее, по пробуйте алерты переставить местами по коду, т.е., сперва Message, а потом Sound. Если не поможет, тогда нужно сделать, что на первом тике будет отрабатываться Message и только, а уже на втором тике - Sound, тем самым получится подобие задержки, псевдослип.
Окончательный вариант получился такой:Доступность локально объявленной переменной ограничивается кривыми скобками. Соответственно переменная dert дальше закрывающей скобки уже недоступна.
Так будет правильно.
Код: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); };
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]);
};
Поставить пробелыОкончательный вариант получился такой:
не знаю как сделать так что отразился пробел вместо ----Код: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]); };
Проверь.спасибо. перестановка не работает. буду пробывать с тиками
Это маленький огрызок кода. Даже компилироваться не будет.Господа специалисты, вставьте пожалуйста в этот код , привязку к номеру счета .
//+------------------------------------------------------------------+
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);
//+------------------------------------------------------------------+
Жаль, весь код не хотелось бы светить.....Это маленький огрызок кода. Даже компилироваться не будет.
Вставь в функцию OnInit строку:Жаль, весь код не хотелось бы светить.....
Огромное спасибо!Вставь в функцию OnInit строку:
int OnInit()
{
if(AccountNumber()!=123456789) {Print("Wrong account!"); return(INIT_FAILED);}
где 123456789 - это номер счета для привязки - вводишь нужный.
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;
}
//+------------------------------------------------------------------+