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

 

...

В индикаторе единственный способ сделать это - держать его в бесконечном цикле, пока не будет обнаружено какое-либо событие (клавиатура, мышь, ...).

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

marley60:
если есть сигнал тревоги, он издает звук "pling" один раз. есть ли возможность воспроизводить звук тревоги, пока я не остановлю его? (причина: я не услышу ни одного звука, когда буду в туалете или на кухне) Я заменил звук тревоги песней, но я бы предпочел иметь выбор между воспроизведением один раз/воспроизведением до остановки (как это было в tradestation).
 

Вопрос об индексе

Здравствуйте, Младен;

Я видел, что некоторые называют индикатор типа Ind[3][0][1] вот так, что означает первый и второй определенный индекс?

заранее спасибо

kemal

 

Проблема зигзага в советнике

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

Я использую стандартный инди зигзаг в своем советнике. Я использую следующий код для определения узлов зигзага. Я заметил, что иногда MT4 возвращает узлы зигзага с неправильного таймфрейма. Например, когда я пытаюсь получить узлы зигзага на H1, MT4 возвращает значения узлов зигзага на M15. Кто-нибудь уже сталкивался с такой проблемой? Если вы знаете больше информации о зигзаге и возможной проблемной области, пожалуйста, подскажите.

Большое спасибо.

FFJason

Примечание: TF - это таймфрейм, на который я подаю разные значения для получения узлов зигзага с разных таймфреймов. Каким-то образом MT4 перепутал значения узлов, когда используется определенный TF.

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Как открыть новый ордер после S/L предыдущего ордера?

Открыть новый ордер после S/L предыдущего ордера.
Уважаемый сэр;

Кто-нибудь знает программу для советника, чтобы после закрытия ордера на основе S/L открывался новый ордер?

С уважением,
 

...

Вероятно, у вас случай, когда пик ЗигЗага одного таймфрейма совпадает с пиком ЗигЗага другого таймфрейма (что не является необычным случаем, поскольку они ищут пики). Что касается таймфреймов, вы получаете правильные значения таймфреймов с помощью этого кода. Возможно, необходимо внести лишь одно изменение в код, чтобы обеспечить получение 4 последних значений ZigZag, и тогда код будет выглядеть следующим образом

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

[/PHP]

As you can see only the loop end is changed from "150" to "Bars-1"

novalight:
Hi,

I use standard Zigzag indy in my EA. I use the following code to determine the zigzag nodes. I noticed that sometimes the MT4 returns the zigzag nodes from the wrong time frame. For example, when I try to get H1 zigzag nodes, MT4returns M15 zigzag node values. Has anyone come across such problem before? If you know more info about zigzag and the possible problem area, please advise.

Many thanks.

FFJason

note: TF is the time frame which I feed different values for getting zigzag nodes from different time frame. Somehow MT4 mixed up the node values when a specific TF is used.

[PHP]

void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{ int t=0; int p=0; int q=0; double nd2i;

for (i=0; i<=150; i++)

{ nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

 

Проблема зигзага в советнике

Привет, Дева,

Большое спасибо за вашу помощь.

Я немного почитал о iBarShift, и ваш iBarShift(NULL,TF,0), похоже, получает общее количество баров на графике. Пожалуйста, поправьте меня, если я неправильно понял ваше намерение использовать iBarShift.

Я рассматриваю те случаи, когда ZigZag возвращал неверные значения узлов, и число поиска (я использую 150) не было проблемой. Кроме того, я понимаю, что некоторые узлы одинаковы для разных таймфреймов, но ошибки, которые я обнаружил, заключались в том, что два или более узлов и соответствующие номера баров указывали на разные таймфреймы. Это была проблема, которая меня озадачила.

Сегодня я обнаружил еще более загадочную проблему с Zigzag. Я использую Alert для отображения узлов, возвращаемых программой, и обнаружил, что иногда программа возвращает одну правильную пару узлов и номер бара, но другой узел и номер бара оба равны 0. Это действительно странно. Я усовершенствовал процедуру, убедившись, что ни один узел не имеет значения 0 с помощью следующих кодов. Я просто надеюсь, что это не MT4 пропускает удар сердца или замирает, и выбрасывает мусор в мой советник. Причина, по которой я это говорю, заключается в том, что мой другой советник, который показывает предупреждающие сообщения, когда моя программа пытается вставить SL и TP, или собрать значения OP, и довольно часто случалось, что MT4 просто пропускал эти шаги, и возвращал 0 значений. Мне нужно усовершенствовать свою программу, чтобы отслеживать такие случаи и убедиться, что эти задачи выполняются правильно.

Пожалуйста, посоветуйте. Я нахожусь в конце своей смекалки. Ваша помощь будет высоко оценена. Будьте здоровы,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

[/PHP]

mladen:
You probably have a case when the ZigZag peak of one time frame is the same as the ZigZag peak of another time frame (which is not an unusual case since they are looking for peaks). As far as time frames are concerned, you are getting correct time frame values with that code. Maybe just one change in the code has to be done in order to ensure that you get 4 last ZigZag values, and then the code would be like this

[PHP]void vGetNode2(int TF,double& lwnd2[2],double& hgnd2[2])

{

int p=0; int q=0; int max=iBarShift(NULL,TF,0); double nd2i;

for (int i=0; i<max; i++)

{

nd2i=iCustom(NULL,TF,"ZigZag",13,8,5,0,i);

if (nd2i==iLow(NULL,TF,i)) {if (p<=1) {lwnd2[p]=nd2i; p++;}}

if (nd2i==iHigh(NULL,TF,i)) {if (q<=1) {hgnd2[q]=nd2i; q++;}}

if (p==2 && q==2) break;

}

return;

}

As you can see only the loop end is changed from "150" to "Bars-1"
 

...

Что касается iBarShift(NULL,TF,0) : да, он возвращает общее количество баров целевого таймфрейма. Но цикл не будет выполняться столько раз, он будет существовать, как только будут найдены последние 4 пика ZigZag.

Теперь для примера представьте следующее: вы вызываете функцию для одного таймфрейма, и у вас есть лимит в 150 баров для поиска последних 4 пиков. Функция справляется со своей задачей, и тогда вы обращаетесь к другому таймфрейму. И, просто ради аргумента, представьте, что 4-й пик находится за пределами первых 150 баров. Что произойдет. Поскольку ваши массивы не были очищены, некоторые результаты для ранее искомого таймфрейма все еще там, поскольку на 150-м баре не все 4 пика были найдены, а некоторые ранее найденные пики остались там, поскольку они были найдены на текущем искомом таймфрейме.

Это была цель добавления этого кода: убедиться, что он действительно находит последние 4 пика. Иногда это займет 10 баров, иногда 1000 (это полностью зависит от ZigZag и не является фиксированным числом баров), но это не будет циклировать "бары" раз. Он будет циклиться только необходимое количество раз и убедится, что все 4 пика принадлежат целевому таймфрейму.

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

novalight:
Привет, Дева,

Большое спасибо за помощь.

Я немного почитал о iBarShift, и ваш iBarShift(NULL,TF,0), похоже, получает общее количество баров на графике. Пожалуйста, поправьте меня, если я неправильно понял ваше намерение использовать iBarShift.

Я рассматриваю те случаи, когда ZigZag возвращал неверные значения узлов, и число поиска (я использую 150) не было проблемой. Кроме того, я понимаю, что некоторые узлы одинаковы для разных таймфреймов, но ошибки, которые я обнаружил, заключались в том, что два или более узлов и соответствующие номера баров указывали на разные таймфреймы. Это была проблема, которая меня озадачила.

Сегодня я обнаружил еще более загадочную проблему с Zigzag. Я использую Alert для отображения узлов, возвращаемых программой, и обнаружил, что иногда программа возвращает одну правильную пару узлов и номер бара, но другой узел и номер бара оба равны 0. Это действительно странно. Я усовершенствовал процедуру, убедившись, что ни один узел не имеет значения 0 с помощью следующих кодов. Я просто надеюсь, что это не MT4 пропускает удар сердца или замирает, и выбрасывает мусор в мой советник. Причина, по которой я это говорю, заключается в том, что мой другой советник, который показывает предупреждающие сообщения, когда моя программа пытается вставить SL и TP, или собрать значения OP, и довольно часто случалось, что MT4 просто пропускал эти шаги, и возвращал 0 значений. Мне нужно усовершенствовать свою программу, чтобы отслеживать такие случаи и убедиться, что эти задачи выполняются правильно.

Пожалуйста, посоветуйте. Я нахожусь в конце своей смекалки. Ваша помощь будет высоко оценена. Будьте здоровы,

Novalight

int iGetNode4(int TF, double& lwnd4, double& hgnd4, int& lwnd4bar, int& hgnd4bar)

{ lwnd4=0; hgnd4=0; lwnd4bar=0; hgnd4bar=0; int t=0,p=0; //node 4 = arrow

for (i=0; i<=120; i++)

{ double lowi=iLow(NULL,TF,i); double highi=iHigh(NULL,TF,i);

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==lowi && lowi!=0) {if (t==0) {lwnd4=iLow(NULL,TF,i); lwnd4bar=i; t++; if(lwnd4==0) Alert(lwnd4);}}

if (iCustom(NULL,TF,"ZigZag",80,35,12,0,i)==highi && highi!=0) {if (p==0) {hgnd4=iHigh(NULL,TF,i); hgnd4bar=i; p++;if (hgnd4==0) Alert(hgnd4);}}

if (t==1 && p==1) break;

}

if (lwnd4bar<hgnd4bar) return(1); //current node 4 is a low node for Long

if (lwnd4bar>hgnd4bar) return(-1); //current node 4 is a high node for Short

return;

}

 

Проблема зигзага в советнике

Привет, Дева,

Вы абсолютно правы! Я пересмотрел свой код и обнаружил, что 150 недостаточно для большого зигзага, и если не все 4 узла будут найдены, вся логика определения того, какой узел идет первым или последним, будет сбита.

В заключение хочу сказать, что нет ничего плохого ни в Zigzag, ни в MT4, это исключительно моя собственная ошибка в установке слишком маленького числа поиска. Я благодарю вас за ваше время, терпение и, что более важно, готовность помочь .......

Берегите себя .....

Novalight

mladen:
Что касается iBarShift(NULL,TF,0): да, он возвращает общее количество баров целевого таймфрейма. Но цикл не будет выполняться столько раз, он будет существовать, как только будут найдены последние 4 пика ZigZag.

Теперь для примера представьте следующее: вы вызываете функцию для одного таймфрейма и задаете ограничение в 150 баров для поиска последних 4 пиков. Она делает свою работу, и затем вы смотрите на другой таймфрейм. И, просто ради аргумента, представьте, что 4-й пик находится за пределами первых 150 баров. Что произойдет. Поскольку ваши массивы не были очищены, некоторые результаты для ранее искомого таймфрейма все еще там, поскольку на 150-м баре не все 4 пика были найдены, а некоторые ранее найденные пики остались там, поскольку они были найдены на текущем искомом таймфрейме.

Это была цель добавления этого кода: убедиться, что он действительно находит последние 4 пика. Иногда это займет 10 баров, иногда 1000 (это полностью зависит от ZigZag и не является фиксированным числом баров), но это не будет циклировать "бары" раз. Он будет циклиться только необходимое количество раз и убедится, что все 4 пика принадлежат целевому таймфрейму.

Что касается путаницы таймфреймов, я не думаю, что это происходит. То, как открывается файл истории для целевых таймфреймов (простым добавлением минут целевого таймфрейма к имени символа), делает невозможным чтение данных с двух таймфреймов в одном цикле, если параметр таймфрейма не изменен (в этом случае открывается только один файл истории, и он не может получить доступ к данным с разных таймфреймов).
 

Помогите с кодом

Будьте добры, добавьте код к индикатору SnakeBorders, чтобы добавить два следующих графика:

1. Линейный график, который строит середину белого диапазона (как показано красной линией на рисунке).

2. Линейный график, который строит противоположный экстремум графика желтой линии (как показано голубой линией на рисунке).snakeborders.mq4

Файлы:
sb.gif  39 kb
 

пожалуйста, кто-нибудь помогите создать этот индикатор для меня

Индикатор, который я хочу

Условие

Покупать, когда цена свечи Body пересекает выше ma индикатор и rsi > rsi 50 после закрытия свечи открыть новую свечу начать один Синяя стрелка и синяя линия до продажи

Продавать, когда цена свечи Body пересекает нижнюю границу индикатора ma и rsi < rsi 50 после закрытия свечи открывается новая свеча начинается одна Красная стрелка и Красная линия до покупки

пожалуйста, добавьте вход для изменения значения тоже

Извините за мой плохой английский

Большое спасибо

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