По просьбе одного
из пользователей форума
MQLabs,сегодня будет рассмотрена
стратегия с искрометным (в буквальном и переносном смысле) названием "Молния".
Интерес к ней вызван не новизной самой идеи (пробой фракталов и постройка по ним
каналов стали классикой), а любопытным сочетанием пробойной трендовой торговли,
каналов и волновой теории. Также подкупает большое количество мелких деталей,
принятых во внимание, что свидетельствует о кропотливой разработке системы ее
автором, который на данный момент остается неизвестным.
В качестве отправной точки торговая
стратегия использует, набившую оскомину, формулировку трех волн: первая волна,
после которой следует вторая коррекционная волна, открывающая дорогу импульсной
третьей волне.Автор стратегии утверждает, что
название "молния" отражает скоротечность торговых процессов, но после подробного
рассмотрения системы находится еще один момент - вид трех волн очень напоминает
значок, предупреждающий об опасности поражения током,
непосредственно похожий на молнию.
Идентификация волн в стратегии производится
довольно банальным образом - на основании фракталов. Первой волне соответствует
интервал между двумя разнонаправленными фракталами. Причем этот интервал не
должен содержать каких-либо других фракталов. Начало второй волны совпадает с
окончанием первой и заканчивается фракталом, совпадающим по направлению с
фракталом, определяющим начало первой волны. Для лучшего восприятия последующее
описание разделено на две части: восходящее движение и нисходящее движение.
Восходящее движение.
Схематически условия возникновения "молнии вверх" показаны на рис. 1.
Рис. 1. - Условия возникновения
"молнии вверх".
Первая волна строится между фракталом
"вниз" (фрактал №3) и фракталом "вверх" (фрактал №2). Вторая волна образуется
между фракталом "вверх" и фракталом "вниз". До момента принятия решения о
направлении сделки новые фракталы присутствовать не должны. Фиксация окончания
второй волны (фрактал №1) возможна лишь спустя две свечи. Это связано с
определением самого фрактала. Фрактал №2 становится уровнем, пробитие которого
дает сигнал к совершению покупки (имеется в виду, что сделка производится при
помощи отложенного ордера). Если уровень пробивается еще до определения первого
фрактала (как на рис. 1), то отложенный ордер устанавливается на минимальном
расстоянии от текущей цены.
Дополнительными условиями при идентификации
волн являются следующие. В интервале между третьим и вторым фракталами
экспоненциальная средняя скользящая с периодом 2 не должна иметь нисходящие
участки. В противном случае первая волна не фиксируется, а вместе с ней и вся
"молния". Определение второй волны возможно лишь в случае закрытия следующей за
фрактальной свечи выше закрытия фрактальной свечи. Последним
важным обстоятельством выступает соотношение длин волн. Вторая волна не может
быть больше половины длины первой волны. Идеальный случай - отскок от середины
первой волны.
Уровень стопа длинной сделки располагается
на уровне окончания второй волны, то есть за фракталом №1. Цель (профит) сделки
рассчитывается из разницы между ценами фрактала №1 и №3. Полученная разница
умножается на коэффициент (различный для каждого инструмента) и прибавляется к
значению цены фрактала №2.
Нисходящее движение.
Схематически условия возникновения "молнии вниз" показаны на рис. 2.
Рис. 2. - Условия возникновения
"молнии вниз".
Первая волна
строится между фракталом "вверх" (фрактал №3) и фракталом "вниз" (фрактал №2).
Вторая волна образуется между фракталом "вниз" и фракталом "вверх" (фрактал №1).
До момента принятия решения о направлении сделки новые фракталы присутствовать
не должны. Фрактал №2 становится уровнем, пробитие которого дает сигнал к
совершению продажи. На этот уровень устанавливается ордер
Sell Stop. Если уровень пробивается еще до момента определения первого
фрактала, то отложенный ордер устанавливается на минимальном расстоянии от
текущей цены.
Аналогично условиям "молнии вверх",
существуют дополнительные условия для идентификации волн "молнии вниз". В
интервале между третьим и вторым фракталами экспоненциальная средняя скользящая
с периодом 2 не должна иметь восходящие участки. В противном случае первая волна
не фиксируется, а вместе с ней и вся "молния". Определение второй волны возможно
лишь в случае закрытия следующей за фрактальной свечи ниже
закрытия фрактальной свечи. Последним важным обстоятельством выступает
соотношение длин волн. Вторая волна не может быть больше половины длины первой
волны. Идеальный случай - отскок от середины первой волны.
Уровень стопа длинной сделки располагается
на уровне окончания второй волны, то есть за фракталом №1. Цель (профит) сделки
рассчитывается из разницы между ценами фрактала №3 и №1. Полученная разница
умножается на коэффициент (различный для каждого инструмента) и вычитается из
значения цены фрактала №2.
Описанные условия торговли реализованы в
эксперте Lighting и в одноименном индикаторе.
Индикатор, в отличие от эксперта, отображает канал, построенный по трем
последним фракталам, а также уровни открытия сделки (зеленая линия), цели сделки
(синяя линия) и уровня стоп-приказа (красная линия). Единственным значимым
входным параметром является TPPercent. Это и есть
коэффициент, на который умножается разница между первым и третьим фракталами для
определения уровня цели.
Поиск "молний" и проверка их соответствия
условиям стратегии производится в функции GetSignal
эксперта. В виду большого объема кода функции, она будет рассмотрена поэтапно.
Первая часть - поиск "верхних" фракталов:
//+-------------------------------------------------------------------------------------+
//| Генерация сигналов покупки и продажи |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
// - 1 - ================================ Инициализация перменных =======================
FN = 0; SN = 0; TN = 0;
// - 1 - ==================================== Окончание блока ===========================
for (int i = 3; i < Bars && TN == 0; i++)
{
// - 2 - ================================ Поиск "верхних" фракталов =====================
double Fr = iFractals(NULL, 0, MODE_UPPER, i); // Получение значения "верхнего"
// фрактала на свече №i
if (Fr != 0)// Если фрактал найден, то необходимо найти место для записи его значений
if (FN == 0) // Является ли найденный фрактал первым?
{ // Если является, то
FN = i; // запоминается номер бара,
FV = Fr; // значение цены
FT = 1; // и тип фрактала
continue; // если на этом баре существует "нижний" фрактал, он игнорируется
}
else // Найденный фрактал уже не первый
if (SN == 0) // Может быть этот фрактал второй?
{ // Если этот фрактал второй, то
if (FT == 0) // согласно стратегии нужно проверить, был ли первый фрактал
{ // "нижним". Если это действительно так, то все в порядке и можно
SN = i; // запомнить номер бара
SV = Fr; // цену формирования
ST = 1; // и тип фрактала
continue; // если на этом баре существует "нижний" фрактал, он игнорируется
}
else // первый фрактал был "верхним", что не вписывается в правила стратегии
return(False); // подается сигнал о том, что канал не сформирован
}
else // Найденный фрактал даже не второй
if (TN == 0) // Тогда может это третий фрактал?
{ // Если этот фрактал третий, то
if (FT == 1 && ST == 0) // Первый - должен был быть "верхним", второй -
{ // "нижним". Только в таком случае производится запись фрактала
TN = i; // Сохранение номере бара,
TV = Fr; // цены формирования фрактала и
TT = 1; // его типа
continue;//если на этом баре существует "нижний" фрактал, он игнорируется
}
else // Третий фрактал не соответствует стратегии
return(False); // подается сигнал о том, что канал не сформирован
}
else break; // Все фракталы найдены, следует прервать цикл поиска
// - 2 - ==================================== Окончание блока ===========================
Каждому найденному фракталу
соответствует свой набор переменных. Для сохранения значения фрактала
используются переменные FV, SV и
TV соответственно для первого, второго и
третьего фракталов. Номера баров, на которых фракталы были найдены, сохраняются
в переменных FN, SN и TN.
Последняя характеристика фрактала - его тип. Тип сохраняется в переменных
FT, ST и TT. "Верхнему"
фракталу соответствует значение 1, а "нижнему" - 0.
В начале функции
GetSignal номера баров всех трех фракталов принимают
значение 0, что свидетельствует о том, что ни один фрактал еще не найден. Далее
следует цикл перебора баров, начиная с третьего бара (на 0-ом, 1-ом и 2-ом барах
зафиксировать фрактал невозможно). Переменной Fr
присваивается значение фрактала на баре i (переменная
цикла). Если фрактал на данном баре не существует, то
значение Fr будет равно нулю. Не нулевое значение
Fr свидетельствует о нахождении "верхнего" фрактала.
При успешном нахождении фрактала
начинается поиск порядкового номера фрактала и проверка соответствия получаемой
"молнии" условиям стратегии. Сначала вновь найденный фрактал считается первым.
Если это действительно так, то значение FN будет равно
нулю и можно заполнить значения FV, FN и
FT. Если FN не равно нулю,
то фрактал считается вторым. Подтверждением этому будет нулевое значение
SN. В этом случае сначала проверяется условие
чередования фракталов, то есть предыдущий (первый) фрактал должен быть "нижним".
Об этом скажет нулевое значение FT. Если условие
выполняется, то заполняются значения SN, SV и
ST. Если же первый фрактал был "верхним", то это
означает отсутствие нужной "молнии" и влечет немедленное завершение функции
GetSignal с возвратом результата
False.
Если же
найденный фрактал не является вторым, то он может быть только третьим, хотя на
всякий случай проверяется значение TN, которое просто
обязано быть равным нулю. Следующее условие - чередование фракталов. Первый
фрактал должен быть "верхним" (FT = 1),
а второй - "нижним" (ST = 0).
Истинность условия приводит к заполнению переменных
TN, TV и TT с завершением цикла.
Аналогичным образом построен
третий блок функции GetSignal, производящий поиск
"нижних" фракталов:
// - 3 - ================================ Поиск "нижних" фракталов ======================
Fr = iFractals(NULL, 0, MODE_LOWER, i); // Получение значения "нижнего"
// фрактала на свече №i
if (Fr != 0)// Если фрактал найден, то необходимо найти место для записи его значений
if (FN == 0) // Является ли найденный фрактал первым?
{ // Если является, то
FN = i; // запоминается номер бара,
FV = Fr; // значение цены
FT = 0; // и тип фрактала
}
else // Найденный фрактал уже не первый
if (SN == 0) // Может быть этот фрактал второй?
{ // Если этот фрактал второй, то
if (FT == 1 && FN != i) // согласно стратегии нужно проверить, был ли первый
{ // фрактал "верхним". Если это действительно так, то все в порядке и можно
SN = i; // запомнить номер бара
SV = Fr; // цену формирования
ST = 0; // и тип фрактала
}
else // первый фрактал был "нижним", что не вписывается в правила стратегии
return(False); // Не выполнено условие чередования фракталов, канал не
} // сформирован
else // Найденный фрактал даже не второй
if (TN == 0) // Тогда может это третий фрактал?
{ // Если этот фрактал третий, то
if (FT == 0 && ST == 1) // Первый - должен был быть "нижним", второй -
{ // "верхним". Только в таком случае производится запись фрактала
TN = i; // Сохранение номере бара,
TV = Fr; // цены формирования фрактала и
TT = 0; // его типа
}
else // Третий фрактал не соответствует стратегии
return(False); // подается сигнал о том, что канал не сформирован
}
else break; // Все фракталы найдены, следует прервать цикл поиска
}
// - 3 - ==================================== Окончание блока ===========================
В данном случае
переменной Fr присваивается значение "нижнего"
фрактала i-ого бара. Нулевое значение
свидетельствует об отсутствии фрактала, а ненулевое - о присутствии.
Дальнейшие действия - поиск номера
найденного фрактала. Сначала предполагается, что найденный фрактал - первый.
Если это действительно так, то заполняются значения FN, FV
и FT. Если же это не так, то предполагается,
что фрактал - второй. При SN = 0 предположение
переходит в разряд истинных. Далее проверяется условие чередование фракталов, то
есть первый фрактал должен быть "верхним" (FT = 1)и не должен находиться на текущем баре (FN != i).
Только в этом случае заполняются SN, SV и
ST. Невыполнение условия чередования приводит к
экстренному окончанию функции GetSignal с возвратом
результата False.
Если же
SN не равно нулю,то фрактал, скорее всего, является третьим. В
этом случае достаточно проверить условие чередования фракталов: первый должен
быть "нижним" (FT = 0), а
второй - "верхним" (ST = 1).
В итоге заполняются переменные TN, TV и
TT. Если же не выполняется условие чередования
фракталов, то функция GetSignal завершается с
отрицательным результатом - False.
После
успешного нахождения всех трех фракталов, которые выдерживают условие
чередования, производится проверка дополнительных условий:
// - 4 - ================================ Генерация сигнала продажи =====================
if (FT == 1) // Если первый фрактал - "верхний", то молния вниз, сигнал в ту же сторону
{
if (FV > (TV + SV)/2) // Первый фрактал не должен быть выше середины первой волны
return(False); // иначе это не соответствует правилам стратегии
if (Close[FN-1] >= Close[FN]) // Свеча после формирования второй волны не должна
return(False); // закрыться выше закрытия свечи второй волны
for (i = TT-1; i >= ST; i--) // Проверка всех баров первой волны
// средняя на протяжении первой волны должна быть нисходящей
if (iMA(NULL, 0, 2, 0, MODE_EMA, PRICE_CLOSE, i) >
iMA(NULL, 0, 2, 0, MODE_EMA, PRICE_CLOSE, i+1))
return(False); // Если замечен рост - молния не подходит
}
// - 4 - ==================================== Окончание блока ===========================
// - 5 - ================================ Генерация сигнала покупки =====================
else // Если первый фрактал - "нижний", то молния вверх, сигнал в ту же сторону
{
if (FV < (TV + SV)/2) // Первый фрактал не должен быть ниже середины первой волны
return(False);
if (Close[FN-1] <= Close[FN]) // Свеча после формирования второй волны не должна
return(False); // закрыться ниже закрытия свечи второй волны
for (i = TT-1; i >= ST; i--) // Проверка всех баров первой волны
// средняя на протяжении первой волны должна быть восходящей
if (iMA(NULL, 0, 2, 0, MODE_EMA, PRICE_CLOSE, i) <
iMA(NULL, 0, 2, 0, MODE_EMA, PRICE_CLOSE, i+1))
return(False); // Если замечен спад - молния не подходит
}
// - 5 - ==================================== Окончание блока ===========================
return(True); // Сигнал успешно сгенерирован
}
Блок 4 имеет дело с "молнией
вниз". Условие FT == 1 означает, что первый фрактал
"нижний", а в соответствии с условием чередования второй должен быть "верхним" и
третий "нижним". Такая формация наблюдается только у нисходящих молний. Первое
дополнительное условие - первый фрактал не может быть выше половины длины первой
волны. Если оно не выполняется - результат функции GetSignal
будет False. Затем в бой вступает проверка
второй волны - закрытие свечи за фракталом №1 не может быть выше или равно
закрытию фрактальной свечи. Невыполнение условия - результат
False. Третье условие проверяет наклон EMA(2)
на всем протяжении первой волны. Для этого сравниваются значения средней
скользящей на всех
барах между вторым и третьим фракталами. Нахождение хотя бы одного участка роста
приводит к отрицательному результату.
Блок 5 аналогичен блоку 4, но имеет дело с "молнией
вверх". Проверяется нахождение первого фрактала выше середины первой волны,
нахождение цены закрытия свечи после окончания второй волны выше цены закрытия
фрактальной свечи и отсутствие падений EMA(2) на
участке между вторым и третьим фракталами.
Успешное прохождение всех проверок приводит к
положительному результату функции GetSignal - True.
Исполнение сигналов функции
GetSignal производитсяв
функции Trade, при помощи которой совершаются все
торговые действия эксперта. Так как код функции также объемен, то будет приведен
в двух частях. Первая часть содержит действия при обнаружении "молнии вверх":
//+-------------------------------------------------------------------------------------+
//| Открытие позиций и установка ордеров |
//+-------------------------------------------------------------------------------------+
bool Trade()
{
// - 1 - ============================= Открытие длинной позиции =========================
if (FT == 0) // Сигнал BUY
{
double Price = NP(SV + Spread + Tick);
double SL = NP(FV - Tick);
double TP = NP(SV + (FV - TV)*TPPercent/100);
if (High[iHighest(NULL, 0, MODE_HIGH, FN)] >= TP)
return(True);
if (BuyType == OP_BUYSTOP) // Присутствует BuyStop
if (OrderSelect(BuyTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{ // Проверка цены открытия, стопа и профита
if (MathAbs(OrderOpenPrice() - Price) >= Tick)
if (WaitForTradeContext())
{
RefreshRates();
if (Price - Ask > StopLevel &&
Price - SL > StopLevel && TP - Price > StopLevel)
if (!OrderModify(BuyTicket, Price, SL, TP, 0))
return(False);
}
else
return(False);
return(True);
}
if (BuyType == OP_BUY) // Присутствует Buy
if (OrderSelect(BuyTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{ // Проверка стопа и профита
if (MathAbs(OrderStopLoss() - SL) >= Tick ||
MathAbs(OrderTakeProfit() - TP) >= Tick)
if (WaitForTradeContext())
{
RefreshRates();
if (Bid - SL > StopLevel && TP - Bid > StopLevel)
if (!OrderModify(BuyTicket, 0, SL, TP, 0))
return(False);
}
else
return(False);
return(True);
}
if (SellType > 0) // Если есть SELL или SELLSTOP
{ // Удаляем или закрываем
if (SellType == OP_SELL)
if (!CloseOrder(SellTicket))
return(False);
if (SellType == OP_SELLSTOP)
if (!DeleteOrder(SellTicket))
return(False);
}
if (OpenOrderCorrect(OP_BUYSTOP, Lots, Price, // Открытие BUY
SL, TP) != 0)
return(False);
}
// - 1 - =============================== Окончание блока ================================
Если первый фрактал - "нижний" (FT == 0),
то блок 1 исполняется. Первым делом рассчитываются уровни открытия ордера
Buy Stop, уровня профита и уровня его стоп-приказа.
Затем проверяется достижение ценой уровня профита за время, прошедшее после
формирования первого фрактала. Если цель уже была достигнута, то смысл
совершения сделки теряется, и функция Trade завершается
экстренно.
Следующим этапом является проверка существования ордера
Buy Stop. Эту информацию можно получить из значения
переменной BuyType, которое формируется после вызова
функции FindOrders, находящей ордера эксперта. Кроме
типа ордера функция сохраняет тикет ордера в переменной
BuyTicket. Код FindOrders полностью дублирует
код одноименной функции эксперта
VolatilityFlatAndTrend. По этой причине код приведен здесь не будет. Если
Buy Stop существует, то проверяется правильность его
цены открытия. При несоответствии изменяются все параметры ордера - цена
открытия, профит и стоп-приказ. В результате присутствия ордера
Buy Stop функция Trade
успешно завершается.
Если нет ордера
Buy Stop, то
проверяется наличие рыночного ордера Buy. Если ордер
найден, то проверяется лишь уровень стоп-приказа с изменением при необходимости.Присутствие ордера Buy также завершает функцию
Trade.
При отсутствии любого ордера Buy-типа
производится поиск ордера Sell-типа. Если это рыночный
ордер, то он закрывается при помощи вызова функции CloseOrder,
которая также взята из эксперта VolatilityFlatAndTrend.
Если же ордер отложенный, то он удаляется при помощи вызова функции
DeleteOrder, известной по тому же эксперту
VolatilityFlatAndTrend.
После успешного устранения
ордеров Sell-типа производится установка ордера
Buy Stop.
Второй блок функции
Trade описывает случай нахождения "молнии вниз":
// - 2 - =========================== Открытие короткой позиции ==========================
if (FT == 1) // Сигнал SELL
{
Price = NP(SV - Tick);
SL = NP(FV + Spread + Tick);
TP = NP(SV - (TV - FV)*TPPercent/100);
if (Low[iLowest(NULL, 0, MODE_LOW, FN)] <= TP - Spread)
return(True);
if (SellType == OP_SELLSTOP) // Присутствует SellStop
if (OrderSelect(SellTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{ // Проверка цены открытия, стопа и профита
if (MathAbs(OrderOpenPrice() - Price) >= Tick)
if (WaitForTradeContext())
{
RefreshRates();
if (Bid - Price > StopLevel && SL - Price > StopLevel && Price - TP > StopLevel)
if (!OrderModify(SellTicket, Price, SL, TP, 0))
return(False);
}
else
return(False);
return(True);
}
if (SellType == OP_SELL) // Присутствует SELL
if (OrderSelect(SellTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{ // Проверка стопа и профита
if (MathAbs(OrderStopLoss() - SL) >= Tick || MathAbs(OrderTakeProfit() - TP) >= Tick)
if (WaitForTradeContext())
{
RefreshRates();
if (SL - Ask > StopLevel && Ask - TP > StopLevel)
if (!OrderModify(SellTicket, 0, SL, TP, 0))
return(False);
}
else
return(False);
return(True);
}
if (BuyType >= 0) // Если есть Buy или BuyStop
{ // Удаляем или закрываем
if (BuyType == OP_BUY)
if (!CloseOrder(BuyTicket))
return(False);
if (BuyType == OP_BUYSTOP)
if (!DeleteOrder(BuyTicket))
return(False);
}
if (OpenOrderCorrect(OP_SELLSTOP, Lots, Price, // Открытие SELL
SL, TP) != 0)
return(False);
}
// - 2 - =============================== Окончание блока ================================
return(True);
}
Блок
выполняется при значении FT = 1. Перед проведением
каких-либо проверок рассчитываются значения цены открытия, уровня стоп-приказа и
профита будущего ордера Sell Stop. После этого
проверяется достижение уровня профита на интервале между ближайшим фракталом и
текущей свечей. Если профит уже был достигнут, то установка отложенного ордера
теряет всякий смысл. Поэтому функция Trade будет
завершена досрочно с возвратом результата True, имитируя успешную установку ордера.
Если установка ордера все же имеет
смысл, то производятся проверки существования отложенного ордера
Sell Stop и рыночного ордера Sell.
В первом случае проверяется соответствие цены открытия ордера необходимой
цене, а во втором - уровня стоп-приказа на идентичность рассчитанному значению
SL.
В случае отсутствия ордера
Sell-типа происходит проверка наличия ордера
Buy-типа, так как в соответствии со стратегией
встречные позиции существовать не могут. Условие даже жестче - не могут
одновременно существовать ордера Buy- и
Sell-типа. Поэтому при нахождении ордера
Buy Stop он удаляется, а при нахождении
Buy - закрывается.
В итоге условием выполнения
действия по установке ордера Sell Stop является
отсутствие каких-либо ордеров, установленных советником. Успешная установка
Sell Stop приводит к возврату значения
True функцией Trade.
Соответственно, ошибка при выполнении операции влечет возврат результата
False, что означает требование повторить все действия
на текущей свече со следующим тиком.
Основные функции эксперта
рассмотрены, что делает возможным тестирование стратегии на исторических данных.Так как оптимальным графическим периодом для краткосрочных стратегий,
рассматриваемых в проекте MQLabs,считается Н1, то для получения достаточного количества сделок
потребовалось расширить привычный диапазон исторических дат с полутора до пяти с
половиной лет: 01.01.2005 - 02.07.2010. Единственным изменяемым параметром для
различных валютных пар стал TPPercent. Результаты
приведены на рис. 3 - 6.
Рис. 3. -
Результаты тестирования эксперта
Lighting на валютной паре EURUSD.
EURUSD.
Значение параметра TPPercent
равно 200. Вид кривой баланса скорее хаотичный,
чем упорядоченный. Единственный хороший признак - большая часть кривой
расположена выше значения начального депозита. Но это больше утешение, чем
конкретный хороший результат. Чистая прибыль 574 долларов против максимальной
просадки 984 доллара. Превосходство просадки над прибылью свидетельствует о
неспособности стратегии приносить стабильную прибыль в принципе. Поэтому не
стоит использовать эксперт применительно к евро.
Рис. 4. - Результаты тестирования эксперта Lighting на валютной
паре USDCHF.
USDCHF.Оптимальн
ое
значение
параметра
TPPercent = 20. Хотя говорить о настоящей оптимальности, в буквальном
понимании этого слова, не приходится. Вид кривой баланса явно показывает
нисходящее настроение эксперта: 95% кривой находится ниже уровня начального
депозита. Все это подтверждается статистическими показателями: чистая прибыль
-522 доллара при максимальной просадке 715 долларов. То есть предмета для
анализа попросту нет.
Рис.
5. - Результаты тестирования эксперта Lighting на валютной паре GBPUSD.
GBPUSD.
Значение параметра
TPPercent = 240.
Вид кривой баланса - стабильный. Для полноты картины не хватает такой же
стабильности росту кривой. Чистая прибыль 3651 доллар против максимальной
просадки 1215 долларов, фактор восстановления 3.0. К сожалению, это единственная
валютная пара, с которой возможно использовать эксперта в расчете на получение
прибыли.
Минимальный депозит для работы по системе "Молния" на валютной паре
GBPUSD потребуется в размере 3600
долларов. Но планируемая годовая доходность при этом оказывается очень
низкой - 18% годовых.
Рис. 6. - Результаты тестирования эксперта Lighting на валютной паре USDJPY.
USDJPY.Результаты показаны при
значении TPPercent = 100. Стабильность кривой баланса
такая же, как и у евро, если не хуже. О росте доходности также речь не идет.
Напротив, к концу тестирования явно обозначилась убыточная зона с уверенным и
скоротечным уменьшением депозита. Чистая прибыль -1008 долларов при максимальной
просадке 1214 долларов. То есть получается очередная система для уничтожения
денег.
В итоге напрашивается вывод о непомерной влюбчивости системы. Любимым объектом
является валютная пара GBPUSD. Все остальные
инструменты показывают отсутствие перспектив при использовании описанной
стратегии.
Доработка стратегии для
использования в AutoGraf 4.0
Стратегия "Молния" в среде
AutoGraf будет обладать всего лишь одним настроечным
параметром - TPPercent. Для него отведена переменная
AT_1, установку значения которой можно произвести при
помощи закладки "Входные параметры" при запуске приложения
AutoGraf.
Управление
объемом устанавливаемых отложенных ордеров осуществляется непосредственно с
панели настроек приложения в любой момент функционирования стратегии. Для этого
необходимо изменять значение, находящееся под надписью Lot.
Запуск
стратегии "Молния" в среде AutoGraf 4.0
состоит из следующих шагов:
Получить файл по ссылке
Файлы стратегий для AutoGraf 4.0 и распаковать полученный архив
в папку MT4\experts\libraries (с перезаписью
файлов AG_AT.ex4 и AG_AT.mq4).
Запустить AutoGraf.
Для работы стратегии в ключе приведенных
результатов
в окне настроек AutoGraf (закладка "Входные
параметры") установить правильное значение
параметра AT_1 (полное повторение результатов при
этом не гарантируется).
Выбрать
стратегию №5. Для этого необходимо передвинуть вверх значок
So и среди названий стратегий найти значок S5, который также потянуть вверх.
Запустить функцию
автоматической торговли, передвинув значок AT в верхнее положение.
Использование полученного советника
рекомендуется только в полуавтоматическом режиме под присмотром трейдера и после
всестороннего изучения слабых и сильных сторон стратегии.
Международный валютный рынок Forex (Форекс) – крупнейший внебиржевой финансовый рынок в мире. Компания Admiral Markets является Forex брокером и предлагает своим клиентам инновационные технологии трейдинга и консалтинговые услуги на рынке FOREX (Форекс), а также на рынках акций (CFD), золота, фондовых индексов и фьючерсов. Компания создана в 2001 году и на данный момент имеет разветвленную сеть филиалов в 16 странах мира, что позволяет трейдерам оперативно получать всю необходимую информацию о наших брокерских услугах на рынке валют Форекс / Forex. Торговые операции проводятся с использованием многофункционального терминала MetaTrader 4 для ПК, MT4 Mobile для КПК, MetaTrader4 Smartphone Edition, а также MetaTrader Multiterminal для управления множеством счетов одновременно. Мы предлагаем уникальную в сфере интернет-трейдинга инвестиционную услугу – золотые счета, баланс которых представлен не в валюте, а в золоте (Gold, XAU). Базовым активом депозита золотых торговых счетов является драгоценный металл (перечисленные средства в валютах автоматически конвертируются в золото). Открыть реальный или демо счет можно за 5 минут из Кабинета Трейдера. Специалистами компании Admiral Markets разработан эффективный алгоритм обучения трейдингу на рынке Forex (Форекс). Бесплатные семинары и Forex курсы проводятся во всех городах, где есть филиалы компании Admiral Markets.
Комментарии
Отправить комментарий