Для того, чтобы использовать все возможности сайта, мы рекомендуем Вам person_addЗарегистрироваться или personВойти

date_range Добавлено: 11.05.2018

date_range Обновлено:

remove_red_eyeПросмотров: 313

dashboardКатегория: Наши советники и утилиты

merge_typeТип: Универсальный торговый советник

open_withОсобенности: Открытый код советника

computerТерминал: МТ4 и МТ5

cloudсвоей, шагов, для, программирования, 10, стратегии!, The, X:


Читать The X: 10 шагов для программирования своей стратегии!

Описание

The X: 10 шагов для программирования своей стратегии!

Это наиболее частая фраза в поисковых запросах. 

The X - это конструктор торговых стратегий.

Мы создали советник, который имеет все самые интересные и нужные функции. И добавили блок сигналов в виде стандартных индикаторов.

Это был проект, который стал очень популярный. На протяжении 5 лет мы дорабатывали алгоритм, добавляли новые функции, новые индикаторы. Исправляли ошибки в функциях. 

Эта статья поможет Вам в программировании своей стратегии. Программирование советника по индикаторам. Добавление новых сигналов и фильтров. 

Открытый код

Очень частым вопросом к нам был вопрос : 

  1. Можно ли встроить свои индикаторы в советник?
  2. Сколько стоит открытый код советника? 

Не секрет, что у нас есть открытый (Исходный) код нашего советника в продаже. Это сделано для тех трейдеров, которые желают самостоятельно написать советник или встроить свои сигналы. 

Также часто трейдеры покупают открытый код для того, чтобы внедрить свою секретную стратегию и перепродать советник. 

  1. Открытый код советника The X можно купить в нашем маркете торговых советников
  2. Открытый код The X для MetaTrader5
  3. Открытый код The X для MetaTrader4
  4. Кстати, У нас есть много открытых кодов наших советников. Раздел: Советники по стратегиям (Открытый код)

Программирование советников по индикаторам это достаточно трудоемкий процесс. 

Мы предоставляем услуги по программированию торговых советников. Но процесс написания торгового советника каждый раз затягивается из-за того, что заказчик (клиент) не имеет представления о том, какие функции ему нужны. 

The X - это комплекс блоков и функций для торговли на FOREX, которые используются по всему миру. Мы создали функции, которые используются наиболее часто. Таким образом, советник может реализовать 90 % нужд каждого трейдера. 

Естественно, что существуют уникальные стратегии, которые должны программироваться опытными программистами.

Такие стратегии очень редкие и требуют тщательной подготовки. Стоимость такой работы зависит от сложности. 

Реальная стоимость нашего советника

Если отталкиваться от нашей статьи о том, Сколько стоит работа у программиста, тогда можем посчитать примерную стоимость нашего торгового робота The X:

В нашем советнике более 10 000 строк кода. Это немного. Но обусловлено тем, что мы не пишем советники на ООП. Почему? с ООП вы не знакомы! и Вам будет очень трудно разобраться с ООП!

Итак, посчитаем:

  1. Стоимость 1 часа работы программиста = 20 $ при программировании функций и алгоритмов!
  2. Стоимость 1 часа исправления ошибок = 5 $.
  3. Стоимость написания текстов и видео = 10 $ (Цена взята с интернета, все инструкции и видео я делаю сам).
  4. Предположим, что написание функций и блоков на The X у нас ушло более 1000 часов! 
  5. Программирование сигналов по индикаторам очень легкое занятие. Поэтому будем считать, что на это у нас ушло 10 часов! 

Но есть пункты, которые невозможно выполнить сразу: 

  1. Отладка функций, на это может уйти еще 1000 часов! 
  2. Составление инструкций, видео, продвижение, на это также уходит 1000 часов времени!

Итого мы имеем более 3000 часов потраченного времени! 

Если бы нам заказали такой алгоритм, мы бы отказались. Это не разумно и не выгодно. 

Итоговая стоимость такого советника (на заказ) более 35 000 $! Но наш советник продается в 10 раз дешевле!!!!

Стоимость нашего открытого кода в ДЕСЯТКИ раз меньше!

Такие заказы никогда не выполняются:

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

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

Отладка всех блоков и функций требует повышенного времени. 

Мы очень благодарны нашим клиентам, которые находили ошибки и исправления на протяжении 5 лет, предлагали свои функции и индикаторы для работы советника THE X

 

Программирование своей стратегии торговли на Форекс

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

Вам не нужно вникать в работу всех функций. Вам это не нужно. Вы можете запрограммировать свою стратегии всего за 10 шагов. 

Мы подготовили для Вас очень удобный способ работы с нашим открытым кодом. 

Помните: Мы не программируем стратегии для советника бесплатно. Если Вы хотите , чтобы написали Вам код по Вашей стратегии - обращайтесь в раздел Программирование на заказ!

 

Первые шаги:

  1. Откройте наш исходный код советника, который Вы купили в нашем маркете советников;
  2. Нажмите сочетание клавиш Ctrl+F и вы увидите строку поиска;
  3. Введите название Step - По этому слову, в нашем исходном коде, Вы сможете ориентироваться и быстро написать свою стратегию. 
  4. Каждый шаг комментирован и содержит пример
  5. Для того,чтобы научиться программировать свою стратегию, Вы можете поэтапно раскомментировать строки с звездочкой //* 

Всего в открытом коде существует 10 шагов для того, чтобы советник работал по вашим индикаторам. 

Мы разберем каждый шаг подробно!

Из-за того, что программирование отличается в двух версиях терминала МТ4 и МТ5 , мы также разделим нашу статью на две части:

 

 

Если Ваша версия советника THE X для терминала MT4, Вы можете сразу перейти к разделу программирования The X для терминала Метатрейдер 4 

Программирование THE X для MetaTrader 5

Вы должны знать минимальные правила программирования для того, чтобы написать свою стратегию Или добавить готовую стратегию по индикаторам с готового файла (Советники с интернета, например)

Программирование советников для MetaTrader 5 сложнее, чем программирование для MetaTrader 4. Но терминал МТ5 позволяет создать более мощные стратегии, а также обладает более продвинутым тестером стратегий. 

В любом случае, Вы должны купить тот открытый код, на котором терминале будете работать. 

 

MetaTrader 5 Шаг 0: Шаг загрузки индикаторов в ресурсы!

// Step 0 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Для того,чтобы при компиляции, индикатор был встроен в советник, Вам необходимо загрузить его в ресурсы советника
// In order for the indicator to be built into the Expert Advisor during compilation, you need to load it into the resources of the Expert Advisor
// ####################################################################
// for example:
//* #resource "\\Indicators\\Examples\\MACD.ex5"
// ###########################################################################

Здесь мы обязаны добавить , нужные Нам, индикаторы в ресурсы. 

Это позволит компилировать советник для маркета , а также избавит нас от лишних проблем, когда компилированный советник вдруг не найдет нужный индикатор на другом компьютере! 

Правила написания имени маркета: Полное название папок, начиная с Indicators!

Папка обозначается \\

Например:

Если путь к Вашему индикатору выглядит так:

C:\ROBO MT5\MQL5\Indicators\Examples\MACD.ex5

тогда путь к этому индикатору в языке программирования записывается так:

"\\Indicators\\Examples\\MACD.ex5"

 

MetaTrader 5 Шаг 1: Шаг указания имени сигнала!

   // Step 1 ####################################################################
   // Эта часть кода для программирования своей стратегии в открытом коде
   // This part of the code for programming your strategy in open source
   //
   // Введите название своего сигнала после //
   // Enter the name of your signal after //
   // ####################################################################
   // for example:  
   //* Custom=77,//Signal For open source
   // ############################################################################

На этом шаге мы должны внести наш сигнал или стратегию в список возможных сигналов советника.

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

Например:

  1. Вы хотите назвать свою стратегию MY STRATEGY
  2. Номер стратегии также должен быть уникальным. Первые 22 номера заняты сигналами от стандартных индикаторов! Запомните эту цифру, она понадобиться нам в дальнейшем.
  3. Имя также должно быть уникальным. Например: MYSTRATEGY1

В итоге мы должны записать в коде так:

MYSTRATEGY1=77,//MY STRATEGY

Вы также можете добавить еще стратегий, и написать, например, так:

  1. MYSTRATEGY1=77,//MY STRATEGY a
  2. MYSTRATEGY2=78,//MY STRATEGY b
  3. MYSTRATEGY3=79,//MY STRATEGY с

MetaTrader 5 Шаг 2: Шаг указания имени сигнала для вывода имени на экран!

//  Step 2 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Введите название своего сигнала, которое будет отображатся на экране. после //
// Enter the name of your signal, which will be displayed on the screen. after//
// ####################################################################
// for example:  
//* if(i==77)s1="Custom";
// ###########################################################################

Этот шаг служит для того, чтобы название вашей стратегии отображалось в нашей панели для советника EApadpro

Сложного ничего нет! Но вы должны использовать цифры с прошлого шага.

Например:

  1. if(i==77)s1="My1";
  2. if(i==78)s1="My2";
  3. if(i==79)s1="My3";

 

MetaTrader 5 Шаг 3: Шаг указания имени фильтра!

   // Step 3 ####################################################################
   // Эта часть кода для программирования своей стратегии в открытом коде
   // This part of the code for programming your strategy in open source
   // 
   // Введите название своего фильтра после //
   // Enter the name of your filter after //
   // ####################################################################
   // for example:  
   //* FILTERCustom=77,//Filter For open source
   // ###########################################################################

На этом шаге мы должны внести наш фильтр в список возможных фильтров советника.

Это делается для того, чтобы было удобно управлять фильтрами на этапе настройки эксперта. 

Обычно: Фильтр использует тот же индикатор, что и сигнал, но с тем условием, что Фильтр определяет текущее положение сигнала, а Сигнал является фактом совершения сигнала. Примеры отличия фильтров и сигналов

Например:

  1. Вы хотите назвать свой фильтр MY FILTER
  2. Номер фильтра также должен быть такой же, как и номер стратегии (Это сделано для того, чтобы в дальнейшем не путаться в цифрах). Первые 22 номера заняты фильтрами от стандартных индикаторов! Запомните эту цифру, она понадобиться нам в дальнейшем.
  3. Имя также должно быть уникальным. Например: MYFILTER1

В итоге мы должны записать в коде так:

MYFILTER1=77,//MY FILTER

Вы также можете добавить еще стратегий, и написать, например, так:

  1. MYFILTER1=77,//MY FILTER a
  2. MYFILTER2=78,//MY FILTER b
  3. MYFILTER3=79,//MY FILTER с

MetaTrader 5 Шаг 4: Шаг указания параметров индикатора или стратегии в внешних переменных!

   // Step 4 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Укажите все внешние переменные Вашего индикатора или индикаторов, которые будут использоваться в вашей стратегии
// Write all external variables of your indicator or indicators that will be used in your strategy
// ####################################################################
// for example:
//* input string IndicatorName ="-------- Custom Indicator ----------------";
//* input int                        CUSTOMMAFastPeriod=1;
//* input int                        CUSTOMMASlowPeriod=100;
//* input ENUM_APPLIED_PRICE         CUSTOMMAprice=PRICE_CLOSE;
// ###########################################################################

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

Также сюда можно вынести особые параметры стратегии. Например, уровни пересечения линий, ограничение срабатывания индикатора по МАКС и МИН цене на графике и так далее...

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

MetaTrader 5 Шаг 5: Шаг создания хендлов индикаторов, для загрузки в советник!

            // Step 5 ####################################################################
            // Эта часть кода для программирования своей стратегии в открытом коде
            // This part of the code for programming your strategy in open source
            // 
            // Вам необходимо создать запись в массиве для того, чтобы советник присвоил хендл индикатора при инициализации
            // You need to create an entry in the array in order for the Expert Advisor to assign an indicator handle when initializing
            // ####################################################################
            // for example:
            //* case 77:
            //* h_custom[tf_num][sym_num]=iCustom(array_symbol,array_tf,"::Indicators\\Examples\\MACD",CUSTOMMAFastPeriod,CUSTOMMASlowPeriod,9,CUSTOMMAprice);
            //*            if(h_custom[tf_num][sym_num]==INVALID_HANDLE)
            //*              {
            //*               PrintToLogs(" Не удалось получить хендл индикатора MACD");
            //*               return(INIT_FAILED);
            //*              }
            // ###########################################################################

Этот шаг нужен для того, чтобы наши индикаторы загружались 1 раз при инициализации советника. В MetaTrader 5 нет необходимости в том, чтобы постоянно загружать индикатор на график.

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

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

Помните, что мы загрузили индикатор в ресурсы советника. Поэтому вызывать индикатор мы будем из ресурсов! 

Вы можете почитать справку о вызове индикаторов через iCustom

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

По нашим примерам выше нам нужно сделать так:

  case 77:h_custom[tf_num][sym_num]=iCustom(array_symbol,array_tf,"::Indicators\\Examples\\MACD",CUSTOMMAFastPeriod,CUSTOMMASlowPeriod,9,CUSTOMMAprice);
 if(h_custom[tf_num][sym_num]==INVALID_HANDLE)
 {
 PrintToLogs(" Не удалось получить хендл индикатора MACD");
 return(INIT_FAILED);
 }
 break;

Здесь я специально указал только два внешних параметра, 3 параметр этого индикатора InpSignalSMA я заменил цифрой по умолчанию для того, чтобы Вы понимали суть программирования! 

По аналогии выше, Вы можете добавить несколько индикаторов и хендлов. 

Если в стратегии используется несколько индикаторов, тогда нужно писать несколько индикаторов.

Например:

  case 77:h_custom[tf_num][sym_num]=iCustom(array_symbol,array_tf,"::Indicators\\Examples\\MACD",CUSTOMMAFastPeriod,CUSTOMMASlowPeriod,9,CUSTOMMAprice);
 h_custom2[tf_num][sym_num]=iCustom(array_symbol,array_tf,"::Indicators\\Examples\\MACD",CUSTOMMAFastPeriod,CUSTOMMASlowPeriod,15,CUSTOMMAprice);
 if(h_custom[tf_num][sym_num]==INVALID_HANDLE|| h_custom2[tf_num][sym_num]==INVALID_HANDLE)
 {
 PrintToLogs(" Не удалось получить хендл индикатора MACD");
 return(INIT_FAILED);
 }
 break;

 

Также и с другими стратегиями, которые вы хотите вставить в советника!

 

MetaTrader 5 Шаг 6: Шаг объявления переменных для хранения хендлов индикаторов стратегии!

// Step 6 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// обьявите переменную массива хендлов
// Declare the variable of the handle array
// ####################################################################
// for example:
//* int h_custom[6][12];
//* int h_custom2[6][12];
// ###########################################################################

Здесь мы просто указываем названия наших хендлов, которые создавали выше! 

Сложного здесь ничего нет. 

Хендлы создаются в виде массивов для того, чтобы использовать мультивалютность в советнике и использоваться возможность указания сразу 6 сигналов или фильтров!

 

MetaTrader 5 Шаг 7: Шаг объявления переменных для хранения данных индикаторов!

// Step 7 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// обьявите переменную массива значений индикатора
// Declare the variable of the handle array
// ####################################################################
// for example:
//* double custom1_buffer[];
//* double custom2_buffer[];
// ###########################################################################

Здесь мы просто указываем названия наших данных для буферов! 

Сложного здесь ничего нет. 

В этих массивах будут хранится данные о значениях индикатора на каждом баре. Если Вам нужно использовать несколько буферов, Вы можете использовать несколько переменных.

В нашем случае, для примера, нам нужно 2 буфера, для сигнальной и главной линии индикатора MACD

MetaTrader 5 Шаг 8: Главный шаг создания стратегии и сигналов для открытия позиций!

// Step 8 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш сигнал для открытия позиций. Заполняем буферы данных
// Here we create our signal for opening positions. Fill in the data buffer
// ####################################################################
// for example:
//*   if(sigInd==77)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      1.
//*         if(CopyBuffer(h_custom[array_tf][array_symbol],0,0,3+OWNSIGNAL_shift,custom1_buffer)<3+OWNSIGNAL_shift) 
//*            {Alert("CopyBuffer1 ERROR "+custom1_buffer[0]+" NameError="+GetLastError());return(0);}
//*         if(!ArraySetAsSeries(custom1_buffer,true))
//*            {Alert("ArraySetAsSeries ERROR");return(0);}
//*         if(CopyBuffer(h_custom[array_tf][array_symbol],1,0,3+OWNSIGNAL_shift,custom2_buffer)<3+OWNSIGNAL_shift) 
//*            {Alert("CopyBuffer2 ERROR "+custom2_buffer[0]+" NameError="+GetLastError());return(0);}
//*         if(!ArraySetAsSeries(custom2_buffer,true))
//*            {Alert("ArraySetAsSeries ERROR");return(0);}
//      
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      2.
//*      if(custom1_buffer[OWNSIGNAL_shift+1]<custom2_buffer[OWNSIGNAL_shift+1] && custom1_buffer[OWNSIGNAL_shift]>custom2_buffer[OWNSIGNAL_shift])
//*         sig=1;
//*      else if(custom1_buffer[OWNSIGNAL_shift+1]>custom2_buffer[OWNSIGNAL_shift+1] && custom1_buffer[OWNSIGNAL_shift]<custom2_buffer[OWNSIGNAL_shift])
//*         sig=-1;
//*      else sig=0;
//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      3.
//*      InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+sigInd+" array_tf="+array_tf+" array_symbol="+array_symbol+" sig="+sig+" "+__FUNCTION__+" "
//*                      +" custom1_buffer[OWNSIGNAL_shift+1]="+custom1_buffer[OWNSIGNAL_shift+1]
//*                      +" custom2_buffer[OWNSIGNAL_shift+1]="+custom2_buffer[OWNSIGNAL_shift+1]
//*                      +" custom1_buffer[OWNSIGNAL_shift]="+custom1_buffer[OWNSIGNAL_shift]
//*                      +" custom2_buffer[OWNSIGNAL_shift]="+custom2_buffer[OWNSIGNAL_shift];
//      //--- возвращаем торговый сигнал
//*      return(sig);
//*     }
// ###########################################################################

Этот шаг очень важен для советника. Хотя и все остальные шаги обязательны, иначе советник не будет работать. 

Свои комментарии я указал в коде! 

Номер стратегии у нас такой же как и в первых шагах!

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

Этот шаг можно разделить на 3 подшага:

  1. 1. Мы обязаны скопировать буферы данных в наши массивы данных. В параметрах копирования мы должны указать номера линий (В нашем случае это линии индикатора MACD )
  2. Мы используем две линии MAIN и SIGNAL
  3. Вы можете почитать справку о функции CopyBuffer
  4. 2. Программирование стратегии. В данном случае это пересечение двух линий. 
  5. Важно: Сигнал для BUY это 1, а для SELL это -1
  6. 3. Здесь мы записываем ту информацию, которая будет выводится в журнал при открытии позиции. Информация о стратегии

Если Вы заполнили все хендлы и буферы правильно, тогда на экране должна появится надпись:

       Alert(" Поздравляем! Вы сделали урок, который показывает программирование своей стратегии!");
       Alert(" Congratulations! You have done a lesson that shows the programming of your strategy!");
Если Вы получили сообщения о ошибке, тогда Вам необходимо узнать причину этой ошибки.

Коды ошибок

наиболее частые ошибки:

ERR_INDICATOR_UNKNOWN_SYMBOL

4801

Неизвестный символ

ERR_INDICATOR_CANNOT_CREATE

4802

Индикатор не может быть создан

ERR_INDICATOR_NO_MEMORY

4803

Недостаточно памяти для добавления индикатора

ERR_INDICATOR_CANNOT_APPLY

4804

Индикатор не может быть применен к другому индикатору

ERR_INDICATOR_CANNOT_ADD

4805

Ошибка при добавлении индикатора

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

ERR_INDICATOR_WRONG_HANDLE

4807

Ошибочный хэндл индикатора

ERR_INDICATOR_WRONG_PARAMETERS

4808

Неправильное количество параметров при создании индикатора

ERR_INDICATOR_PARAMETERS_MISSING

4809

Отсутствуют параметры при создании индикатора

ERR_INDICATOR_CUSTOM_NAME

4810

Первым параметром в массиве должно быть имя пользовательского индикатора

ERR_INDICATOR_PARAMETER_TYPE

4811

Неправильный тип параметра в массиве при создании индикатора

ERR_INDICATOR_WRONG_INDEX

4812

Ошибочный индекс запрашиваемого индикаторного буфера

MetaTrader 5 Шаг 9: Шаг для указание фильтров от ваших индикаторов, или использование вашего индикатора как фильтр для стратегии!

// Step 9 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш фильтр для фильтрации сигналов. Заполняем буферы данных
// Here we create our filter for signal filtering. Fill in the data buffers
// ####################################################################
// for example:
//*  if(sigInd==77)
//*    {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//*     if(CopyBuffer(h_custom[array_tf][array_symbol],0,0,3+shift,custom1_buffer)<3+shift) 
//*        {Alert("CopyBuffer1 ERROR "+custom1_buffer[0]+" NameError="+GetLastError());return(0);}
//*     if(!ArraySetAsSeries(custom1_buffer,true))
//*        {Alert("ArraySetAsSeries ERROR"+" NameError="+GetLastError());return(0);}
//*     if(CopyBuffer(h_custom[array_tf][array_symbol],1,0,3+shift,custom2_buffer)<3+shift) 
//*       {Alert("CopyBuffer2 ERROR "+custom2_buffer[0]+" NameError="+GetLastError());return(0);}
//*      if(!ArraySetAsSeries(custom2_buffer,true))
//*        {Alert("ArraySetAsSeries ERROR"+" NameError="+GetLastError());return(0);}
//      
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*    if(custom1_buffer[shift]>custom2_buffer[shift])
//*       sig=1;
//*    else if( custom1_buffer[shift]<custom2_buffer[shift])
//*       sig=-1;
//*    else sig=0;
//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//*    InfoAboutSignal=InfoAboutSignal+" "+"sigInd="+sigInd+" array_tf="+array_tf+" array_symbol="+array_symbol+" sig="+sig+" "+__FUNCTION__+" "
//*                    +" custom1_buffer[shift+1]="+custom1_buffer[shift+1]
//*                    +" custom2_buffer[shift+1]="+custom2_buffer[shift+1]
//*                    +" custom1_buffer[shift]="+custom1_buffer[shift]
//*                    +" custom2_buffer[shift]="+custom2_buffer[shift];
//      //--- возвращаем торговый сигнал
//*     return(sig);
//*    }

В программировании кода на этом шаге нет ничего сложного и он похож на предыдущий шаг.

Отличие лишь в том, что на этом шаге Вы программируете свои индикаторы в роли Фильтра.

Вы можете не указывать сигналы по индикатору, а указать только фильтр. Или наоборот! Все зависит от стратегии.

 

MetaTRader 5 Шаг 10: Это заключительный шаг!

// Step 10 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Это конец нашего кода, Если Вы дошли до этого шага, значит Вы сделали свою стратегию.
// Для примера я ввел секретную стратегию. Если Вы все сделали правильно, Тогда Вы получите результат в виде алерта на экране!
// Благодарим Вас за то, что Выбрали наш продукт. Мы стараемся для Вас!
//
// Наш сайт: http://www.expforex.com
// Наш магазин: http://www.expforex.com/shop
// Магазин MQL5: https://www.mql5.com/ru/users/vladon/seller
//
//
// This is the end of our code, If you have reached this step, then you have made your strategy.
// For example, I entered a secret strategy. If you did everything correctly, Then you will get the result in the form of an alert on the screen!
// Thank you for choosing our product. We are working for you!
//
// Our website: http://www.expforex.com
// Our store: http://www.expforex.com/shop
// MQL5 store: https://www.mql5.com/users/vladon/seller
// ###########################################################################

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

Он указывает на то, что программирование вашей стратегии окончено. 

Удачи и профитов Вам!

 

MetaTrader 5 Выводы и проверка стратегии.

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

Теперь мы должны проверить наш советник и стратегию. 

  1. Загружаем терминал;
  2. Открываем демо счет;
  3. Устанавливаем советник на график;
  4. Если все Хорошо, Вы получите сообщение о успешном добавлении стратегии:
  5. Или Вы получите ошибку. Тогда Вам нужно еще раз внимательно посмотреть свой код и повторить все шаги!

 

Проверка советника в тестере стратегий:

  1. Открываем терминал;
  2. Открываем тестер стратегий;
  3. Выбираем нашего эксперта, валюту, ТФ, дату. Устанавливаем галочку на Every Tick based on real ticks;
  4. Открываем вкладку настройки;
  5. Выбираем нашу стратегию;
  6. Включаем Визуализацию;
  7. Нажимаем START ;
  8. Должен открыться график;
  9. Если советник открывает позиции, значит Вы все сделали правильно!

 

Программирование THE X для MetaTrader 4

Вы должны знать минимальные правила программирования для того, чтобы написать свою стратегию Или добавить готовую стратегию по индикаторам с готового файла (Советники с интернета, например)

Программирование советников для MetaTrader 5 сложнее, чем программирование для MetaTrader 4. Но терминал МТ5 позволяет создать более мощные стратегии, а также обладает более продвинутым тестером стратегий. 

C другой стороны: В интернете очень много стратегий и индикаторов для терминала Метатрейдер 4. Поэтому, Вы можете использовать код для мт4!

И еще одно важное напоминание: Кодирование стратегйи в мт4 намного легче, чем кодирование в мт5!

В любом случае, Вы должны купить тот открытый код, на котором терминале будете работать. 

MetaTrader4 Шаг 0: Шаг загрузки индикаторов в ресурсы!

// Step 0 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Для того,чтобы при компиляции, индикатор был встроен в советник, Вам необходимо загрузить его в ресурсы советника
// In order for the indicator to be built into the Expert Advisor during compilation, you need to load it into the resources of the Expert Advisor
// ####################################################################
// for example:
//* #resource "\\Indicators\\MACD.ex4"
// ###########################################################################

Здесь мы обязаны добавить , нужные Нам, индикаторы в ресурсы. 

Это позволит компилировать советник для маркета , а также избавит нас от лишних проблем, когда компилированный советник вдруг не найдет нужный индикатор на другом компьютере! 

Правила написания имени маркета: Полное название папок, начиная с Indicators!

Папка обозначается \\

Например:

Если путь к Вашему индикатору выглядит так:

C:\ROBO MT4\MQL4\Indicators\Examples\MACD.ex4

тогда путь к этому индикатору в языке программирования записывается так:

"\\Indicators\\Examples\\MACD.ex4"

 

MetaTrader 4 Шаг 1: Шаг указания имени сигнала!

   // Step 1 ####################################################################
   // Эта часть кода для программирования своей стратегии в открытом коде
   // This part of the code for programming your strategy in open source
   //
   // Введите название своего сигнала после //
   // Enter the name of your signal after //
   // ####################################################################
   // for example:  
   //* Custom=77,//Signal For open source
   // ############################################################################

На этом шаге мы должны внести наш сигнал или стратегию в список возможных сигналов советника.

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

Например:

  1. Вы хотите назвать свою стратегию MY STRATEGY
  2. Номер стратегии также должен быть уникальным. Первые 22 номера заняты сигналами от стандартных индикаторов! Запомните эту цифру, она понадобиться нам в дальнейшем.
  3. Имя также должно быть уникальным. Например: MYSTRATEGY1

В итоге мы должны записать в коде так:

MYSTRATEGY1=77,//MY STRATEGY

Вы также можете добавить еще стратегий, и написать, например, так:

  1. MYSTRATEGY1=77,//MY STRATEGY a
  2. MYSTRATEGY2=78,//MY STRATEGY b
  3. MYSTRATEGY3=79,//MY STRATEGY с

MetaTrader 4 Шаг 2: Шаг указания имени сигнала для вывода имени на экран!

//  Step 2 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Введите название своего сигнала, которое будет отображатся на экране. после //
// Enter the name of your signal, which will be displayed on the screen. after//
// ####################################################################
// for example:  
//* if(i==77)s1="Custom";
// ###########################################################################

Этот шаг служит для того, чтобы название вашей стратегии отображалось в нашей панели для советника EApadpro

Сложного ничего нет! Но вы должны использовать цифры с прошлого шага.

Например:

  1. if(i==77)s1="My1";
  2. if(i==78)s1="My2";
  3. if(i==79)s1="My3";

 

MetaTrader 4 Шаг 3: Шаг указания имени фильтра!

   // Step 3 ####################################################################
   // Эта часть кода для программирования своей стратегии в открытом коде
   // This part of the code for programming your strategy in open source
   // 
   // Введите название своего фильтра после //
   // Enter the name of your filter after //
   // ####################################################################
   // for example:  
   //* FILTERCustom=77,//Filter For open source
   // ###########################################################################

На этом шаге мы должны внести наш фильтр в список возможных фильтров советника.

Это делается для того, чтобы было удобно управлять фильтрами на этапе настройки эксперта. 

Обычно: Фильтр использует тот же индикатор, что и сигнал, но с тем условием, что Фильтр определяет текущее положение сигнала, а Сигнал является фактом совершения сигнала. Примеры отличия фильтров и сигналов

Например:

  1. Вы хотите назвать свой фильтр MY FILTER
  2. Номер фильтра также должен быть такой же, как и номер стратегии (Это сделано для того, чтобы в дальнейшем не путаться в цифрах). Первые 22 номера заняты фильтрами от стандартных индикаторов! Запомните эту цифру, она понадобиться нам в дальнейшем.
  3. Имя также должно быть уникальным. Например: MYFILTER1

В итоге мы должны записать в коде так:

MYFILTER1=77,//MY FILTER

Вы также можете добавить еще стратегий, и написать, например, так:

  1. MYFILTER1=77,//MY FILTER a
  2. MYFILTER2=78,//MY FILTER b
  3. MYFILTER3=79,//MY FILTER с

MetaTrader 4 Шаг 4: Шаг указания параметров индикатора или стратегии в внешних переменных!

   // Step 4 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Укажите все внешние переменные Вашего индикатора или индикаторов, которые будут использоваться в вашей стратегии
// Write all external variables of your indicator or indicators that will be used in your strategy
// ####################################################################
// for example:
//* input string IndicatorName ="-------- Custom Indicator ----------------";
//* input int                        CUSTOMMAFastPeriod=1;
//* input int                        CUSTOMMASlowPeriod=100;
// ###########################################################################

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

Также сюда можно вынести особые параметры стратегии. Например, уровни пересечения линий, ограничение срабатывания индикатора по МАКС и МИН цене на графике и так далее...

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

MetaTrader 4 Шаг 5,6,7: Отдохните!

// Step 5 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Шаг 5 нужен только для терминала МТ5. Поэтому на этом шаге можете попить кофе
// Step 5 is only needed for the MT5 terminal. So at this step you can drink coffee
// ###########################################################################

// Step 6 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Шаг 6 нужен только для терминала МТ5. Поэтому на этом шаге можете сьесть бутерброды
// Step 6 is only needed for the MT5 terminal. So at this step you can eat sandwiches
// ###########################################################################

// Step 7 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Шаг 7 нужен только для терминала МТ5. Сделать тренировку
// Step 7 is only needed for the MT5 terminal. Make a workout
// ###########################################################################

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

 

 

MetaTrader 4 Шаг 8: Главный шаг создания стратегии и сигналов для открытия позиций!

// Step 8 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш сигнал для открытия позиций. Заполняем буферы данных
// Here we create our signal for opening positions. Fill in the data buffer
// ####################################################################
// for example:
//*   if(sigInd==77)
//*     {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//
//*   double CustomMain=iCustom(Symbolt,TF_IndSigToTrade1,"::Indicators\\MACD",0,OWNSIGNAL_shift);
//*   double CustomSig=iCustom(Symbolt,TF_IndSigToTrade1,"::Indicators\\MACD",1,OWNSIGNAL_shift);
//
//*   double CustomMain2=iCustom(Symbolt,TF_IndSigToTrade1,"::Indicators\\MACD",0,OWNSIGNAL_shift+1);
//*   double CustomSig2=iCustom(Symbolt,TF_IndSigToTrade1,"::Indicators\\MACD",1,OWNSIGNAL_shift+1);
//
//
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      1.
//*  if(CustomMain>CustomSig && CustomMain2<CustomSig2)
//      // Buy Signal
//*     Signal=1;
//*  if(CustomMain<CustomSig && CustomMain2>CustomSig2)
//      // Sell Signal
//*    Signal=-1;//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      2.
//*  InfoAboutSignal=" InfoAboutSignal sigInd="+sigInd+" Signal="+Signal
//*                  +" CustomMain="+CustomMain
//*                  +" CustomSig="+CustomSig
//*                  +" CustomMain2="+CustomMain2
//*                  +" CustomSig2="+CustomSig2
//*                  ;
//      //--- возвращаем торговый сигнал
//*    }

Этот шаг очень важен для советника. Хотя и все остальные шаги обязательны, иначе советник не будет работать. 

Свои комментарии я указал в коде! 

Номер стратегии у нас такой же как и в первых шагах!

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

Этот шаг можно разделить на 2 подшага:

  1. 1. Программирование стратегии. В данном случае это пересечение двух линий. 
  2. Важно: Сигнал для BUY это 1, а для SELL это -1
  3. 2. Здесь мы записываем ту информацию, которая будет выводится в журнал при открытии позиции. Информация о стратегии


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

Коды ошибок

наиболее частые ошибки:

ERR_INDICATOR_UNKNOWN_SYMBOL

4801

Неизвестный символ

ERR_INDICATOR_CANNOT_CREATE

4802

Индикатор не может быть создан

ERR_INDICATOR_NO_MEMORY

4803

Недостаточно памяти для добавления индикатора

ERR_INDICATOR_CANNOT_APPLY

4804

Индикатор не может быть применен к другому индикатору

ERR_INDICATOR_CANNOT_ADD

4805

Ошибка при добавлении индикатора

ERR_INDICATOR_DATA_NOT_FOUND

4806

Запрошенные данные не найдены

ERR_INDICATOR_WRONG_HANDLE

4807

Ошибочный хэндл индикатора

ERR_INDICATOR_WRONG_PARAMETERS

4808

Неправильное количество параметров при создании индикатора

ERR_INDICATOR_PARAMETERS_MISSING

4809

Отсутствуют параметры при создании индикатора

ERR_INDICATOR_CUSTOM_NAME

4810

Первым параметром в массиве должно быть имя пользовательского индикатора

ERR_INDICATOR_PARAMETER_TYPE

4811

Неправильный тип параметра в массиве при создании индикатора

ERR_INDICATOR_WRONG_INDEX

4812

Ошибочный индекс запрашиваемого индикаторного буфера

MetaTrader 4 Шаг 9: Шаг для указание фильтров от ваших индикаторов, или использование вашего индикатора как фильтр для стратегии!

// Step 9 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Здесь создаем наш фильтр для фильтрации сигналов. Заполняем буферы данных
// Here we create our filter for signal filtering. Fill in the data buffers
// ####################################################################
// for example:
//*  if(sigInd==77)
//*   {
//      
//      Заполняем данные, 
//      We fill in the data
//      
//
//*  double CustomMain=iCustom(Symbolt,TFTOFILTER,"::Indicators\\MACD",MODE_MAIN,shift);
//*  double CustomSig=iCustom(Symbolt,TFTOFILTER,"::Indicators\\MACD",MODE_SIGNAL,shift);
//
//      Здесь пишем нашу стратегию, в данном примере это пересечение двух линий, 
//      Here we write our strategy, in this example it is the intersection of two lines
//      
//*  if(CustomMain>CustomSig )
//      // Buy Signal
//*    Signal=1;
//*  if(CustomMain<CustomSig )
//      // Sell Signal
//*    Signal=-1;//      
//      Записываем данные, которые будут отображаться в журнале, при открытии позиций по сигналу 
//      We write down the data that will be displayed in the log, when you open positions on a signal
//      
//* InfoAboutSignal=" InfoAboutSignal sigInd="+sigInd+" Signal="+Signal
//*                +" CustomMain="+CustomMain
//*                +" CustomSig="+CustomSig
//*                ;
//      //--- возвращаем торговый сигнал
//*   }

В программировании кода на этом шаге нет ничего сложного и он похож на предыдущий шаг.

Отличие лишь в том, что на этом шаге Вы программируете свои индикаторы в роли Фильтра.

Вы можете не указывать сигналы по индикатору, а указать только фильтр. Или наоборот! Все зависит от стратегии.

 

MetaTRader 4 Шаг 10: Это заключительный шаг!

// Step 10 ####################################################################
// Эта часть кода для программирования своей стратегии в открытом коде
// This part of the code for programming your strategy in open source
// 
// Это конец нашего кода, Если Вы дошли до этого шага, значит Вы сделали свою стратегию.
// Для примера я ввел секретную стратегию. Если Вы все сделали правильно, Тогда Вы получите результат в виде алерта на экране!
// Благодарим Вас за то, что Выбрали наш продукт. Мы стараемся для Вас!
//
// Наш сайт: http://www.expforex.com
// Наш магазин: http://www.expforex.com/shop
// Магазин MQL5: https://www.mql5.com/ru/users/vladon/seller
//
//
// This is the end of our code, If you have reached this step, then you have made your strategy.
// For example, I entered a secret strategy. If you did everything correctly, Then you will get the result in the form of an alert on the screen!
// Thank you for choosing our product. We are working for you!
//
// Our website: http://www.expforex.com
// Our store: http://www.expforex.com/shop
// MQL5 store: https://www.mql5.com/users/vladon/seller
// ###########################################################################

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

Он указывает на то, что программирование вашей стратегии окончено. 

Удачи и профитов Вам!

 

MetaTrader 4 Выводы и проверка стратегии.

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

Теперь мы должны проверить наш советник и стратегию. 

  1. Загружаем терминал;
  2. Открываем демо счет;
  3. Устанавливаем советник на график;

 

Проверка советника в тестере стратегий:

  1. Открываем терминал;
  2. Открываем тестер стратегий;
  3. Выбираем нашего эксперта, валюту, ТФ, дату. Устанавливаем галочку на Every Tick based on real ticks;
  4. Открываем вкладку настройки;
  5. Выбираем нашу стратегию;
  6. Включаем Визуализацию;
  7. Нажимаем START ;
  8. Должен открыться график;
  9. Если советник открывает позиции, значит Вы все сделали правильно!

Что еще можно изменить в советнике?

Конечно же Вы захотите персонализировать свою стратегию и придать нашему советнику другой вид!

Параметры, которые можно менять по своему усмотрению:

// Change 1 Версия советника // Version of EA
#define versionea "18.008" 
// Change 2 Логотип советника // LOGO of EA
#define BMPLOGO "Images\\dollar.bmp"
// Change 3 Иконка советника // Icon of EA
//#property icon "\\Images\\dollar.bmp"
// Change 4 Имя советника на графике // Name of EA on Graph
#define defEANAME "EXP-The X (OS)"
// Change 5 Ссылка на полную инструкцию // Link to the full instruction
#define linkTOfull "www.expforex.com/publ/4-1-0-166" 
// Change 6 Демо версия советника. Работа только на демо счете или на реальном счете на паре USDJPY // Demo version of the advisor. Work only on a demo account or on a live account on a pair USDJPY
bool DEMO=false;

 

Все остальные параметры я рекомендую не изменять потому, что Вы можете поломать работу советника!

 

Отладка стратегии

Следующим шагом будет то, что ВЫ будете тестировать и оптимизировать The X и искать свои лучшие настройки. Или отлаживать и модернизировать свою стратегию 

Иногда на это уходят дни и недели. Иногда и месяцы. 

Рынок форекс - Уведомления о рисках! Это очень рискованный вид заработка. Совершенствуйте свою стратегию. 

Удачи Вам и профита!

 

Вывод дополнительной информации в блок Strategy

Это дополнительная опция в нашем открытом коде. 

Вы можете вывести абсолютно любое значение любого параметра в блок EAPADPRO Strategy

1. Для этого Вам необходимо создать локальную переменную,

например double EAPADPRO_StrategyValue1=0; double EAPADPRO_StrategyValue2=0;

2. Присвоить значение этой переменной,

например, присвоим значение индикатора ATR (Найдите строку double atr=iATR):

EAPADPRO_StrategyValue1=atr;
EAPADPRO_StrategyValue2=atrma;

Полный код фильтра:

if(sigInd==18)
 {

 //+------------------------------------------------------------------+
 double atrma=iMA(Symbolt,TFTOFILTER,ATR_MA_period,0,MODE_SMA,ATRprice,shift);
 double atrma2=iMA(Symbolt,TFTOFILTER,ATR_MA_period,0,MODE_SMA,ATRprice,shift+1);
 double atr=iATR(Symbolt,TFTOFILTER,ATR_period,shift);

 if(atrma>atrma2+atr*ATR_MULTIPLIER) // Buy Signal
 Signal=1;
 if(atrma<atrma2-atr*ATR_MULTIPLIER) // Sell Signal
 Signal=2;
 EAPADPRO_StrategyValue1=atr;
 EAPADPRO_StrategyValue2=atrma;
 InfoAboutSignal=" InfoAboutSignal FILTER sigInd="+sigInd+" Signal="+Signal
 +" atr="+atr
 +" atrma="+atrma
 +" atrma2="+atrma
 ;
 }

 

3. Далее Вам необходимо добавить значение переменной в блок вывода информации:

Находим в коде функцию CreateStrategy() и добавляем новую строку:

   ArrayAddStrategy("StrategyValue1",DoubleToString(EAPADPRO_StrategyValue1,5)," "," ");

   ArrayAddStrategy("StrategyValue2",DoubleToString(EAPADPRO_StrategyValue2,5)," "," ");

Первый параметр функции = Название переменной

Второй параметр функции = Значение переменной в удобном формате!

Внимание! Добавляйте четное количество параметров, чтобы это было красиво на экране!

 

The X: 10 шагов для программирования своей стратегии!_1 The X: 10 шагов для программирования своей стратегии!_2 The X: 10 шагов для программирования своей стратегии!_3 The X: 10 шагов для программирования своей стратегии!_4 The X: 10 шагов для программирования своей стратегии!_5 The X: 10 шагов для программирования своей стратегии!_6 The X: 10 шагов для программирования своей стратегии!_7 The X: 10 шагов для программирования своей стратегии!_8 The X: 10 шагов для программирования своей стратегии!_9 The X: 10 шагов для программирования своей стратегии!_10 The X: 10 шагов для программирования своей стратегии!_11 The X: 10 шагов для программирования своей стратегии!_12 The X: 10 шагов для программирования своей стратегии!_13 The X: 10 шагов для программирования своей стратегии!_14 The X: 10 шагов для программирования своей стратегии!_15 The X: 10 шагов для программирования своей стратегии!_16
Здесь можно скачать The X: 10 шагов для программирования своей стратегии!
Купить The X: 10 шагов для программирования своей стратегии! можно здесь - Прочитать о The X: 10 шагов для программирования своей стратегии! можно здесь - Обсуждение The X: 10 шагов для программирования своей стратегии! - стейты, отзывы, комментарии - Отзывы о The X: 10 шагов для программирования своей стратегии! - Настройки к The X: 10 шагов для программирования своей стратегии! - Мониторинг The X: 10 шагов для программирования своей стратегии! - Download The X: 10 шагов для программирования своей стратегии! - Buy The X: 10 шагов для программирования своей стратегии! - Read about The X: 10 шагов для программирования своей стратегии! - Discusion of The X: 10 шагов для программирования своей стратегии! - Comments of The X: 10 шагов для программирования своей стратегии! - Settings The X: 10 шагов для программирования своей стратегии! - Monitoring The X: 10 шагов для программирования своей стратегии! - The X: 10 шагов для программирования своей стратегии! скачать бесплатно - The X: 10 шагов для программирования своей стратегии! ключ - The X: 10 шагов для программирования своей стратегии! открытый код - The X: 10 шагов для программирования своей стратегии! скачать
-
Этот сайт использует «cookies». Условия использования «cookies» см. в Пользовательском соглашении. Также сайт использует Интернет-сервис для сбора технических данных касательно посетителей с целью получения маркетинговой и статистической информации. Условия обработки данных посетителей сайта см. в Политике конфиденциальности.