Автор |
Сообщение |
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
il-ir писал(а): |
Олег, заморочка в том, что это именно блоки операторов.
Если их оформить в отдельный фрагмент - то получится процедура (которая не возвращает значение), а не функция.
То есть, затруднительно (или мне так кажется ) в итоге выполнения фрагмента кода получить предложенную тобой конструкцию:
Результат_блока1 = ....;
Результат_блока2 = ....;
Олег, подскажи - вариант if ( LastValue(Conditions) ) ... использовать можно?
Попробую перекроить на выходных код с учетом предложенных решений, вдруг еще вопросы появятся
Спасибо за подсказки. |
Давай пример того, что тебе надо. Попробуем решить. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
Давай пример того, что тебе надо. Попробуем решить. |
Спасибо за предложение.
Как сформулирую (если сам не смогу решить), напишу. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Олег, помоги, пожалуйста, сделать такое - я пытался сложить массивы, не получилось
Как с использованием if-а я могу представить.
Работаю с каналом. Соответственно, есть такие переменные и сигналы:
Channel_Middle - середина канала
In_Channel_Up == 1 - цена находится в канале у нижней границы и идет в верх, открываем сделку
In_Channel_Up == 0 - цена находится в канале у нижней границы и делает что хочет.
In_Channel_Down == 1 - цена находится в канале у верхней границы и идет в низ, открываем сделку
In_Channel_Down == 0 - цена находится в канале у верхней границы и делает что хочет.
Out_Channel_Up == 1 - цена находится в канале у верхней границы и идет в верх, открываем сделку
Out_Channel_Up == 0 - цена находится в канале у верхней границы и делает что хочет.
Out_Channel_Down == 1 - цена находится в канале у нижней границы и идет в низ, открываем сделку
Out_Channel_Down == 0 - цена находится в канале у нижней границы и делает что хочет.
Логика, которую я не могу сделать:
Если надо открывать сделку, когда цена находится в канале у верхней границы и идет в верх (Out_Channel_Up==1) и при этом проверяем, что In_Channel_Down==0, то открываем (или увеличиваем, если были в сделке) длинную сделку.
Если надо открывать сделку, когда цена находится в канале у верхней границы и идет в верх (Out_Channel_Up==1), но при этом есть сигнал In_Channel_Down==1 - то открываем длинную сделку (или продолжаем не увеличивая находиться в длинной сделке).
Если цена находится в канале у верхней границы и идет в низ (In_Channel_Down==1) и при этом проверяем, что Out_Channel_Up==0, то закрываем длинную сделку (если была открыта) и открываем короткую.
Если была открыта длинная сделка и цена закрытия (Close) пересекла сверху среднюю линию (Channel_Middle), то есть были выше средней, стали ниже средней, то длинную сделку закрываем.
Вроде правильно написал логику, не накосячил.
Заранее спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А что тебе мешает сделать это самому?
Если не знаешь как разделить первичное открытие позиции и добавление, то забей на первичное открытие. Делай сразу добавление.
Типа
Buy = IIf(условие, sigScaleIn, 0);
Но по твоему алгоритму это вроде не актуально.
Код: |
SetOption("ReverseSignalForcesExit", True);
Buy = Out_Channel_Up AND n_Channel_Down;
Buy = Buy AND IIf(Out_Channel_Up AND In_Channel_Down==0, sigScaleIn, 0);
...
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
А что тебе мешает сделать это самому? |
скорее всего, стереотипы мышления Привык if-ами пользоваться
Ты написал пример - все стало понятно.
Спасибо. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Опять я со своими if-ами.
Задача такая.
В зависимости от сигнала рисовать график или сплошной линией, или пунктиром.
То есть,
- если Crit == 0, то styleDashed
- если Crit == 1, то styleLine
В операторе Plot() параметр style имеет тип number.
Как сделать такое?
Конструкция LastValue(IIf(Crit, styleLine, styleDashed)) не работает - график рисуется по последнему значению
С цветом графика проще, параметр color/barcolor может быть и массивом.
Или это можно сделать только циклом for (i =0 ; i < BarCount ; i++ ), перебирая каждое значение?
Спасибо за ответ(ы). |
|
|
Посмотреть профиль Отправить личное сообщение |
|
yser
Зарегистрирован: 30.11.2011
Сообщения: 76
|
il-ir писал(а): |
Опять я со своими if-ами.
Задача такая.
В зависимости от сигнала рисовать график или сплошной линией, или пунктиром.
То есть,
- если Crit == 0, то styleDashed
- если Crit == 1, то styleLine
В операторе Plot() параметр style имеет тип number.
Как сделать такое?
Конструкция LastValue(IIf(Crit, styleLine, styleDashed)) не работает - график рисуется по последнему значению
С цветом графика проще, параметр color/barcolor может быть и массивом.
Или это можно сделать только циклом for (i =0 ; i < BarCount ; i++ ), перебирая каждое значение?
Спасибо за ответ(ы). |
можно нарисовать 2 графика, например так:
Crit = ...;
ma1 = MA(C,9);
Plot(iif(Crit, ma1, null), "A1", colorBlack, styleLine);
Plot(iif(Crit, null, ma1), "A1", colorBlack, styleDashed); |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
yser писал(а): |
можно нарисовать 2 графика |
Спасибо за идею.
Добавлено.
Попробовал нарисовать как предложено (то есть, нужные куски графика рисовать нужным стилем), используя код:
Код: |
ma1 = MA(C,9);
Plot(iif(Crit, ma1, null), "A1", colorBlack, styleLine);
Plot(iif(Crit, null, ma1), "A1", colorBlack, styleDashed); |
Графики почему-то получаются с разрывом (во вложении картинка рис.1)
Если сначала полностью рисуется график пунктиром, а нужные куски рисуем линией, то получается то, что надо (во вложении картинка рис.2):
Код: |
ma1 = MA(C,9);
Plot(iif(Crit, ma1, null), "A1", colorBlack, styleLine);
Plot(ma1, "A1", colorBlack, styleDashed); |
Своей цели я достиг, но интересно, почему так с разрывами в рисовании получается с первым вариантом?
Переменная Crit принимает значения 0 или 1. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
yser
Зарегистрирован: 30.11.2011
Сообщения: 76
|
il-ir писал(а): |
Своей цели я достиг, но интересно, почему так с разрывами в рисовании получается с первым вариантом?
Переменная Crit принимает значения 0 или 1. |
потому, что отсутствует конечная точка (она заменяется на null) которой нужно закончить рисовать линию - вот и получается разрыв.
если их добавить в условие например так :
Код: |
Plot(iif(Crit OR (NOT Crit AND Ref(Crit,-1)), ma1, null), "A1", colorBlack, styleLine);
Plot(iif(NOT Crit OR (Crit AND NOT Ref(Crit,-1)), ma1, null), "A1", colorBlack, styleDashed); |
, то разрывы должны исчезнуть |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|