Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта?

 

Это создает предупреждение, когда цена достигает верхней или нижней линии.

Я хочу разрешить сделкам открываться, пока цена не приблизится к этим линиям. Когда цена подходит слишком близко, не позволять сделкам открываться.

Как мне заставить эту логику работать на закрытии текущего бара, если все, что здесь есть - это массивы?

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

return(0);

}
 

Я вижу, что вы очень стараетесь, молодец! На данном этапе мне кажется, что больше всего вам нужно знать, как помочь себе самому, поэтому я бы посоветовал использовать функцию MQL "NAvigator->Search" _широко_, вы найдете ответы на многие ваши вопросы (единственное, что можно вызвать из индикатора - это буферы, и это делается через iCustom(); Объекты - это не массивы и т.д. и многое-многое другое). Например, поиск по слову "массив" покажет, что индекс массива текущего бара равен 0, индекс массива последнего бара равен 1 и так далее.

Если все записи функции поиска не дают вам покоя, вероятно, вы пытаетесь сделать что-то слишком сложное для вас на данном этапе. Я полагаю, что большинство приведенных выше примеров затрагивается в курсе для начинающих от codersguru, поэтому я бы рекомендовал прочитать его еще раз.

Вы также можете взять простой советник и попытаться немного упростить/изменить его, это научит вас тому, как он работает. Как только это будет сделано, вы можете попробовать усложнить его.

Извините, если я не в тему.

В общем, чтобы работать по цене закрытия, вы проверяете открытие нового бара, а затем записываете свои условия на индекс 1 массива. Возможный код для определения открытия нового бара:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0];

return (true);

}

return(false);

}

Надеюсь, это поможет, удачи.

 

Да, вы на правильном пути.

Я бы прекратил все и перечитал программирование на С++.

К сожалению, объектно-ориентированное программирование не очень подходит для mq4, поэтому вам придется компенсировать его основами.

Продолжайте в том же духе, у вас все получится.

 
Aaragorn:
Он выдает предупреждение, когда цена достигает верхней или нижней линии.

Я хочу позволить сделкам открываться, пока цена не приблизится к этим линиям. Когда цена подходит слишком близко, не позволять сделкам открываться.

Как мне заставить эту логику работать на закрытии текущего бара, если все, что здесь есть - это массивы?

Вы можете взять это в качестве примера. Он близок к тому, что вы хотите получить. Насколько я могу судить, это тот же индикатор, который вы используете.

 
pipeline:
Я вижу, что вы очень стараетесь, молодец! На данном этапе мне кажется, что больше всего вам нужно знать, как помочь себе самому, поэтому я бы посоветовал использовать функцию "NAvigator->Search" в MQL _широко_, вы найдете ответы на многие ваши вопросы (единственное, что можно вызвать из индикатора - это буферы, и это делается через iCustom(); объекты - это не массивы и т.д. и многое-многое другое). Например, при поиске по слову "массив" вы узнаете, что индекс массива текущего бара равен 0, индекс массива последнего бара равен 1 и так далее.

Если все записи, выдаваемые функцией поиска, не дают вам покоя, вероятно, вы пытаетесь сделать что-то слишком сложное для вас на данном этапе. Я полагаю, что большинство приведенных выше примеров затрагивается в курсе для начинающих от codersguru, поэтому я бы рекомендовал прочитать его еще раз.

Вы также можете взять простой советник и попытаться немного упростить/изменить его, это научит вас тому, как он работает. Как только это будет сделано, вы можете попробовать усложнить его.

Извините, если я не в тему.

В общем, чтобы работать по цене закрытия, вы проверяете открытие нового бара, а затем записываете свои условия на индекс 1 массива. Возможный код для определения открытия нового бара:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0];

return (true);

}

return(false);

}

Надеюсь, это поможет, удачи.

ок насчет функции поиска... она ничего не возвращает. Я пытался использовать ее несколько раз в метаредакторе. Я ввожу то, что мне нужно, нажимаю return, и ничего не происходит, или я нажимаю на маленькое окошко go рядом с поисковой строкой, и ничего не происходит. Я просто заметил, какой это отстойный поиск, потому что он вообще не работает. Я имею в виду функцию поиска в окне навигатора метаэдитора... есть ли какой-то протокол, чтобы заставить его работать, о котором я не знаю?

 
fx-programmer:
Да, вы на правильном пути.

Я бы прекратил все и перечитал программирование на С++.

К сожалению, объектно-ориентированное программирование не очень подходит для mq4, поэтому вам придется компенсировать его основами.

Продолжайте в том же духе, у вас все получится.

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

 
pipeline:

В общем случае, чтобы работать по цене закрытия, вы проверяете открытие нового бара, а затем записываете свои условия на индекс 1 массива. Возможный код для определения открытия нового бара:

bool NewBar()

{

static datetime dt = 0;

if (Time[0] != dt)

{

dt = Time[0];

return (true);

}

return(false);

}

Надеюсь, это поможет, удачи.

это почти помогает, если вы понимаете, о чем я... если это возвращает true, тогда что, как вы получите значение индикатора из массива на текущем закрытии теперь, когда было обнаружено, что есть новый бар?

 
 
Aaragorn:

Вчера вечером я гуглил и нашел вот это...

http://www.gordago.com/?act=download

у кого-нибудь есть опыт работы с этим? это реально?

Gordago не работает или все еще не может работать с пользовательскими индикаторами. Это основной недостаток.

Единственный способ научиться программированию - это вкалывать, как вы это делаете сейчас... учиться на примерах. Материалы Coders' Guru отлично подходят для обучения.

Удачи,

Maji

 
Сегодня я думаю о том, чтобы покончить с индикаторами и просто посмотреть, смогу ли я создать что-то, что позволит мне ссылаться на самый высокий максимум и самый низкий минимум предыдущих(x) баров.

Чем больше я смотрю на индикаторы, тем более привлекательным это кажется.

Хорошо, я вижу high() в предопределенных переменных. как мне использовать его, чтобы получить самый высокий максимум за последние 30 часов, например?

 

Написание индикатора - это одно, а написание советника - совсем другое. Не смешивайте их. В индикаторах вы должны иметь дело с историей, чтобы построить ее правильно. При написании советника у вас есть только текущий тик, и вы должны вычислять значения каждый тик (если не хотите потерять сделку). Поэтому, чтобы получить значения верхней и нижней границы КРУГЛОГО тика, вы можете сделать две вещи

  1. Использовать оригинальный индикатор в качестве пользовательского индикатора
  2. написать логику индикатора внутри вашего эксперта.

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

Чтобы найти его, нужно заглянуть в код индикатора

SetIndexBuffer(0,upper);

SetIndexBuffer(1,middle1);

SetIndexBuffer(2,lower);

Как видите, верхняя линия имеет индекс 0, средняя - индекс 1, а нижняя - индекс 2.

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

Я нашел только одну строку

extern int period = 34;

Теперь мы можем использовать индикатор как пользовательский

double UpLevel = iCustome(NULL,0, "Trend Bands", 34, 0, 0);

double LowLevel = iCustome(NULL,0, "Trend Bands", 34, 2, 0);

34 - параметр индикатора

0 - индекс буфера (2 для нижнего)

последний 0 - это сдвиг бара (в советнике нам нужен текущий, поэтому мы используем 0)

Теперь, когда у вас есть верхнее и нижнее значения, вы можете проверить их по цене.

Надеюсь, это поможет вам продвинуться

Eli

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