Как кодировать? - страница 119

 

Я пытаюсь понять, не ошибаюсь ли я;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

if (qqea_up < qqea_down) {

if (i == 1) qqeacross = True;

qqea_long = True;

qqea_short = False;

} else if (qqea_up > qqea_down) {

if (i == 1) qqeacross = True;

qqea_long = False;

qqea_short = True;

}

}

}

он должен проверять наличие действительного сигнала до "qqea_alert_x_candles_ago" баров назад, но тогда он имеет (i == 1), который i==1 случается только один раз?

 
matrixebiz:
Я пытаюсь понять, не ошибаюсь ли я;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

Print("qqea_up: ", qqea_up, "qqea_down: ", qqea_down);

if (qqea_up < qqea_down) {

if (i == 1) qqeacross = True;

qqea_long = True;

qqea_short = False;

} else if (qqea_up > qqea_down) {

if (i == 1) qqeacross = True;

qqea_long = False;

qqea_short = True;

}

}

}

он должен проверять наличие действительного сигнала до "qqea_alert_x_candles_ago" баров назад, но тогда он имеет (i == 1), который i==1 происходит только один раз ?

На первый взгляд ваш код выглядит нормально, это при условии, что "qqea_alert_x_candles_ago" > 0.

Ваша проблема, если функция не работает, скорее всего, связана с iCustom.

Чтобы эта функция работала правильно, вам нужно передать элемент ввода для каждого элемента ввода в реальном индикаторе. Если вы этого не сделаете или передадите неправильные типы данных, то icustom ничего не вернет.

Я добавил оператор Print в приведенный выше код. Используйте его, чтобы определить, действительно ли значения, возвращаемые iCustom, содержат что-либо.

Будьте здоровы,

Hiachiever

 

Нужна помощь с кодом для подсчета баров

Мой советник имеет несколько вариантов расчета стоплосса открытой позиции. Один из этих вариантов - использовать минимум последнего "x" количества ценовых баров.

Строка кода, которая в настоящее время используется в советнике для расчета стоплосса (SL) этой опции для длинной позиции, выглядит следующим образом:

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars - это переменная, вводимая извне.

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

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

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

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

 
hiachiever:
На первый взгляд ваш код выглядит нормально, то есть при условии, что "qqea_alert_x_candles_ago" > 0.

Ваша проблема, если функция не работает, скорее всего, связана с iCustom.

Чтобы эта функция работала правильно, вам нужно передать элемент ввода для каждого элемента ввода в реальном индикаторе. Если вы этого не сделаете или передадите неправильные типы данных, то icustom ничего не вернет.

Я добавил оператор Print в приведенный выше код. Используйте его, чтобы определить, действительно ли значения, возвращаемые iCustom, содержат что-либо.

Будьте здоровы,

Hiachiever

Код взят из другого советника, но я подумал, что когда цикл дойдет до "qqea_alert_x_candles_ago" > 1, тогда это утверждение "if (i == 1) qqeacross = True;" будет теперь False, правильно? Тогда как оно должно оставаться True до тех пор, пока i>qqea_alert_x_candles_ago.

 

Помощь

Уважаемые все,

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

/*[[

Имя := SMA вверх и вниз

Отдельное окно := нет

Первый цвет := синий

Тип первого рисунка:= Линия

Использовать вторые данные := Да

Второй цвет := Красный

Второй тип рисунка := Линия

]]*/

Входы : MAPeriod(10), Bandwide_UP(20), Bandwide_DOWN(20);

Переменные : shift(0), cnt(0), sum(0), loopbegin1(0), loopbegin2(0), first(True), prevbars(0);

Переменные : MA(0);

SetLoopCount(0);

// начальные проверки

If MAPeriod < 1 Then Exit;

// проверка на загрузку дополнительных баров или полную перезагрузку

If Bars 1 Then first = True;

prevbars = Bars;

// loopbegin1 и loopbegin2 предотвращают сцепление подсчитанных баров, исключая текущий

If first Then Begin

loopbegin1 = Bars-MAPeriod-1;

If loopbegin1 < 0 Then Exit; // недостаточно баров для подсчета

loopbegin2 = Bars-MAPeriod-1;

If loopbegin2 < 0 Then Exit; // недостаточно баров для подсчета

first = False; // этот блок должен быть оценен только один раз

End;

// конвергенция-дивергенция

loopbegin1 = loopbegin1+1; // текущий бар тоже должен быть пересчитан

For shift = loopbegin1 Downto 0 Begin

MA = iMA(MAPeriod,MODE_SMA,shift);

SetIndexValue(shift,(MA+Bandwide_UP*point));

SetIndexValue2(shift,(MA-Bandwide_DOWN*point));

loopbegin1 = loopbegin1-1; // предотвращение пересчета на предыдущие бары

Конец;

С наилучшими пожеланиями,

Роджерио

 

нужна помощь с кодом

мне нужна помощь со следующим кодом на данный момент он открывает ордер только если AC выше или ниже нуля, а я хочу, чтобы он открывался, если красный цвет сменится зеленым и так далее.

double AC1 = iAC(NULL, 0, Current + 0);

double AC2 = iAC(NULL, 0, Current + 1);

if ((AC1 < AC2)) Order = SIGNAL_CLOSEBUY;

 
matrixebiz:
Код взят из другого советника, но я подумал, что когда цикл дойдет до "qqea_alert_x_candles_ago" > 1, то это утверждение "if (i == 1) qqeacross = True;" будет теперь False, правильно? Тогда как оно должно оставаться True до тех пор, пока i>qqea_alert_x_candles_ago.

Нет, это неправильно.

В цикле for вы начинаете с 6 и уменьшаете до 1. Это означает, что в финале цикла for выполняется проверка"if (i == 1) qqeacross = True;". В итоге, если произошел qqeacross, то на выходе будет истина.

Единственная проблема, которая может возникнуть, это если qqeacross был установлен в true в предыдущем цикле. Чтобы решить эту проблему, перед циклом for нужно установить qqeacross = false;. Таким образом вы сможете убедиться, что если qqeacross = true, то оно было установлено только что завершившимся циклом.

Будьте здоровы,

hiachiever

 
Pussy Galore:
Мой советник имеет несколько вариантов расчета стоплосса открытой позиции. Один из этих вариантов - использовать минимум последнего "x" количества ценовых баров.

Строка кода, используемая в настоящее время в советнике для расчета стоплосса (SL) этого опциона для длинной позиции, следующая:

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars - это переменная, вводимая извне.

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

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

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

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

Способ сделать это - создать переменную в глобальной области видимости (т.е. до init)

например,

int BarCount;

int init ()

Затем в коде стоп-лосса используйте следующее:

if (BarCount<Bars)

{

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars++;

BarCount=Bars;

}

Это увеличит StopLossBars на 1 на каждом новом баре.

Единственным дополнением к вашему коду будет возврат 'StopLossBars' к исходному значению по умолчанию при открытии новой сделки.

Будьте здоровы,

Hiachiever

 
denis68:
Мне нужна помощь со следующим кодом в данный момент он открывает ордер только если AC выше или ниже нуля, а я хочу, чтобы он открывался, если красный меняется на зеленый и виза версера

double AC1 = iAC(NULL, 0, Current + 0);

double AC2 = iAC(NULL, 0, Current + 1);

if ((AC1 < AC2)) Order = SIGNAL_CLOSEBUY;

Что я сделал, так это открыл или отобразил два других буфера в коде индикатора, удалив эти две строки;

// SetIndexLabel(1,NULL);

// SetIndexLabel(2,NULL);

Затем с моим модифицированным AC выполнил вызов iCustom;

double ac1 = iCustom(NULL, 0, "AcceleratorMod", 1, 1);

double ac2 = iCustom(NULL, 0, "AcceleratorMod", 2, 1);

double ac11 = iCustom(NULL, 0, "AcceleratorMod", 1, 2);

double ac22 = iCustom(NULL, 0, "AcceleratorMod", 2, 2);

bool acbuy = ac2==0 && ac11==0; // Красный цвет меняется на зеленый

bool acsell = ac1==0 && ac22==0; // Зеленый цвет меняется на красный

Надеюсь, это поможет

 

matrixebiz, что вы имеете в виду под удалением этих двух строк; и как мне это сделать, я не могу войти в код индикатора AC, который я пробовал,

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