Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 как в if-else и switch-case использовать значение из массива Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Вс Фев 14, 2016 7:43 pm Ответить с цитатой Вернуться к началу

il-ir писал(а):
Олег, заморочка в том, что это именно блоки операторов.

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


То есть, затруднительно (или мне так кажется Smile ) в итоге выполнения фрагмента кода получить предложенную тобой конструкцию:
Результат_блока1 = ....;
Результат_блока2 = ....;

Олег, подскажи - вариант if ( LastValue(Conditions) ) ... использовать можно?

Попробую перекроить на выходных код с учетом предложенных решений, вдруг еще вопросы появятся Smile

Спасибо за подсказки.

Давай пример того, что тебе надо. Попробуем решить.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Фев 15, 2016 12:43 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Давай пример того, что тебе надо. Попробуем решить.

Спасибо за предложение.
Как сформулирую (если сам не смогу решить), напишу.
Посмотреть профиль Отправить личное сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Вт Фев 16, 2016 10:23 pm Ответить с цитатой Вернуться к началу

Олег, помоги, пожалуйста, сделать такое - я пытался сложить массивы, не получилось Sad
Как с использованием 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

СообщениеДобавлено: Ср Фев 17, 2016 12:09 am Ответить с цитатой Вернуться к началу

А что тебе мешает сделать это самому?
Если не знаешь как разделить первичное открытие позиции и добавление, то забей на первичное открытие. Делай сразу добавление.
Типа
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

СообщениеДобавлено: Ср Фев 17, 2016 7:28 pm Ответить с цитатой Вернуться к началу

000 писал(а):
А что тебе мешает сделать это самому?

скорее всего, стереотипы мышления Sad Привык if-ами пользоваться Sad

Ты написал пример - все стало понятно.
Спасибо.
Посмотреть профиль Отправить личное сообщение
il-ir



Зарегистрирован: 28.05.2013
Сообщения: 189

СообщениеДобавлено: Пн Фев 22, 2016 10:03 am Ответить с цитатой Вернуться к началу

Опять я со своими if-ами.

Задача такая.
В зависимости от сигнала рисовать график или сплошной линией, или пунктиром.
То есть,
- если Crit == 0, то styleDashed
- если Crit == 1, то styleLine

В операторе Plot() параметр style имеет тип number.

Как сделать такое?
Конструкция LastValue(IIf(Crit, styleLine, styleDashed)) не работает - график рисуется по последнему значению Sad

С цветом графика проще, параметр color/barcolor может быть и массивом.

Или это можно сделать только циклом for (i =0 ; i < BarCount ; i++ ), перебирая каждое значение?

Спасибо за ответ(ы).
Посмотреть профиль Отправить личное сообщение
yser



Зарегистрирован: 30.11.2011
Сообщения: 76

СообщениеДобавлено: Пн Фев 22, 2016 11:31 am Ответить с цитатой Вернуться к началу

il-ir писал(а):
Опять я со своими if-ами.

Задача такая.
В зависимости от сигнала рисовать график или сплошной линией, или пунктиром.
То есть,
- если Crit == 0, то styleDashed
- если Crit == 1, то styleLine

В операторе Plot() параметр style имеет тип number.

Как сделать такое?
Конструкция LastValue(IIf(Crit, styleLine, styleDashed)) не работает - график рисуется по последнему значению Sad

С цветом графика проще, параметр 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

СообщениеДобавлено: Пн Фев 22, 2016 12:11 pm Ответить с цитатой Вернуться к началу

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

СообщениеДобавлено: Пн Фев 22, 2016 1:18 pm Ответить с цитатой Вернуться к началу

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);


, то разрывы должны исчезнуть
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen