Каждый раз, разрабатывая ту или иную торговую стратегию, невольно приходится возвращаться к вопросу определения состояния рынка. От этого состояния - тренда или флэта - в каждой стратегии зависит очень многое. Ведь если точно знать, что текущее состояние - флэт, то можно спокойно открыть короткую сделку на очередном повышении цены и точно также спокойно закрыть ее на очередном снижении, повторяя подобный трюк до завершения штиля. Имея стопроцентную уверенность в трендовом состояния рынка, необходимо всего лишь открыть сделку в сторону появления новых экстремумов. В общем, это была бы уже не торговля, а просто сказка...
Но вот ведь проблема: как четко распознать фазы рынка? Просматривая историю котировок, не составляет особого труда отличить тренд от флэта. К сожалению или к счастью, трейдеру приходится иметь дело не с прошлым, а с настоящим, которое необходимо спроецировать в будущее.
Несмотря на указанные трудности, существуют некоторые критерии, способные указать на наличие той или иной фазы рынка. Наиболее часто флэт характеризуется снижением рыночной активности, что сразу сказывается на амплитуде изменения цен, которая резко уменьшается. Бывают, конечно, и вялые тренды, но это больше исключение, чем правило. То есть разделение флэта и тренда следующее: если амплитуда низкая, то это флэт, высокая - тренд.
Итак, амплитуда изменения цен. Иными словами, волатильность рынка, начало изучения которой было положено в статье Отбой волатильности. Там же был представлен индикатор VolatilityBounce. Пристальное изучение свойств этого индикатора автором статьи позволило немного продвинуться в разделении фаз рынка. Отправной точкой в решении проблемы стало объективное разделение волатильности на "низкую" и "высокую". Вопреки ожиданиям, классификация активности рынка, была построена не на статических числах, заданных в пунктах, а на динамически изменяющихся показателях индикатора. "Низкой" волатильностью необходимо считать период, когда разница между максимумом и минимумом цены текущей свечи меньше среднего значения такой же разницы, рассчитанной за некий период, например, за последние сутки. Соответственно, "высокая" волатильность характеризуется значением текущей разницы выше средней величины.
В категориях индикатора VolatilityBounce "низкая" волатильность - это нахождение красной линии ниже голубой, а "высокая" - нахождение красной линии выше голубой (см. рис. 1).
Рис. 1. - Определение зоны флэта и зоны тренда.
В итоге, для определения состояния рынка достаточно дождаться закрытия текущей свечи и сравнить ее волатильность со средней волатильностью. При идентификации флэтовой зоны (ФЗ) гораздо выгоднее не вступать в торговлю, так как заработок во флэте небольшой, а риск - высокий. Гораздо эффективнее использовать раннее определение тренда и открывать позицию в сторону его развития. Сделать это можно при помощи ценовых уровней последней ФЗ.
Более наглядное представление ФЗ можно получить при использовании индикатора VolatilityFlatAndTrend. Но конечные, определяющие, границы ФЗ, по пробитию которых можно открывать сделки, будут сформированы только по факту окончания флэта. Как показано на рис. 1, окончание флэта - это момент возрастания текущей волатильности выше среднего значения. Такая свеча становится сигнальной, вследствие чего ее экстремумы участвуют в формировании сигнальных уровней. На цены, соответствующие сигнальным уровням, устанавливаются отложенные ордера - Buy Stop и Sell Stop. Уровень стоп-приказа каждого ордера совпадает с ценой открытия противоположного ордера. Получается, что в любой момент времени, кроме момента старта стратегии, эксперт оперирует одним рыночным ордером и одним отложенным.
В дополнение к отложенным ордерам, стратегия располагает условиями открытия рыночных ордеров, минуя фазу установки отложенного ордера. Примеры подобных случаев приведены на рис. 2.
Рис. 2. - Сигналы открытия рыночных ордеров.
Обязательным условием поступления сигнала открытия рыночного ордера является закрытие сигнальной свечи внутри ФЗ. Для открытия длинной позиции сигнальная свеча должна быть бычьей с закрытием в нижней половине ФЗ, для открытия короткой позиции сигнальная свеча должна быть медвежьей с закрытием в верхней половине ФЗ. Необходимо различать зону флэта и сигнальную зону. ФЗ индикатор VolatilityFlatAndTrend отображает значками голубого цвета, а сигнальную зону - значками красного цвета. При отсутствии сигнала открытия рыночного ордера, отложенные ордера необходимо устанавливать именно на пробитие сигнальной зоны.
Прибыль в системе не ограничивается, то есть уровень профита не устанавливается. Все сделки закрываются по уровню стоп-приказа, который с течением времени часто оказывается в прибыльной зоне ордера.
Для качественного тестирования стратегии потребуется автоматизация описанного процесса, что в конечном итоге приводит к созданию программы - эксперта. По аналогии с индикатором эксперт носит название VolatilityFlatAndTrend_Expert. Сигнальная функция эксперта GetSignal на этот раз решает две задачи: расчет уровней для установки отложенных ордеров и генерация сигналов открытия рыночных ордеров:
//+-------------------------------------------------------------------------------------+ //| Генерация сигналов покупки и продажи | //+-------------------------------------------------------------------------------------+ void GetSignal(int Num) { Signal = 0;
// - 1 - ============ Определение значений средней и единичной волатильностей =========== double ATR1 = iATR(NULL, 0, ATRPeriod, Num); // Последнее известное значение АТR double ATR2 = iATR(NULL, 0, ATRPeriod, Num+1); // Предпоследнее известное значение ATR double Curr1 = High[Num] - Low[Num]; // Волатильность первой свечи double Curr2 = High[Num+1] - Low[Num+1]; // Волатильность второй свечи // - 1 - =============================== Окончание блока ================================
// - 2 - ============================== Генерация сигналов ============================== // - 2.1 - ============================ Найдено начало флэта =========================== if (Curr1 < ATR1 && Curr2 > ATR2) // Падение волатильности ниже среднего уровня { FlatHigh = High[Num]; // Отмечаются начальные значения FlatLow = Low[Num]; } // - 2.1 - ============================= Окончание блока ===============================
// - 2.2 - ======================== Обнаружено продолжение флэта ======================= if (Curr1 < ATR1 && Curr2 < ATR2) // Волатильность продолжает находиться ниже среднего { // уровня FlatHigh = MathMax(High[Num], FlatHigh); // Определяются экстремальные значения FlatLow = MathMin(Low[Num], FlatLow); } // - 2.2 - ============================= Окончание блока ===============================
// - 2.3 - ========================= Обнаружено окончание флэта ======================== if (Curr1 > ATR1 && Curr2 < ATR2) // Рост волатильности выше среднего уровня { FlatSignHigh = MathMax(High[Num], FlatHigh); // Флэт с учетом сигнальной свечи FlatSignLow = MathMin(Low[Num], FlatLow); FlatEndHigh = FlatSignHigh; // Сформированное значение флэта FlatEndLow = FlatSignLow; // - 2.3.1 - ======================== Генерация сигнала SELL ======================== if (Open[Num] > Close[Num] && // Сигнальная свеча бычья Close[Num] < FlatHigh && // Закрылась внутри ФЗ Close[Num] > (FlatHigh+FlatLow)/2) // Но выше середины ФЗ Signal = -1; // Открытие Sell с рынка // - 2.3.1 - =========================== Окончание блока ============================
// - 2.3.2 - ======================== Генерация сигнала BUY ========================= if (Open[Num] < Close[Num] && // Сигнальная свеча медвежья Close[Num] > FlatLow && // Закрылась внутри ФЗ Close[Num] < (FlatHigh+FlatLow)/2) // Но ниже середины ФЗ Signal = 1; // Открытие Buy с рынка // - 2.3.2 - =========================== Окончание блока ============================ } // - 2.3 - ============================= Окончание блока ===============================
// - 2.4 - ======================== Обнаружено продолжение тренда ====================== if (Curr1 > ATR1 && Curr2 > ATR2) // Волатильность продолжает быть выше среднего уровня { FlatEndHigh = MathMax(FlatEndHigh, High[Num]); // Отслеживается пробитие экстремумов FlatEndLow = MathMin(FlatEndLow, Low[Num]); // ФЗ для предотвращения двойного } // срабатывания уровня // - 2.4 - ============================= Окончание блока =============================== // - 2 - =============================== Окончание блока ================================ }
Первый блок функции в точности повторяет первый блок этой же функции эксперта VolatilityBounce, так как для дальнейших действий требуются значения средней и текущей волатильностей за последние два бара.
Второй блок состоит из четырех вложенных блоков, каждый из которых описывает один вариант развития событий из четырех возможных.Первый вариант - начало ФЗ. Это случай, когда линия текущей волатильности (красная линия индикатора VolatilityBounce) пересекает линию средней волатильности (голубая линия VolatilityBounce) сверху вниз. В этот момент требуется лишь фиксация экстремумов последней сформированной свечи. Они и будут являться границами ФЗ. Значения верхней и нижней границ ФЗ сохраняются в переменных FlatHigh и FlatLow соответственно.
Вторым вариантом является нахождение текущей волатильности ниже средней на протяжении двух и более последних баров. В этом случае достаточно проследить за изменениями границ ФЗ. Если один из экстремумов новой свечи выходит за пределы существующей ФЗ, то соответствующая граница ФЗ обновляется.
Третий вариант событий - окончание ФЗ и начало зоны тренда. Такое бывает, когда текущая волатильность превосходит среднюю волатильность (красная линия VolatilityBounce пересекает голубую снизу вверх). Такая свеча становится сигнальной. Чаще всего сигнальная свеча одним из экстремумов нарушает сложившиеся границы ФЗ. Поэтому один или даже оба сигнальных уровня могут быть за пределами ФЗ. Для этого в коде используются переменные FlatSignHigh и FlatSignLow. В этом же блоке (блок 2.3) производится генерация сигналов открытия рыночного ордера. Для этого проверяется расположение цены закрытия сигнальной свечи относительно границ ФЗ. Сформированные значения сигнальной зоны сохраняются в переменных FlatEndHigh и FlatEndLow.
Четвертый вариант - продолжение тренда. Характеризуется нахождением красной линии индикатора VolatilityBounce выше голубой линии на протяжении двух и более баров. В этом случаепроверяется достижение сформированных границ сигнальной зоны. В случае пробития одной из границ, ее значение обновляется. Подобное слежение предотвращает двукратное срабатывание одного и того же сигнального уровня. Двукратное срабатывание может быть, например, если после открытия ордера SellStop цена возвращается к противоположному уровню, открывая BuyStop и закрывая Sell в убытке. Затем, как ни в чем не бывало, цена возвращается ко вновь установленному SellStop, который при отсутствии слежения за трендом окажется установлен по цене открытия предыдущего ордера SellStop.
Данные, полученные функцией GetSignal, используются в другой функции - Trade. Как нетрудно догадаться, функция Trade выполняет открытие рыночных ордеров и установку отложенных ордеров:
//+-------------------------------------------------------------------------------------+ //| Открытие позиций и установка ордеров | //+-------------------------------------------------------------------------------------+ bool Trade() { // - 1 - ============================= Открытие длинной позиции ========================= if (Signal > 0 && BuyType != OP_BUY) // Сигнал BUY и рыночный ордер BUY не существует { if (BuyType == OP_BUYSTOP) // Присутствует BuyStop, который необходимо удалить if (!DeleteOrder(BuyTicket)) // Если удалить не удалось, то BUY открывать нельзя return(False); if (SellType == OP_SELL) // Присутсвует Sell, который необходимо закрыть if (!CloseOrder(SellTicket)) // Если закрыть не удалось, то BUY открывать нельзя return(False);
// - 2 - =========================== Открытие короткой позиции ========================== if (Signal < 0 && SellType != OP_SELL)// Сигнал SELL и рыночный ордер SELL не существует { if (SellType == OP_SELLSTOP) // Присутствует BuyStop, который необходимо удалить if (!DeleteOrder(SellTicket)) // Если удалить не удалось, то SELL открывать нельзя return(False); if (BuyType == OP_BUY) // Присутсвует Buy, который необходимо закрыть if (!CloseOrder(BuyTicket)) // Если закрыть не удалось, то SELL открывать нельзя return(False); if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), // Открытие SELL NP(FlatSignHigh + Spread + Dist*Point), 0) != 0) return(False); FindOrders(); // Пересчет ордеров при успешном открытии SELL } // - 2 - =============================== Окончание блока ================================
// - 3 - =========================== Установка ордера BuyStop =========================== if (BuyTicket < 0) // Ордеров BUY-типа нет if (FlatEndHigh > Bid) // Цена находится ниже верхней границы ФЗ { if (OpenOrderCorrect(OP_BUYSTOP, Lots, // Установка ордера BuyStop NP(FlatEndHigh + Dist*Point + Spread), NP(FlatEndLow - Dist*Point), 0) != 0) return(false); FindOrders(); // Пересчет ордеров при успешной установке } // - 3 - =============================== Окончание блока ================================
// - 4 - =========================== Установка ордера SellStop ========================== if (SellTicket < 0) // Ордеров SELL-типа нет if (FlatEndLow < Bid) // Цена находится выше нижней границы ФЗ { if (OpenOrderCorrect(OP_SELLSTOP, Lots, // Установка ордера SellStop NP(FlatEndLow - Dist*Point), NP(FlatEndHigh + Dist*Point + Spread), 0) != 0) return(false); FindOrders(); // Пересчет ордеров при успешной установке } // - 4 - =============================== Окончание блока ================================
return(True); }
Аналогичными в функции являются блоки 1 и 2, а также 3 и 4.
Первые два блока занимаются открытием рыночных ордеров BUY и SELL соответственно. Это происходит при ненулевом значении флага Signal, который устанавливается в теле функции GetSignal. По условиям стратегии одновременно не может присутствовать два рыночных ордера. Поэтому, кроме сигнала, проверяется наличие соответствующего рыночного ордера. Это производится с помощью проверки значений переменных BuyType и SellType. Эти переменные содержат значение -1, если ни рыночного, ни отложенного ордера не существует. Неотрицательные значения переменных указывают тип ордера. Для ордера BUY это значение 0, для ордера SELL - 1.
В итоге позиция BUY открывается при отсутствии рыночного ордера BUY, а позиция SELL - при отсутствии рыночного ордера SELL. Если при открытии BUY выясняется, что присутствует ордер BUYSTOP, то отложенный ордер удаляется при помощи вызова функции DeleteOrder. Эта функция не будет рассматриваться из-за ее понятности и простоты. Аналогичным образом, удаляется отложенный ордер SELLSTOP при необходимости открытия SELL. Если же существует обратная открываемой позиция, то такой рыночный ордер сначала закрывается при помощи вызова функции CloseOrder (не рассматривается по тем же причинам), и только затем открывается новая позиция.
Значения переменных BuyType и SellType формируются функцией FindOrders, находящей ордера эксперта в списке доступных ордеров. Кроме типа ордеров сохраняются их тикеты в переменных BuyTicket и SellTicket. Функция поиска своих ордеров рассматривалась многократно. Поэтому нет нужды рассматривать подобную ей функцию.
Блоки 3 и 4 устанавливают отложенные ордера BUYSTOP и SELLSTOP соответственно. Условия установки предельно просты: соответствующий ордер не должен существовать, а текущая цена должна находиться внутри сигнальной зоны.
После открытия позиций или установки ордеров необходимо отслеживать правильность цен открытия отложенных ордеров и уровней стоп-приказов, так как с течением времени границы ФЗ и сигнальной зоны изменяются. При несоответствии требуемых значений, уровень обязательно нужно изменить. Эти действия выполняет функция ModifyCheck:
//+-------------------------------------------------------------------------------------+ //| Проверка расположения цен открытия отложенных ордеров и уровней стоп-приказов | //+-------------------------------------------------------------------------------------+ bool ModifyCheck() { // - 1 - ================ Проверка расположения уровней ордеров BUY-типа ================ if (BuyTicket > 0) // Если существует BUY или BUYSTOP if (OrderSelect(BuyTicket, SELECT_BY_TICKET) && // Ордер существует и OrderCloseTime() == 0) // не закрыт/не удален { double SL = 0; // Стоп изменять не нужно double Price = 0; // Цену открытия менять не нужно
// - 1.1 - =============== Проверка расположения уровня стоп-приказа ============== if (MathAbs(OrderStopLoss() - FlatEndLow + Dist*Point) >= Tick) // Стоп-приказ { // нуждается в изменении SL = NP(FlatEndLow - Dist*Point); // Новый уровень стоп-приказа if (BuyType == OP_BUY && Bid - SL <= StopLevel) // Если новый уровень слишком SL = NP(Bid - StopLevel - Point); // близок к текущей цене, то корректируется if (BuyType == OP_BUYSTOP && OrderOpenPrice() - SL <= StopLevel) // Если новый SL = NP(OrderOpenPrice() - StopLevel - Point);// уровень слишком близок к цене // открытия, то изменяется на ближайший допустимый } // - 1.1 - =========================== Окончание блока ============================
// - 1.2 - ============= Проверка расположения цены открытия BUYSTOP ============== if (BuyType == OP_BUYSTOP) // Если имеем дело с ордером BUYSTOP, // то проверяем цену открытия if (MathAbs(OrderOpenPrice() - (FlatEndHigh + Dist*Point + Spread)) >= Tick) { // Цена открытия нуждается в изменении Price = NP(FlatEndHigh + Dist*Point + Spread); // Новая цена открытия if (Price - Ask <= StopLevel) // Если новая цена открытия слишком близка к Price = NP(Ask + StopLevel + Point); // текущей цене, то корректируем } // - 1.2 - =========================== Окончание блока ============================
// - 1.3 - ============ Изменение уровня стоп-приказа или цены открытия =========== if (SL != 0 || Price != 0) // Если один из уровней нуждается в изменении if (WaitForTradeContext()) // Свободен ли торговый поток? { if (SL == 0) // Если изменять не нужно, то остается старое значение SL = NP(OrderStopLoss()); if (Price == 0) // Если изменять не нужно, то остается старое значение Price = NP(OrderOpenPrice()); if (!OrderModify(OrderTicket(), Price, SL, OrderTakeProfit(), 0)) // при return(False); // неудаче функция вернет False } // - 1.3 - =========================== Окончание блока ============================ } // - 1 - =============================== Окончание блока ================================
// - 2 - =============== Проверка расположения уровней ордеров SELL-типа ================ if (SellTicket > 0) // Если существует SELL или SELLSTOP if (OrderSelect(SellTicket, SELECT_BY_TICKET) && // Ордер существует и OrderCloseTime() == 0) // не закрыт/не удален { SL = 0; // Стоп изменять не нужно Price = 0; // Цену открытия менять не нужно
// - 2.1 - =============== Проверка расположения уровня стоп-приказа ============== if (MathAbs(OrderStopLoss() - (FlatEndHigh + Dist*Point + Spread)) >= Tick)// Стоп- { // приказ нуждается в изменении SL = NP(FlatEndHigh + Dist*Point + Spread); // Новый уровень стоп-приказа if (SellType == OP_SELL && SL - Ask <= StopLevel) // Если новый уровень слишком SL = NP(Ask + StopLevel + Point); // близок к текущей цене, то корректируется if (SellType == OP_SELLSTOP && SL - OrderOpenPrice() <= StopLevel) // Если новый SL = NP(OrderOpenPrice() + StopLevel + Point);// уровень слишком близок к цене // открытия, то изменяется на ближайший допустимый } // - 2.1 - =========================== Окончание блока ============================
// - 2.2 - ============= Проверка расположения цены открытия SELLSTOP ============= if (SellType == OP_SELLSTOP) // Если имеем дело с ордером SELLSTOP, // то проверяем цену открытия if (MathAbs(OrderOpenPrice() - (FlatEndLow - Dist*Point)) >= Tick) { // Цена открытия нуждается в изменении Price = NP(FlatEndLow - Dist*Point); // Новая цена открытия if (Bid - Price <= StopLevel) // Если новая цена открытия слишком близка к Price = NP(Bid - StopLevel - Point); // текущей цене, то корректируем } // - 2.2 - =========================== Окончание блока ============================
// - 2.3 - ============ Изменение уровня стоп-приказа или цены открытия =========== if (SL != 0 || Price != 0) // Если один из уровней нуждается в изменении if (WaitForTradeContext()) // Свободен ли торговый поток? { if (SL == 0) // Если изменять не нужно, то остается старое значение SL = NP(OrderStopLoss()); if (Price == 0) // Если изменять не нужно, то остается старое значение Price = NP(OrderOpenPrice()); if (!OrderModify(OrderTicket(), Price, SL, OrderTakeProfit(), 0)) // при return(False); // неудаче функция вернет False } // - 2.3 - =========================== Окончание блока ============================ } // - 2 - =============================== Окончание блока ================================
return(True); // Все действия завершены успешно - результат True }
Каждый из блоков 1 и 2 содержит три вложенных блока. В первых вложенных блоках проверяется правильность расположения уровня стоп-приказа ордера. Причем неважно рыночный это ордер или отложенный. Разделение наступает только во время проверки корректности нового значения. Сигналом к изменению уровня является ненулевое значение переменной SL.
Вторые вложенные блоки отслеживают правильность расположения цены открытия отложенного ордера. При необходимости внесения изменений переменная Price принимает ненулевое значение.
Третьи вложенные блоки исполняют команды первых двух блоков, модифицируя указанные уровни ордеров.
Основные функции эксперта рассмотрены, что делает возможным тестирование стратегии на исторических данных.
Из немногочисленных настроечных параметров эксперта лишь один будет изменяться в зависимости от валютной пары - ATRPeriod. Параметры Lots и Dist содержат значения по умолчанию. Начало тестирования пришлось на 01.01.2009, а окончание - на 26.06.2010. Рабочий таймфрейм - H1. Результаты представлены ниже (см. рис. 3 - 6).
Рис. 3. - Результаты тестирования эксперта VolatilityFlatAndTrend на валютной паре EURUSD.
EURUSD. Значение параметра ATRPeriod равно 14. Вид кривой баланса не является образцом стабильности. Провалы стратегии продолжительные и глубокие. Но вселяет надежду непременное обновление максимумов после очередного падения. Следующим важным показателем выступает большое количество сделок, которое оказалось более 800. Это свидетельствует о высокой частоте совершения сделок (примерно две сделки в сутки), а также дает большую уверенность в не случайности результата. Чистая прибыль составила 2386 долларов при максимальной просадке 1632 доллара. Фактор восстановления 1.46, что даже для евро является низким показателем.
Рис. 4. - Результаты тестирования эксперта VolatilityFlatAndTrend на валютной паре USDCHF.
USDCHF.Оптимальное значение параметра ATRperiod = 15. Франк оказался единственной валютной парой, для которой стратегия явно не подходит. Ни о какой чистой прибыли говорить не приходится. Вид кривой баланса также явно подтверждает оба высказывания.
Рис. 5. - Результаты тестирования эксперта VolatilityFlatAndTrend на валютной паре GBPUSD.
GBPUSD. Значение параметра ATRPeriod = 16. Вид кривой баланса намного стабильнее, нежели это было у евро. Таким же стабильным выглядит рост кривой, что в совокупности с большим количеством сделок дает уверенность в стратегии. Еще большую уверенность вселяют статистические показатели: чистая прибыль 2891 доллар, максимальная просадка 1153 доллара, фактор восстановления 2.5. Это значение тоже не является высоким для фунта, но в данном случае очень обнадеживает вид кривой баланса.
Рис. 6. - Результаты тестирования эксперта VolatilityFlatAndTrend на валютной паре USDJPY.
USDJPY.Результаты показаны при значении ATRPeriod = 17. Стабильность кривой баланса немного ниже, чем у фунта, но рост более ровный, что ставит йену выше всех рассмотренных валютных пар. Чистая прибыль 2397 долларов, максимальная просадка 953 доллара. Фактор восстановления также оказался наиболее высоким сегодня - 2.51.
Доработка стратегии для использования в AutoGraf 4.0
Видимые для пользователя изменения при использовании стратегии в среде AutoGraf 4, по сравнению с экспертом для MetaTrader 4, это, прежде всего, способ запуска. Если эксперт запускается при помощи выбора необходимого советника в списке окна "Навигатор", то стратегиядля AutoGraf может начать свою работу только после запуска самого приложения в терминале MetaTrader 4. Как это сделать будет пошагово описано ниже.
Вторым существенным отличием стратегии для AutoGraf от эксперта является расположение настроечных параметров. В эксперте входные параметры можно изменить в момент запуска эксперта, а в стратегии - в момент запуска AutoGraf. Для этого в разделе "Входные параметры" необходимо найти строки, начинающиеся с литер AT: AT_1, AT_2, ... AT_20. В случае с описываемой стратегией потребуется лишь два параметра AT. Первый, AT_1,будет соответствовать внешней переменной эксперта ATRPeriod, а второй -AT_2 - переменной Dist.
Внимательный читатель заметит, что без средств изменения остается один немаловажный параметр эксперта - Lots. На самом деле это не так. Параметр может быть модифицирован пользователем при помощи панели настроек AutoGraf (см. рис. 7). Причем, производить такие изменения разрешается в любой момент при работе стратегии.
Рис. 7 - Панель настроек AutoGraf 4.
Запуск стратегии VolatilityFlatAndTrend в среде AutoGraf 4.0 состоит из следующих шагов:
Получить файл по ссылке Файлы стратегий для AutoGraf 4.0 и распаковать полученный архив в папку MT4\experts\libraries (с перезаписью файлов AG_AT.ex4 и AG_AT.mq4).
Запустить AutoGraf.
Для работы советника в ключе приведенных результатов в окне настроек AutoGraf (закладка "Входные параметры") выставить правильные значения параметров AT_1 и AT_2 (полное повторение результатов при этом не гарантируется).
Выбрать стратегию №5. Для этого необходимо передвинуть вверх значок So (см. рис. 7) и среди названий стратегий найти значок S5, который также потянуть вверх.
Запустить функцию автоматической торговли, передвинув значок AT в верхнее положение.
Использование полученного советника рекомендуется только в полуавтоматическом режиме под присмотром трейдера и после всестороннего изучения слабых и сильных сторон стратегии.
Комментарии
Отправить комментарий