Автор |
Сообщение |
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Есть массив условий (назовем его Conditions) и в зависимости от значения в конкретном элементе требуется выполнить разные блоки кода.
Самое простое - использовать конструкцию if-else или switch-case , но для этих конструкций требуется, что бы условие в операторе if(условие) и выражение в операторе switch(выражение) были не массивами, а простыми значениями.
То есть, если использовать такую конструкцию:
if ( Conditions ) ...
или
switch ( Conditions ) ...
то появляется сообщение: Error 6. Условия для операторов IF, WHILE, FOR могут быть числового или логического типа. Вы не можете здесь использовать массивы, пожалуйста применяйте [] (оператор индекса массива) для доступа к элементам массива.
про конструкцию IIf я помню, но тут засада в том, что требуется выполнить разные набор операторов
Посему, вопрос: как можно реализовать выполнение разных блоков кода в зависимости от значения в массиве?
Заранее спасибо за ответ(ы).
P.S. Наверное, это я просто туплю откровенно , и решение - элементарное. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
FedorovMG
Зарегистрирован: 14.08.2014
Сообщения: 58
|
Можно использовать LastValue() |
|
|
Посмотреть профиль Отправить личное сообщение |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
FedorovMG писал(а): |
Можно использовать LastValue() |
То есть, я пишу в коде:
if ( LastValue(Conditions) ) ...
или
switch ( LastValue(Conditions) ) ...
Правильно? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
yser
Зарегистрирован: 30.11.2011
Сообщения: 76
|
можно цикл использовать, что типа такого:
Код: |
Conditions = ...;
for(i=1; i<BarCount; i++) {
if (Conditions[i] == 1) {
выполнить действия ...
} else
if (Conditions[i] == 2) {
выполнить действия ...
} else
if (Conditions[i] == 3) {
выполнить действия ...
}
} |
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Или можно так
Результат_блока1 = ....;
Результат_блока2 = ....;
Результат = IIf(условие, Результат_блока1, Результат_блока2); |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
Олег, заморочка в том, что это именно блоки операторов.
Если их оформить в отдельный фрагмент - то получится процедура (которая не возвращает значение), а не функция.
То есть, затруднительно (или мне так кажется ) в итоге выполнения фрагмента кода получить предложенную тобой конструкцию:
Результат_блока1 = ....;
Результат_блока2 = ....;
Олег, подскажи - вариант if ( LastValue(Conditions) ) ... использовать можно?
Попробую перекроить на выходных код с учетом предложенных решений, вдруг еще вопросы появятся
Спасибо за подсказки. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
FedorovMG
Зарегистрирован: 14.08.2014
Сообщения: 58
|
Да. Такой вариант будет работать. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
На тестировании работать не будет. Только в реале (сигнал, робот). |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
На тестировании работать не будет. Только в реале (сигнал, робот). |
Олег, а такая конструкция полноценно будет работать?
Это тестовый вариант, что бы определить - работает или нет; смысла в собственно вычислениях нет
Код: |
MedianPrice = (High + Low) / 2;
Num_Close = StrToNum(NumToStr(Close));
Num_Median = StrToNum(NumToStr(MedianPrice));
printf( "Начинаем условие\n\n");
if (Num_Close > Num_Median) {
printf( "Случился IF\n\n");
}
else {
printf( "Случился ELSE\n\n");
}
printf( "Close = %g\n", Close );
printf( "MedianPrice = %g\n", MedianPrice );
|
По крайней мере, когда на график цены сложил, то отрабатывает нормально
Про полноценно работать - интересует, будет ли работать и в реале, и в тестировании, и в каких еще можно режимах? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
StrToNum(NumToStr( можно заменить на LastValue(
На тесте использовать нельзя. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
На тестировании работать не будет. Только в реале (сигнал, робот). |
Поясни, пожалуйста, - почему на тестировании работать не будет? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Потому, что для тестирования нужен массив сделок, а функция LastValue() дает на выходе переменную которая всегда равна последнему значению на графике.
Типа надо рассчитать сделку месяц назад, а мы видим только последнее значение на графике а не то, которое было месяц назад. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
StrToNum(NumToStr( можно заменить на LastValue(... |
Олег, поясни, пожалуйста, что делает функция NumToStr.
В документации написано:
Цитата: |
NumToStr( NUMBER, format = 1.3, separator=True)
NumToStr( ARRAY, format = 1.3, separator=True )
Используется для конвертации числового значения константы или массива в текст. |
Цитата: |
WriteVal( NUMBER, format = 1.3, separator=True)
WriteVal( ARRAY, format = 1.3, separator=True )
Используется для вывода числа NUMBER или массива ARRAY.
Примечание: функция NumToStr синоним функции WriteVal и её использование предпочтительно. |
Цитата: |
LastValue(ARRAY, lastmode = True )
Возвращает значение последнего элемента массива ARRAY. |
По логике, если LastValue выводит только последнее значение, то NumToStr(ARRAY...) и WriteVal(ARRAY...) не должны выводить последнее значение массива, так как в чем тогда их смысл, если есть для этого специализированная функция LastValue.
Поэтому, посчитал, что NumToStr(ARRAY...) и WriteVal(ARRAY...) выводит не последнее значение массива, а значение массива в рассматриваемом баре.
Я не прав?
Поясни, пожалуйста, по поводу функций NumToStr(ARRAY...) и WriteVal(ARRAY...) - на каком баре они выводят значение, если аргументом - массив? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
На самом деле не важно что делают эта пара функций вместе. Важно то,что в if() никак нельзя запихать массив. Даже не пытайся. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
il-ir
Зарегистрирован: 28.05.2013
Сообщения: 189
|
000 писал(а): |
На самом деле не важно что делают эта пара функций вместе. Важно то,что в if() никак нельзя запихать массив. Даже не пытайся. |
Ты меня прямо расстроил
СПАСИБО ВСЕМ помогавшим разобраться в вопросе. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|