Чтобы ответить на этот вопрос, Zorro дополнительно анализирует стратегию с помощью метода Монте-Карло. По сравнению с обычным моделированием, метод Монте-Карло дает более точные и менее случайные результаты.
В анализе Монте-Карло кривая доходности, полученная в результате моделирования, разбивается на множество отдельных сегментов, которые меняются местами в случайном порядке.
Некоторые из значений, отображаемых в окне Zorro, получаются непосредственно в результате моделирования, другие — такие как коэффициент Шарпа, кратко затронутый выше, — требуют более или менее сложных расчетов. Все эти значения на самом деле служат лишь для ответа на два вопроса: насколько прибыльной является стратегия? И насколько вероятно получить тот же результат при реальной торговле? Оба аспекта в совокупности дают эффективность — результативность стратегии. На первый вопрос ответить легко, но на второй и более важный вопрос, к сожалению, ответить сложно.
set(LOGFILE);
LOGFILE — это флаг — что-то вроде «переключателя», который можно включить или выключить. Такие флаги «устанавливаются», т.е. включаются, с помощью функции set. Если установлен флаг LOGFILE, сохраняется журнал всех событий во время теста. Вставьте строку, нажмите на [Test], затем откройте файл Alice1a_EURUSDtest.log в папке log редактором SED или любым другим текстовым редактором. Файл представляет собой длинный список записей, похожих на эту:
Запустите Zorro. Выберите скрипт Alice1a и актив EUR/USD (все скрипты и стратегии, описанные в книге, можно скачать с сайта financial-hacker.com/). Убедитесь, что ползунок Период установлен на 60 минут. Затем нажмите [Test]:
Продолжите выполнение сценария. Следующая строка устанавливает стоп-лосс:
Stop = 4*ATR(100);
Stop — это предопределенная переменная. Zorro уже «знает» его, поэтому его не нужно определять с помощью var. Он определяет стоп-лосс, т.е. максимально допустимый убыток. Позиция автоматически продается, если она теряет больше указанной суммы. Здесь этот предел задан 4*ATR(100). Функция ATR является традиционным индикатором — Average True Range.
function run() { vars Price = series(price()); vars Trend = series(LowPass(Price,500)); Stop = 4*ATR(100); if(valley(Trend)) enterLong(); else if(peak(Trend)) enterShort(); }
Это уже целая система. Мы видим, что главная функция теперь называется «run» вместо «main».
Боб занимается валютной торговлей с 1995 г. В некоторые годы его прибыль достигала шестизначных цифр, и единственным предметом его беспокойства была налоговая декларация. Но в последнее время дела идут не очень хорошо. Фактически, в течение последних трех лет он приносил только убытки. Резервы тают. Что-то должно измениться. Но что? Боб уже посетил все существующие семинары по трейдингу. Он уже прочитал все книги по трейдингу. Остается только один вариант. Именно поэтому Бобу сегодня назначена встреча с Алисой.
Пока я еще не стал миллионером, я должен продолжать торговать. Это был просто пример цикла «while».
В коде это будет выглядеть следующим образом:
while(Vermoegen < 1000000) trade(Vermoegen);
Оператор while имеет точно такой же синтаксис, как и оператор if. Имеется условие — в данном случае, что переменная Vermoegen меньше одного миллиона — и последующий оператор, который выполняется, если условие истинно. В этом случае программа будет просто продолжена. С другой стороны, с помощью оператора while программа «перепрыгивает» назад к условию и проверяет его снова. Если он по-прежнему применим, зависимое утверждение выполняется снова. Это повторяется до тех пор, пока либо условие не станет ложным в какой-то момент, либо пока кто-то не выдернет вилку из розетки.
Если я хочу тратить больше 3 000 евро в месяц, мне нужна новая стратегия. В противном случае подойдет моя старая стратегия.
Это пример ветви if/else. В коде это будет выглядеть следующим образом:
if(Ausgaben > 3000) neue_strategie_starten(); else alte_strategie_fortsetzen();
Операторы «if» используются, когда сценарий должен принимать решения — то есть, когда он должен вести себя по-разному в зависимости от того, истинно условие или нет. Таким условием может быть ввод данных пользователем, величина случайного числа, результат математической операции или пересечение двух индикаторов. Основная форма оператора if выглядит следующим образом:
Функция также может принимать переменные или числовые значения от вызывающей функции, использовать их для своих вычислений и возвращать результат. Вот пример функции, которая получает переменные и возвращает их:
var euro_to_dollar(var Euro) { var Kurs = 1.36; return Euro * Kurs; }
Переменная var Euro в скобках содержит числовое значение, которое передается в функцию. Эта переменная может использоваться в функции как любая другая переменная. Чтобы вернуть число, запишите его — или выражение, которое вычисляет это число — после оператора return. Это возвращаемое число — называемое возвращаемым значением — может быть затем обработано в вызывающей функции.