Помощь в кодировании - страница 195

 
shtopr:
спасибо за ответ.

проверил h1, m30, m15, m5, m1

по-прежнему работает только один цвет, красный.

Это то, что я вам говорил: для 3-го цвета (когда оба значения попадают в один диапазон значений) вам нужно изменить код, чтобы добавить опцию для 3-го цвета

 
mladen:
Вот версия, которая использует один столбец. Если вы хотите третий цвет, вам нужно добавить новую опцию

на 2мин ренко живом графике, это просто 2 зеленых столбика сверху и все для всех пар, на которых я устал, это нормально?

 
drunkpips:
на 2мин ренко живом графике, просто 2 зеленых столбика сверху и все для всех пар, на которых я его использовал, это нормально?

Я не использую ренко графики

Он использует встроенные индикаторы (iBEarsPower() и iBullsPower()), так что если есть какие-то проблемы с ним, то проблема уже во встроенных индикаторах.

 
mladen:
Это то, что я вам говорил: для 3-го цвета (когда оба значения попадают в один диапазон значений) вам нужно изменить код, чтобы добавить опцию для 3-го цвета

Ок. Спасибо!!!

 

Младен,

Я изучил и поиграл с "простым mtf" из поста #1874.

Обратите внимание: это MA из MA, и она способна к MTF.

У меня есть несколько вопросов:

Независимо от того, что я делаю с кодом, я не могу понять, что делает 'returnBars', если вообще что-то делает.

1. Что определяет, требуется ли количество измененных баров в целевом таймфрейме и почему?

2. Что касается этой строки:

returnBars = TimeFrame == "returnBars"; // проверяем, запрашивается ли количество измененных баров.

Я не являюсь высокообразованным программистом. Я не знаю этой сложной конструкции. Я также не знаю правил смешивания типов переменных.

Похоже, что строковая переменная Timeframe получает значение булевой переменной returnBars.

Затем она присваивает значение returnBars - снова. ??

Поскольку returnBars является булевой переменной, присвоить '1', если TimeFrame больше 0, иначе присвоить '0'?

3. Я устанавливаю индикатор на более высокий ТФ, и тестирую в реальном времени (вперед) на много баров, или в тестере стратегий. Я могу удалить линию, которая его использует, и не получить НИКАКИХ изменений на линиях индикатора:

if (returnBars) Comment("returnBars ",returnBars, " Tick ",Volume(0));

// if (returnBars) { ma1[0] = limit+1; return(0); }

В строке комментария на экране будет показано "returnBars 1".

Я не знаю, где он получает значение '1'.

Без части 'if' он всегда показывает '0'.

Те же результаты, если поместить его в Init().

Big Be

 
Big Be:
mladen,

Я изучил и поиграл с "простым mtf" из сообщения #1874.

Примечание: Это MA из MA, и MTF способен.

У меня есть несколько вопросов:

Независимо от того, что я делаю с кодом, я не могу понять, что делает 'returnBars', если вообще что-то делает.

1. Что определяет, требуется ли количество измененных баров в целевом таймфрейме и почему?

2. Что касается этой строки:

returnBars = TimeFrame == "returnBars"; // проверяем, запрашивается ли количество измененных баров.

Я не являюсь высокообразованным программистом. Я не знаю этой сложной конструкции. Я также не знаю правил смешивания типов переменных.

Похоже, что строковая переменная Timeframe получает значение булевой переменной returnBars.

Затем она присваивает значение returnBars - снова. ??

Поскольку returnBars является булевой переменной, присвоить '1', если TimeFrame больше 0, иначе присвоить '0'?

3. Я устанавливаю индикатор на более высокий ТФ, и тестирую в реальном времени (вперед) на много баров, или в тестере стратегий. Я могу удалить линию, которая его использует, и не получить НИКАКИХ изменений на линиях индикатора:

if (returnBars) Comment("returnBars ",returnBars, " Tick ",Volume(0));

// if (returnBars) { ma1[0] = limit+1; return(0); }

В строке комментария на экране будет показано "returnBars 1".

Я не знаю, где он получает значение '1'.

Без части 'if' он всегда показывает '0'.

Те же результаты, если поместить его в Init().

Большой Бе

Big Be

Представьте себе следующее:

1. Вы работаете на 15-минутном графике, а ваш индикатор показывает данные за 1 час. Сколько баров изменилось за последний тик на 15-минутном графике и сколько на часовом? Функция Return bars проверяет это. Это число не должно быть каким-то предполагаемым значением (выберите таймфрейм, который вы давно не посещали на своих графиках, и посмотрите, что произойдет, когда metatrader начнет загружать данные для этого таймфрейма - вы должны проверить, сколько новых баров было загружено, иначе вам придется прыгать туда-сюда по таймфреймам, чтобы иметь точное состояние для прошлых баров многотаймфреймового индикатора).

2. Of returnBars = TimeFrame == "returnBars";

У вас есть одно присваивание ("=") и одно логическое сравнение ("=="). Это означает, что returnBars должен получить результат логического сравнения двух строк (TimeFrame и "returnBars").

3. ReturnBars - это переменная типа boolean. Она может иметь два значения: 0, что равно "false", и 1, что равно "true". Вот почему вы получаете 1 для returnBars (это означает, что returnBars установлен в "true").

______________

PS: если бы это было по правилам C/C++ для boolean, то любое значение, отличное от 0, считалось бы истинным, и вы можете проверить переменные metatrader таким же образом (например, if(someDoubleValue) проверяет, отличается ли someDoubleValue от 0), но metatrader присваивает переменным типа boolean значения 0 и 1.

 

Уважаемый Младен

Я не могу понять, как перерисовывается индикатор Poalln. Я знаю, что iRSI(NULL,0,RSI,PRICE_TYPICAL,i-8) или iCCI(NULL,0,CCI,PRICE_TYPICAL,i-8) означает будущие значения, однако при расчете последнего бара нет данных для i-8.

Я думаю, что это будет ноль. Так как же Поллан перерисовывает?

Лучше всего,

 
-IXI-:
Уважаемый Младен

Не могу понять, как перерисовывается индикатор Poalln. Я знаю, что iRSI(NULL,0,RSI,PRICE_TYPICAL,i-8) или iCCI(NULL,0,CCI,PRICE_TYPICAL,i-8) означает будущие значения, однако при расчете последнего бара нет данных для i-8.

Я думаю, что это будет ноль. Так как же Поллан перерисовывает?

Лучшее,

IXI

На текущем баре он получает значения 0 для этих баров. На первом прошлом баре он получает 1 будущее значение и 7 нулей. И так далее.

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

 

Как заставить этот индикатор работать на парах с японской йеной

Здравствуйте,

Этот индикатор делает линию с каждым круглым числом и одну линию на 15 пунктов с каждой стороны от круглого числа.

Но он не работает с парами JPY.

Что нужно изменить, чтобы он работал?

#property indicator_chart_window

extern color UpperLineColor = Red;

extern color MainLineColor = Red;

extern color LowerLineColor = Red;

extern double HighOffset = 150;

extern double LowOffset = 150;

extern int LineStyle = 2;

extern string LineStyleInfo = "0=Solid,1=Dash,2=Dot,3=DashDot,4=DashDotDot";

double LineSpaceOld;

double Hoch;

double Tief;

bool FirstRun = true;

double LineSpace = 1.0; // 1 unit = 0.01 of basic value (e.g. 1 USD cent)

string LineText = "RoundNr ";

string LineText1 = "RoundNr1 ";

string LineText2 = "RoundNr2 ";

int deinit()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

ObjectDelete(LineText+DoubleToStr(i,2));

ObjectDelete(LineText1+DoubleToStr(i,2));

ObjectDelete(LineText2+DoubleToStr(i,2));

}

return(0);

}

int start()

{

if(FirstRun)

{

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

FirstRun = false;

}

else if(LineSpace != LineSpaceOld)

{

deinit();

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

}

DrawLines();

LineSpaceOld = LineSpace;

return(0);

}

void DrawLines()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

string StringNr = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText+StringNr) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText+StringNr, OBJ_HLINE, 0, 0, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

else // Adjustments

{

ObjectSet(LineText+StringNr, OBJPROP_PRICE1, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr1 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText1+StringNr1) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText1+StringNr1, OBJ_HLINE, 0, 0, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

else // Adjustments

{

ObjectSet(LineText1+StringNr1, OBJPROP_PRICE1, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr2 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText2+StringNr2) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText2+StringNr2, OBJ_HLINE, 0, 0, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

else // Adjustments

{

ObjectSet(LineText2+StringNr2, OBJPROP_PRICE1, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

}

WindowRedraw();

}
 
Georgebaker:
Привет,

Эта программа строит линию с каждым круглым числом и одну линию на 15 пунктов в каждую сторону от круглого числа.

Но он не работает с парами JPY.

Что нужно изменить, чтобы это работало?

#property indicator_chart_window

extern color UpperLineColor = Red;

extern color MainLineColor = Red;

extern color LowerLineColor = Red;

extern double HighOffset = 150;

extern double LowOffset = 150;

extern int LineStyle = 2;

extern string LineStyleInfo = "0=Solid,1=Dash,2=Dot,3=DashDot,4=DashDotDot";

double LineSpaceOld;

double Hoch;

double Tief;

bool FirstRun = true;

double LineSpace = 1.0; // 1 unit = 0.01 of basic value (e.g. 1 USD cent)

string LineText = "RoundNr ";

string LineText1 = "RoundNr1 ";

string LineText2 = "RoundNr2 ";

int deinit()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

ObjectDelete(LineText+DoubleToStr(i,2));

ObjectDelete(LineText1+DoubleToStr(i,2));

ObjectDelete(LineText2+DoubleToStr(i,2));

}

return(0);

}

int start()

{

if(FirstRun)

{

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

FirstRun = false;

}

else if(LineSpace != LineSpaceOld)

{

deinit();

Hoch = NormalizeDouble( High, 2 );

Tief = NormalizeDouble( Low, 2 );

}

DrawLines();

LineSpaceOld = LineSpace;

return(0);

}

void DrawLines()

{

double AbSpace = 0.01*LineSpace;

double Oben = MathRound(110*Hoch)/100;

double Unten = MathRound(80*Tief)/100;

for(double i=0; i<=Oben; i+=AbSpace)

{

if(i<Unten) { continue; }

string StringNr = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText+StringNr) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText+StringNr, OBJ_HLINE, 0, 0, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

else // Adjustments

{

ObjectSet(LineText+StringNr, OBJPROP_PRICE1, i);

ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText+StringNr, OBJPROP_COLOR, MainLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr1 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText1+StringNr1) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText1+StringNr1, OBJ_HLINE, 0, 0, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

else // Adjustments

{

ObjectSet(LineText1+StringNr1, OBJPROP_PRICE1, i+(HighOffset/100000));

ObjectSet(LineText1+StringNr1, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText1+StringNr1, OBJPROP_COLOR, UpperLineColor);

}

//#######################################################################

if(i<Unten) { continue; }

string StringNr2 = DoubleToStr(i,2); // 2 digits number in object name

if (ObjectFind(LineText2+StringNr2) != 0) // HLine not in main chartwindow

{

ObjectCreate(LineText2+StringNr2, OBJ_HLINE, 0, 0, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

else // Adjustments

{

ObjectSet(LineText2+StringNr2, OBJPROP_PRICE1, i-(LowOffset/100000));

ObjectSet(LineText2+StringNr2, OBJPROP_STYLE, LineStyle);

ObjectSet(LineText2+StringNr2, OBJPROP_COLOR, LowerLineColor);

}

}

WindowRedraw();

}

Джорджбейкер,

Почему бы вам не использовать некоторые из индикаторов вроде этого: https: //www.mql5.com/en/forum/180648/page307 в качестве основы для вашего индикатора? Это может сэкономить вам время на кодирование.

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