MQLabs: Паттерны гармонической торговли. Часть 1.

Советник  TwoSwings

Индикатор  TwoSwings

Файлы стратегий для AutoGraf 4.0

Развернутые результаты тестирования эксперта

   

    Элементы числового ряда Фибоначчи используются большинством трейдеров. Причем во многих случаях их применение ничем не обосновывается. Зачастую достаточным обоснованием выступает нахождение заветного соотношения 1.618 между двумя случайно выбранными величинами. А ведь такое соотношение движений цен на графике можно встретить довольно часто, впрочем, как и любое другое соотношение. То есть трейдеры видят то, что хотят увидеть, а не то, что происходит на самом деле.

    Выдача желаемого за действительное является одной из характерных черт человека. Противостоять соблазну получения желаемого, хотя бы мысленно, удается далеко не всем. Именно поэтому объективное восприятие жизненных ситуаций считается серьезным достоинством индивидуума. Но в своем большинстве люди воспринимают мир субъективно, что нашло отражение даже в фольклоре: "Сколько людей - столько и мнений".

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

    Как указано в самом начале статьи, речь пойдет о применении чисел Фибоначчи в торговле. Наиболее популярным приложением силы этого числового ряда выступает волновая теория Эллиотта, которую можно назвать лишь одним из способов описания возвратно-поступательных движений, так характерных для рынка. Другой трактовкой  движений, которые Эллиотт назвал волнами, является представление "волн" в виде гармонических (то есть повторяющихся) паттернов. Простейший паттерн, с которого и будет начато изучение основ гармонического анализа, состоит из двух ценовых движений - АВ и ВС (см. рис. 1).

Рис. 1. - Сигнал к совершению покупки.

    Если движение АВ - восходящее, то движение ВС обязательно должно быть нисходящим. И наоборот, если АВ - нисходящее, то ВС - восходящее. Вторым условием формирования паттерна является близость к числу 1.618 отношения стороны ВС к стороне АВ. Целью нахождения паттерна является определение оптимальной точки разворота рынка, в которой можно произвести открытие сделки по очень хорошей цене - минимальной для покупки и максимальной для продажи.

    Огромным минусом паттерна можно назвать тот факт, что на любом графике всегда можно найти два разнонаправленных движения, которые будут отлично вписываться в предложенные условия, к тому же, очень точно будут давать заветное расширение 1.618. Для решения этой проблемы достаточно прибегнуть к помощи осцилляторов. Например, индикатор RSI (индекс относительной силы) довольно точно может показывать перепроданность и перекупленность рынка. Этим его свойством и необходимо воспользоваться для определения начальной точки, от которой будет производиться поиск паттерна.

    На рис. 1 показано, что первичным сигналом для поиска нисходящего паттерна является формирование локального минимума RSI ниже зоны перепроданности (уровень 30). Это точка С будущего паттерна. Дальнейший алгоритм сводится к следующему. Начиная от точки С, отсчитывается некоторое количество баров, среди которых находятся максимальное и минимальное значения. Для формирования нисходящего паттерна минимум должен находиться дальше от точки С, чем максимум.

    Отсчитываемое количество баров не является константой, а подбирается эмпирически для каждого конкретного случая. Начинается все с числа 2. То есть горизонтальный канал состоит всего лишь из двух баров. Сначала находится максимум канала (точка В), а от точки В и до конца канала - минимум (точка А). Найденные значения  сопоставляются и, если искомое соотношение 1.618 не получается, то совершается переход к следующей итерации, на которой канал состоит уже из трех баров. Таким образом, канал растет в длину до тех пор, пока отношение ВС к АВ не будет близким к 1.618.

    Следующим этапом в ликвидации субъективизма, будет определение "близости" числа к 1.618. Ведь, оперируя миллионами, можно сказать, что 10 - достаточно близкое к 1.618 число. Поэтому необходимо наличие некоторого интервала, числа из которого будут считаться близкими к 1.618. В ситуации, представленной на рис. 1, интервал включает диапазон значений от 1.618 до 2.0. В итоге получается некий треугольник, в котором самой ценной информацией является длина стороны ВС. Именно от нее производятся все дальнейшие расчеты - уровни фиксации прибыли и принятия убытков.

Рис. 2. - Сигнал к совершению продажи.

    На рис. 2 представлена обратная ситуация. Осциллятор RSI находился в зоне перекупленности и сформировал локальный максимум. Это точка С. От нее начинается отсчет длины горизонтального канала. Условие чередования максимума и минимума также будет обратным, так как паттерн должен быть восходящим. Поэтому ближе к точке С должен располагаться минимум (точка В), а потом уже максимум (точка А). Для этого последовательно увеличивается длина горизонтального канала, в котором первым находится минимум, а от минимума до окончания канала - максимум.

    Снова из найденного паттерна используется только длина ВС, на основании которой вычисляются цель и страховка короткой сделки.

    К слову, паттерн может оказаться достаточно растянутым во времени или вовсе может быть не найден на доступной истории. Чтобы не впадать в крайности, временная протяженность паттерна будет ограничена 250 барами. Таким образом, если при получении сигнала от RSI паттерн так и не был найден на ближайших 250 барах, то сигнал открытия сделки отменяется.

    Для облегчения операций поиска паттерна стоит использовать индикатор TwoSwings, при помощи входных параметров которого можно изменять условия формирования паттерна:

  • RSIPeriod - период индикатора RSI в барах. Любое число больше 1. По умолчанию 14.

  • RSIHighLevel - минимальное значение зоны перекупленности. Любое число от 0 до 100. По умолчанию 70.

  • RSILowLevel - максимальное значение зоны перепроданности. Любое число от 0 до 100, но меньшее, чем RSIHighLevel. По умолчанию 30.

  • BCtoABFrom - минимальное отношение стороны ВС к АВ. Любое положительное число. По умолчанию 1.618.

  • BCtoABTo - максимальное отношение стороны ВС к АВ. Любое положительное число, большее, чем BCtoABFrom. По умолчанию 2.0.

    Подобные входные параметры (и в той же последовательности) имеются у эксперта TwoSwings, реализующий описанные принципы торговли. К ним добавлено два параметра - StopLoss и TakeProfit. С их помощью пользователь может указывать величину стопа и профита соответственно, выраженную в длинах стороны ВС. То есть значения 1, установленные по умолчанию, определяют точное равенство параметров ордера длине движения ВС.

    Определение сигналов и поиск паттернов возложено на функцию GetSignal:

 
//+-------------------------------------------------------------------------------------+
 //| Генерация сигналов покупки и продажи                                                |
 //+-------------------------------------------------------------------------------------+
 void GetSignal()
 {
  Signal = 0;
  
 // - 1 - ========================== Поиск ближайшего паттерна АВС ======================= 
  int i = 2;                                                 // Начинается со второго бара
  while (i < Bars)
    {
     // - 1.1 - ======================= Поиск локального экстремума RSI ==================
     int Ext = RSIExtremum(i);
     if (Ext == -1)                   // Ни один экстремум не найден - отключение эксперта
       {
        Alert("На доступной истории не найден ни один свинг!");
        Activate = False;
        return(0);         
       }
     // - 1.1 - ============================ Окончание блока =============================
 
     // - 1.2 - ======================= Поиск свинга АВС после экстремума RSI ============
     i = MathFloor(Ext/2.0) + 1;   // Формирование значения для перехода к следующему бару
     int Res = FindMaxMin(Ext);                                            // Поиск свинга
     if (Res != 0)             // Если свинг найден, то он отображается и цикл прерывается
       { 
        if (IsVisualMode() || !IsTesting()) ShowPattern(Res);
        break;
       }  
     // - 1.2 - ============================ Окончание блока =============================
     
       // Если свинг не найден, то происходит переход к следующей итерации цикла с поиском
       // следующего экстремума RSI
    }
 // - 1 - ================================= Окончание блока ==============================
    
  if (i == Bars) return(0);             // На всей истории не найден ни один свинг - выход
 
 // - 2 - ========================== Обработка восходящего паттерна ====================== 
  if (Res == 1)
    {
     Target = Open[Begin] + (HighV - LowBeg)*TakeProfit;             // Расчет уровня цели
     Stop = MathMax(Open[Begin] - (HighV - LowBeg)*StopLoss, 0);    // Расчет уровня стопа
     if (i == 3 || (Bid <= Open[Begin] &&    // Сигнал должен быть "свежим" или, по крайней
         Low[iLowest(NULL, 0, MODE_LOW, i-1)] > Stop &&         // мере, текущая цена ниже
         High[iHighest(NULL, 0, MODE_HIGH, i-1)] < Target))      // начальной цены сигнала
                                   // также проверяется достижение уровней стопа и профита
       Signal = 1;                                                       // сигнал покупки
    }  
 // - 2 - ================================= Окончание блока ==============================
 
 // - 3 - ========================== Обработка нисходящего паттерна ====================== 
  if (Res == -1)
    {
     Target = MathMax(Open[Begin] - (HighBeg - LowV)*TakeProfit, 0); // Расчет уровня цели
     Stop = Open[Begin] + (HighBeg - LowV)*StopLoss;                // Расчет уровня стопа
     if (i == 3 || (Bid >= Open[Begin] &&   // Сигнал должен быть "свежим" или, по крайней
         Low[iLowest(NULL, 0, MODE_LOW, i-1)] > Target &&       // мере, текущая цена выше
         High[iHighest(NULL, 0, MODE_HIGH, i-1)] < Stop))        // начальной цены сигнала
                                   // также проверяется достижение уровней стопа и профита
       Signal = -1;                                                      // Сигнал продажи
    }  
 // - 3 - ================================= Окончание блока ==============================
 }
 
 

    Блок 1 функции производит поиск ближайшего локального экстремума RSI, а следом за ним - паттерна. Блоки 2 и 3 генерируют сигнал покупки и продажи соответственно. При этом вычисляются уровни профита и стопа для каждого из типов ордеров.

    Поиск ближайшего экстремума RSI в блоке 1 выполняется в теле вложенного блока 1.1. Для этого совершается вызов функции RSIExtremum, которой передается номер начального бара поиска. В случае отсутствия на доступной истории локального экстремума в зоне перекупленности или перепроданности функция вернет отрицательный результат, а дальнейшие команды отключат советник. Любой положительный результат соответствует успешному поиску. Четное значение свидетельствует о нахождении максимума, а нечетное - о нахождении минимума.

    Поиск паттерна после найденного экстремума RSI осуществляется при помощи вызова функции FindMaxMin, которой передается результат RSIExtremum. Результат выполнения функции FindMaxMin может принимать только три значения: 0 - паттерн не найден, 1 - найден нисходящий паттерн (сигнал для покупки), -1 - найден восходящий паттерн (сигнал для продажи). Если паттерн не найден, то произойдет переход к следующей итерации цикла, которая начнется со следующего за экстремумом RSI баром.

    Точки А, В и С найденного паттерна будут характеризоваться значениями цены, заложенной в переменных HighV, LowV, HighBeg и LowBeg. Например, в случае нахождения восходящего паттерна, точке А ставится в соответствие значение HighV, точке В - LowV, а точке С - HighBeg. Для нисходящего паттерна точка А - LowV, B - HighV, C - LowBeg. Номера баров хранятся в переменных HighN, LowN и Begin.

    Если возвращенное FindMaxMin значение не равно нулю, то будет отображен паттерн (функция ShowPattern) и прерван цикл while. При положительном значении результата выполнится блок 2, который сгенерирует сигнал покупки, а при отрицательном - блок 3, который сгенерирует сигнал продажи. Если сигнал "не свежий", то есть поступил несколько баров назад, то флаг Signal примет соответствующее для подачи сигнала положение только в том случае, если текущая цена лучше по отношению к начальной, а за время, прошедшее после получения сигнала, не были достигнуты уровни стопа или профита.

     Алгоритм функции поиска экстремума RSI довольно прост:    

 
//+-------------------------------------------------------------------------------------+
 //| Поиск локального экстремума RSI в зонах перекупленности/перепроданности             |
 //+-------------------------------------------------------------------------------------+
 int RSIExtremum(int NB)
 {
 // - 1 - =========================== Получение начальных значений =======================
  double PrevRSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, NB-1);
  double CurRSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, NB);
 // - 1 - =============================== Окончание блока ================================
 
 // - 2 - =========================== Поиск вершины или впадины RSI ======================
  for (int i = NB; i < Bars-1; i++)
    {
     double NextRSI = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i+1);
     if (CurRSI > NextRSI && CurRSI > RSIHighLevel && CurRSI > PrevRSI)  // при нахождении
       return(i*2);// максимума возвращается четное значение, которое соответствует номеру
                                                                //  бара, умноженному на 2
     if (CurRSI < NextRSI && CurRSI < RSILowLevel && CurRSI < PrevRSI)   // при нахождении
       return(i*2 + 1);  // минимума возвращается нечетное значение, которое соответствует
                                        // номеру бара, умноженному на 2, с прибавлением 1
     PrevRSI = CurRSI;
     CurRSI = NextRSI;
    }
 // - 2 - =============================== Окончание блока ================================
    
  return(-1);        // На всей доступной истории нет значений RSI в зонах перекупленности
                                                                    // или перепроданности
 }

    Входной параметр NB указывает начальный бар, с которого необходимо начать поиск.   

    В цикле, начиная со значения NB и заканчивая полным количеством баров Bars, производится поиск значения RSI ниже 30 или выше 70. При этом должна быть сформирована вершина или впадина. При выполнении такого условия, цикл, а вместе с ним и функция, прерываются. Функция должна вернуть номер бара, на котором найден экстремум и указать тип экстремума (минимум или максимум). Вся эта информация передается одним значением. Номер бара умножается на 2 при нахождении максимума. При нахождении минимума к удвоенному значению прибавляется 1. В результате по четности числа можно определить тип экстремума.

    Если экстремум найти не удалось, то функция возвращает результат -1.

    После поиска экстремума RSI происходит вызов функции FindMaxMin для поиска паттерна:

 
//+-------------------------------------------------------------------------------------+
 //| Поиск локальных минимума и максимума после получения сигнала от RSI                 |
 //+-------------------------------------------------------------------------------------+
 int FindMaxMin(int Ext)
 {
 // - 1 - ======================= Сохранение параметров начального бара ==================
  Begin = MathFloor(Ext/2.0);//Номер бара, на котором зафиксирован локальный экстремум RSI
  HighBeg = High[Begin];                                       // Максимум начального бара
  LowBeg = Low[Begin];                                          // Минимум начального бара
 // - 1 - =============================== Окончание блока ================================
 
 // - 2 - ===== Поиск минимума и максимума для расчета первичного свинга =================
  for (int i = 2; i < MathMin(Bars - Begin, 250); i++)
    {
     // - 2.1 - ================== Поиск нисходящего первичного свинга ===================
     if (MathMod(Ext, 2) == 0)    // Если у RSI зафиксирован максимум, то необходимо найти
       {                                                            // нисходящий свинг AB
        LowN = iLowest(NULL, 0, MODE_LOW, i, Begin);        // сначала подбирается минимум
        HighN = iHighest(NULL, 0, MODE_HIGH, i+Begin-LowN, LowN);    // от него - максимум
        HighV = High[HighN];
        LowV = Low[LowN];
        if (HighN > LowN && HighN != i+Begin-1)   // минимум обязательно должен быть позже 
          if ((HighBeg - LowV)/(HighV - LowV) >= BCtoABFrom &&    // отношение свинга BC к
              (HighBeg - LowV)/(HighV - LowV) <= BCtoABTo)         // свингу АВ - заданное 
            return(-1);            // Нисходящий свинг найден, т. о. есть сигнал к продаже
       }
     // - 2.1 - ============================ Окончание блока =============================
 
     // - 2.2 - ================== Поиск восходящего первичного свинга ===================
      else     // Если у RSI зафиксирован минимум, то необходимо найти восходящий свинг АВ
       {
        HighN = iHighest(NULL, 0, MODE_HIGH, i, Begin);    // сначала подбирается максимум
        LowN = iLowest(NULL, 0, MODE_LOW, i+Begin-HighN, HighN);      // от него - минимум
        HighV = High[HighN];
        LowV = Low[LowN];
        if (LowN > HighN && LowN != i+Begin-1)   // максимум обязательно должен быть позже
          if ((HighV - LowBeg)/(HighV - LowV) >= BCtoABFrom &&    // отношение свинга BC к
              (HighV - LowBeg)/(HighV - LowV) <= BCtoABTo)         // свингу АВ - заданное
            return(1);             // Восходящий свинг найден, т. о. есть сигнал к покупке
       }   
     // - 2.2 - ============================ Окончание блока =============================
    }
 // - 2 - =============================== Окончание блока ================================
  return(0);  
 }

    В первом блоке сразу же формируются параметры точки С, которые вычисляются на основании единственного входного параметра Ext. Значение Ext - это результат выполнения функции RSIExtremum. Чтобы получить из Ext номер бара,  на котором зафиксирован последний экстремум RSI, достаточно разделить значение Ext на 2 без остатка. Это и будет значение Begin. HighBeg и LowBeg - экстремумы бара Begin.

    Второй блок осуществляет поиск паттерна. В зависимости от значения Ext, ищется восходящий или нисходящий паттерн. Если Ext - четное, то  выполняется вложенный блок 2.1, производящий поиск восходящего паттерна (первичный свинг - нисходящий), если Ext - нечетное, то выполняется блок 2.2, где происходит поиск нисходящего паттерна (первичный свинг - восходящий).

    Паттерн находится из растущего горизонтального канала, длина которого задается значением переменной цикла i. Сначала вычисляется один экстремум канала (для нисходящего свинга - минимум LowN, для восходящего свинга - максимум HighN). От него и до конца канала находится второй экстремум (для нисходящего свинга - HighN, для восходящего - LowN). Условием формирования паттерна является нахождение экстремумов внутри канала, а не на его границах, и "правильное" отношение стороны BC к АВ, которое должно лежать в пределах от BCtoABFrom до BCtoABTo.

    Успешный поиск паттерна венчает возврат значения 1 или -1, а неудачное завершение поиска приводит к возврату 0.

   Оставшиеся функции ShowPattern, Trade и start не представляют особых трудностей в понимании, поэтому рассматриваться не будут. Это позволяет перейти к тестированию советника на исторических данных.

    Рекомендуемый таймфрейм для описанной стратегии D1, но в таком случае всей имеющейся истории не хватает для формирования репрезентативной выборки - 200 сделок. Поэтому таймфрейм уменьшен до Н1. Даже для такого таймфрейма потребовалось использование большой части истории - с 01.01.2007 до 23.05.2010 (сделок не хватало для USDJPY).

    Три из восьми имеющихся настроечных параметров брались различными для каждой из валютных пар. Это RSIPeriod, StopLoss и TakeProfit. Остальные параметры взяты равными по умолчанию: Lots = 0.1, RSIHighLevel = 70, RSILowLevel = 30, BCtoABFrom = 1.618, BCtoABTo = 2.0. Результаты тестирования приведены на рис. 3 - 6.

                Рис. 3. - Результаты тестирования эксперта TwoSwings на валютной паре EURUSD.

EURUSD. Значения изменяемых параметров были взяты такие: RSIPeriod = 7, StopLoss = 0.5, TakeProfit = 1.4. Кривая баланса, хоть и заканчивается на мажорной ноте, больше похожа на американские горки. При таком стиле торговли очень быстро становятся постоянными клиентами кардиологических клиник. Чистая прибыль 2980 долларов при максимальной просадке 1902 доллара. Также стоит учитывать, что прибыль сформирована в течение трех лет. А для трех лет 3000 пунктов - очень мало.

                Рис. 4. - Результаты тестирования эксперта TwoSwings на валютной паре USDCHF.

USDCHF. Оптимальные параметры для франка такие: RSIPeriod = 16, StopLoss = 0.5, TakeProfit = 1.2. Кривая баланса уже не похожа на американские горки и, на первый взгляд, стабильна. Но вот равномерности роста ей явно не хватает. В результате ожидание прибыли заняло два года, в течение которых торговля велась с переменным успехом. Лишь 2009 год принес ощутимую прибыль и с тех пор вновь наблюдается полоса убытков. Чистая прибыль 4432 доллара, максимальная просадка 1474 доллара. Фактор восстановления выходит средний - 3.01. По нему ориентироваться уже можно. Но о реальном использовании стратегии стоит серьезно задуматься. Ведь снова может подстерегать длительный этап с ожиданием прибыли.

Для интереса можно посчитать. Минимальный депозит - 4400 долларов. Среднемесячная доходность (41 месяц) - 108.1 доллара. Годовая доходность - 1297.17. То есть средний годовой процент - 29. Это довольно низкий показатель. С учетом рискованности рыночной торговли выгоднее положить деньги в банк.

                      Рис. 5. - Результаты тестирования эксперта TwoSwings на валютной паре GBPUSD.

GBPUSD. Входные параметры эксперта: RSIPeriod = 15, StopLoss = 0.5, TakeProfit = 0.6. Кривая баланса не имеет ярко выраженного направления. Скачок вверх в течение последних восьмидесяти сделок не должен вводить в заблуждение. Это скорее случайность, чем закономерность. Вполне возможно, что в ближайшем будущем ожидается такой же скачок, но только вниз. Чистая прибыль 2200 долларов при максимальной просадке 2371 доллар, что не дает даже единичного фактора восстановления. Поэтому с уверенностью можно говорить о бесперспективности стратегии касательно фунта.

                        Рис. 6. - Результаты тестирования эксперта TwoSwings на валютной паре USDJPY.

USDJPY.  Результаты показаны при параметрах: RSIPeriod = 15, StopLoss = 1.3, TakeProfit = 0.6. Кривая баланса имеет самый равномерный рост из всех ранее рассмотренных, если, конечно, можно так выразиться. Возможно, причиной этому самое низкое количество сделок. Но даже такой сомнительной стабильности не хватило на весь период тестирования. Все, чему можно "порадоваться", это 120 из 202 сделок роста. Чистая прибыль 2708 долларов, максимальная просадка 1633 доллара. В итоге фактор восстановления не доходит даже до двух - 1.66, что очень мало для реального вложения денег.

Стратегия, на первый взгляд, смотрится свежо и достаточно оригинально, но "не все то золото, что блестит". Результаты тестов наглядно доказали, что система является достаточно сырой для реального использования. Возможно, виной этому выбор простейшего паттерна гармонического анализа. О правильности такого предположения можно будет судить после рассмотрения других паттернов, таких как паттерн Гартли, паттерн "Летучая мышь" и т. д. Об этом можно будет прочитать в следующих статьях, посвященных гармоническому анализу.

 Доработка стратегии для использования в AutoGraf 4.0

    Стратегия TwoSwings для AutoGraf 4.0 будет использовать семь входных параметров, которые являются аналогами входных параметров эксперта TwoSwings_Expert. Единственная внешняя переменная, которой не требуется перенесение в настройки AG, это Lots. Указание объема сделки в среде AutoGraf осуществляется при помощи панели настроек, находящейся в нижней части графика.

     Все остальные внешние переменные получают свои места среди параметров AT_1 - AT_7. Для RSIPeriod аналогом будет выступать AT_1, для RSIHighLevel - AT_2, для RSILowLevel - AT_3, для BCtoABFrom - AT_4, для BCtoABTo - AT_5, для StopLoss - AT_6, для TakeProfit - AT_7.

     Запуск стратегии TwoSwings в среде AutoGraf 4.0 состоит из следующих шагов:

  • Получить файл по ссылке Файлы стратегий для AutoGraf 4.0 и распаковать полученный архив в папку MT4\experts\libraries (с перезаписью файлов AG_AT.ex4 и AG_AT.mq4).

  •  Запустить AutoGraf.

  •  Для работы советника в ключе приведенных результатов в окне настроек AutoGraf (закладка "Входные параметры") выставить правильные значения параметров AT_1 -  AT_7 (полное повторение результатов при этом не гарантируется).

  • Выбрать стратегию №5. Для этого необходимо передвинуть вверх значок So и среди названий стратегий найти значок S5, который также потянуть вверх.

  • Запустить функцию автоматической торговли, передвинув значок AT в верхнее положение.

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

 

Игорь Герасько

Май 2010

Специально для компании Admiral Markets

0
 
 
Share |

Комментарии

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Проверка на СПАМ:
  _   _  __   __ __        __   ___    _   _   _         
| \ | | \ \ / / \ \ / / / _ \ | \ | | / | __ __
| \| | \ V / \ \ /\ / / | | | | | \| | | | \ \ / /
| |\ | | | \ V V / | |_| | | |\ | | | \ V /
|_| \_| |_| \_/\_/ \__\_\ |_| \_| |_| \_/
Enter the code depicted in ASCII art style.
Общие вопросы
info@admiralmarkets.com.ua
Техническая поддержка
support@admiralmarkets.com.ua
Необходимые файлы и документы
Филиальная сеть
Условия перепечатки материалов с сайта
Уведомление о рисках
Карта сайтаКарта сайта
Политика конфиденциальности