Условные выражения в ThinkScript

Условные выражения – если говорить своими словами, то это выполнение разного кода в зависимости от ситуации. Для начала опишем словами. Если идет дождь, тогда остаемся дома, иначе идем на улицу. Это мы описали условное выражение. Выделим главные слова Если, тогда, иначе. Именно эти слова и будем использовать, но пишутся они на английском. Запоминаем. Если – if, тогда – then, иначе – else. Теперь запишем синтаксис:

If <условие> then <действие 1> else <действие 2>;

В таком виде thinkScript конечно не примет наш код, нужно результат куда то записать, в переменную конечно.

def name1 = If <условие> then <действие 1> else <действие 2>;

Вот теперь переменная name примет результат выполнения действия 1 или действия 2 в зависимости выполняется условие или нет.

Рассмотрим такой пример, мы хотим посчитать сколько растущий свечек, сколько падающих свечек и сколько остальных свечек у нас на графике. Вот такая задача. Для ее решения нужно определиться как мы будем определять что свечка растущая – если close > open, Какая свечка падающая – если open > close. И остальные свечки — если open == close. Это мы описали условия. При выполнении какого-либо условия, будет выполняться свой код.

Так же нам нужны переменные, которые будут хранить количество насчитанных свечек. Опишем их:

def up = 0;
def down = 0;
def other = 0;

Так как в thinkScript нельзя присваивать переменной новое значение после объявления, нам придется сразу объявить и прописать условие.

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

Способ первый. Использование условных выражение при объявлении и вычислении переменной.

Возвращаясь к синтаксису, описанному выше, напишем следующий код

def up = if close > open then up[1]+1 else up[1];
def down = if close < open then down[1]+1 else down[1];
def other = if close == open then other[1]+1 else other[1];

Разберемся с кодом на примере первой строки, остальные строки аналогичны.

Объявили переменную up, дальше пишем зарезервированное слово if и описываем условие – если цена закрытия больше цены открытия — значит это растущая свечка, выполняем действие 1, то есть предыдущее значение переменной up прибавляем единицу. Если встретили падающую свечку или другую, то выполняем действие 2, обращаемся к предыдущему значению переменной up и ничего к ней не прибавляем, просто это значение присваиваем переменой up.

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

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

addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

Полный код нашего примера выглядит так:

def up = if close > open then up[1]+1 else up[1];
def down = if close < open then down[1]+1 else down[1];
def other = if close == open then other[1]+1 else other[1];
addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

А теперь воспользуемся вторым вариантом. Дело  том, что код можно сократить, отбросив слова then и else. Есть специальная функция которая так и называется IF. Эта функция принимает 3 параметра, первый – условие, второй – действие 1, если выполняется условие, третий – действие 2, если условие не выполняется. Синтаксис как и у любой другой функции IF(<условие>, <действие1>, <действие2>); Напишем весь наш предыдущий код, но с применением функции IF.

def up = IF(close > open, up[1]+1, up[1]);
def down = IF(close < open, down[1]+1, down[1]);
def other = IF(close == open, other[1]+1, other[1]);
addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

Как видите, слова then и else опустили, тем самым код стал короче. Но как говорил выше, необходимо знать все варианты, так как этот вариант вы не сможете применить в некоторых случаях, например, при изменении цвета внутри других функций, но там подойдет вариант номер 1.

Переходим к следующему варианту. Для начала нужно немного вернуться к части объявления переменных. Как уже вам известно, объявить переменную можно с помощью зарезервированного слова def, далее написать имя и присвоить значение этой переменной. Но что если мы не хотим сразу присваивать какое-либо значение переменной, а хотим только ее объявить? Если вы напишите в редакторе так:

def name;

В результате получите ошибку. Получается, что просто объявить переменную нельзя. Но допишите еще строчку и получите вот такой код:

def name;
name = 10;

А вот и пропала ошибка. В итоге мы выяснили что просто переменную объявить нельзя, но зато если сначала ее объявить, а потом присвоить ей значение допускается, этим и воспользуемся.

А пока еще немного отвлекусь, указав недопустимое действие. В thinkScript не допускается менять значение переменной в процессе написания кода.

def name;
name = 10;
name = 15;

Снова появилась ошибка. Это просто запомните, что так делать нельзя.

Возвращаемся к нашим условным выражениям и применим третий вариант. Для начала мы объявим переменные, а потом присвоим им значения в зависимости от условий.

def up;
if (close > open)then
{
   up = up[1] + 1;
}
else
{
   up = up[1];
}
def down;
if (close > open) then
{
   down = down[1] + 1;
}
else
{
   down = down[1];
}
def other;
if (close > open) then
{
   other = other[1] + 1;
}
else
{
   other = other[1];
}
addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

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

Этот вариант хорошо подходит, когда нужно рассчитать несколько переменных. А условие одно. Можно конечно описать все переменные отдельно и для каждой прописать одно и тоже условие, но лучше объявить все переменные, а потом написать один раз условие и присвоить значения для всех переменных, код будет короче.

def up;
def down;
def other;
if (volume >= 1000) {
   up = 10;
   down = 15;
   other = 20;
}
else
{
   up = 100;
   down = 150;
   other = 200;
}

Этот код никакой полезности не несет, он лишь показывает, как описать три переменные, а потом, используя одно условие, всем трем переменным присваивать значения.

Ну что же, двигаемся дальше. Как думаете. Можно ли совмещать все эти условия? – конечно можно. Пример ниже:

def up;
def down;
def other;
if (volume >= 1000)
{
   up = if close > open then up[1] + 1 else up[1];
   down = if close < open then down[1] + 1 else down[1];
   other = if close > open then other[1] + 1 else other[1];
}
else
{
   up = up[1];
   down = down[1];
   other = other[1];
}
addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

Этот код уже содержит два варианта условий. В первом условии для всех переменных мы проверяем, если объем свечки больше 1000 тогда, а дальше для каждой переменной еще ставим условие как в примерах выше, по определению типа свечки. В итоге, этот код уже не просто подсчитывает количество растущих, падающих и остальных свечек, а он берет в расчет только свечки у которых объем больше 1000, остальные пропускает.

Так же можно использовать и функцию IF опустив слова then и else. Не буду писать код, думаю вы уже знаете, как это сделать.

Еще приведу пример вложенности условий одно в другое.

def up;
def down;
def other;
def one;
def two;
if (volume >= 1000)
{
   IF (close > 50)
   {
      one = 10;
      two = 20;
   }
   else
   {
      one = 100;
      two = 200;
   }
   up = if close > open then up[1] + 1 else up[1];
   down = if close < open then down[1] + 1 else down[1];
   other = if close > open then other[1] + 1 else other[1];
}
else
{
   IF (close > 50)
   {
      one = 10;
      two = 20;
   }
   else
   {
      one = 100;
      two = 200;
   }
   up = up[1];
   down = down[1];
   other = other[1];
}
addLabel(yes, “Растущих ” + up + “ Падающих ” + down + “ Остальных ” + other);

Для начала я объявил еще дополнительно две переменные, а потом использовал для них вложенные условия.

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

Постоянная ссылка на это сообщение: https://k-pavel.ru/uslovnye-vyrazhenija-v-thinkscript/

avatar

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Подписаться на