Старт распродаж! Черная пятница - 50%



Основные понятия [17]
Торговые системы,тактики [67]
Форекс начинающим [16]
Разное [37]

Шаблон советника для автоматической торговли

Добавить в социальные закладки:

Данный шаблон предназначен для общих целей создания экспертов, в этом шаблоне заложены самые важные и 

необходимые функции работы с экспертом 


Среди возможностей данного шаблона есть:
1. Использование / НЕ использование - Стоплоссов / Тейкпрофитов
2. Использование / НЕ использование - Торговли по времени
3. Использование / НЕ использование - MarketWatch технологии ведении торговли (включение - Только для знающих)
4. Использование / НЕ использование - Отложенных ордеров / позиций по рынку - на выбор
5. Использование / НЕ использование - Автолота, либо же использование фиксированного лота
6. Использование / НЕ использование - Закрытия позиций по обратному сигналу
7. Использование / НЕ использование - Трейлингстопа


ВНИМАНИЕ!!! КОД ПОЛНОСТЬЮ ОТКРЫТЫЙ И КОММЕНТИРОВАННЫЙ

 


 

 
 
 

 

В этом шаблоне заложены самые важные и необходимые функции работы с экспертом.
 
 
 
 
  • Автолот(Расчет лота от текущего баланса) Мани менеджмент
  • Работа по времени(Ограничение работы советника по времени торговли);
  • Трейлингстоп(Стандартный, с алгоритмом "Только профитные");
  • Трейлингстоп по ПАРАБОЛИКу ;
  • MarketWatch ECN(Работа на счетах групп ECN NDD);
  • Функции обработки ошибок для реальных счетов;
  • Блок закрытия по общей прибыли и убытку с возможностью отключить все советники на счете;
  • Безубыток(Установка стоплоссов на нулевой уровень);
  • Мартингейл(Увеличения следующего лота, после убыточной позиции);
  • Работа исключительно по сигналам индикатора(Сигнал - открытие, Сигнал - закрытие противоположного ордера - открытие );
  • Закрытие противоположного сигнала, при смене сигнала;
  • Функция "РЕВЕРС", переворот сигналов Вашей стратегии;
  • Работа на отложенных ордерах / работа на позициях;
  • Блок работы усреднения;  Описание
  • Блок работы траллингстопа на откатах  Описание

 

 

Введение

 

Многие трейдеры сталкивалось с проблемой написания своих экспертов.

С чего начать?
Как задать в коде советника тейк-профит, стоп-лосс или трейлинг-стоп?
Как проверить стратегию на работоспособность?
Вы не хотите заказывать у программиста то, что уже давно сделано до Вас?
Вы нашли похожую стратегию и желаете ее улучшить?
Как программист хочу сказать, что каждый 3 заказ похож на предшественника по своей логике.
Такие заказы выполняются как правило дешевле.

 

Каждый программист имеет в своем наборе ряд функций и библиотек для написания советников и пользуется

 ими при написании того или иного заказа.

 

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

 

Шаблон советника для автоматической торговли


Данный шаблон предназначен для общих целей создания экспертов, в этом шаблоне заложены самые

 важные и необходимые функции работы с экспертом

Среди возможностей данного шаблона есть:

Использование / НЕ использование - Стоплоссов / Тейкпрофитов
Использование / НЕ использование - Торговли по времени
Использование / НЕ использование - MarketWatch технологии ведении торговли
 (включение - Только для знающих)
Использование / НЕ использование - Отложенных ордеров / позиций по рынку - на выбор
Использование / НЕ использование - Автолота, либо же использование фиксированного лота
Использование / НЕ использование - Закрытия позиций по обратному сигналу
Использование / НЕ использование - Трейлингстопа

 

Внешние параметры шаблона:

 
Параметр Обозначение
Indicator " Настройки индикатора";
FastEMA Пример для вывода внешних параметров индикатора в шаблон
SlowEMA  
SignalSMA  
trade Настройки торговли
CorectStopLevelwServers Корректировка значений стопов StopLoss TakeProfit StopOrderDeltaifUSE TrailingStop на минимально возможный уровень, при этом параметры следует установить на -1
Magic Магический номер
StopLoss Стоплосс, 0 - не используется
TakeProfit Тейкпрофит, 0 - не используется
Slippage Проскальзывание
MarketWatch Режим торговли по MarketWatch true = сначала выставляются позиции/ордера без стопов, потом происходит модификация - для некоторых брокеров
StopOrderUSE Использовать Отложенные ордера
StopOrderDeltaifUSE Дистанция для отложенных ордеров
ClosePosifChange Закрывать позиции при обратном сигнале
ONlyOnePosbySignal Играть только или бай и / или селл 1 позицией
autolot "Настройки автолота";
Lots Фиксированный лот
DynamicLot Динамический лот
LotBalancePcnt % от депозита
MinLot Минимальный лот при расчете
MaxLot Максимальный лот при расчете
timetrade "Настройки времени торговли";
OpenHour Час открытия торгов
OpenMinute Минута открытия торгов
CloseHour Час закрытия торгов
CloseMinute Минута закрытия торгов
Trailing "Настройки трейлингстопа";
TrailingStopUSE Использовать трейлингстоп
IfProfTrail Использовать только дял профитных позиций - режим безубытка
TrailingStop Дистанция трейлинга = 0 - минимально допустимый
TrailingStep Шаг дистанции


Список функций используемых в шаблоне
 

 
//+-+
// Работа по времени
//+-+
 
bool TDt(string CloseHour,string CloseMinute,string OpenHour,string OpenMinute)
 
 
 
//+-+
// Удаление отложенных ордеров
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
 
bool DxO(string sy="",int op=-1,int mn=-1,datetime ot=0)
 
 
 
//+-+
// Модификация позиций/ордеров
//+-+
//+-----------+
// Параметры:
// pp - Цена модификация (для отложенных ордеров)
//
// sl - Стоплосс - или 0
// tp - Тейкпрофит - или 0
// ex - Дата истечения отложенного ордера или 0
//+-----------+
 
void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0)
 
 
 
//+-+
// Наличие отложенных ордеров
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
 
bool ExO(string sy="",int op=-1,int mn=-1,datetime ot=0)
 
 
 
//+-+
// Установка отложенного ордера
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента (NULL или "" - текущий символ)
// op - операция
// ll - лот
// pp - цена
// sl - уровень стоп
// tp - уровень тейк
// mn - Magic Number
// ex - Срок истечения
//+-----------+
int SetOrder(string sy,int op,double ll,double pp, double sl=0,double tp=0,int mn=0,datetime ex=0,string lsComm="")
 
 
//+-+
// Возвращает флаг удачного выбора позиции по тикету
//+-+
//+-----------+
// Параметры:
// ti - наименование тикета
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
 
 
bool SBT(int ti,string sy="",int op=-1,int mn=-1)
 
 
 
//+-+
// Открытие позиции по рынку
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента ("" или NULL - текущий символ)
// op - операция
// ll - лот
// sl - уровень стоп
// tp - уровень тейк
// mn - MagicNumber
//+-----------+
 
int OPs(string sy,int op,double ll,double sl=0,double tp=0,int mn=0,string coomment="")
 
 
 
 
//+-+
// Наличие позиций по рынку
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
 
bool EPs(string sy="",int op=-1,int mn=-1,int ticket=0)
 
 
 
//+-+
// Автолот
//+-+
double GetSizeLot()
 
 
 
//+-+
// Удаление 1 предварительно выбранной позиции
//+-+
 
void CPBS()
 
 
 
//+-+
// Удаление позиций по рынку
//+-+
//+-----------+
// Параметры:
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
 
void CPD(string sy="",int op=-1,int mn=-1)
 
 
 
//+-----------+
// Описание : Сопровождение позиций простым тралом
//+-----------+
// Параметры:
// sy - наименование инструмента ( "" - любой символ,
// NULL - текущий символ)
// op - операция ( -1 - любая позиция)
// mn - MagicNumber ( -1 - любой магик)
//+-----------+
void SimpleTrailing(string sy="",int op=-1,int mn=-1)
 


 

 

 

Основной код шаблона заключен в start()

 

int start()
  {
   int Signal; // Сигнал к открытию
//+-+
// Коррекция стоп уровней заданных пользователем, на минимально 
возможные уровни установленные сервером.: 
//+-+
   if(CorectStopLevelwServers)
     {
      if(StopOrderDeltaifUSE!=0 
&& StopOrderDeltaifUSE<MarketInfo(Symbol(),MODE_STOPLEVEL))
StopOrderDeltaifUSE=MarketInfo(Symbol(),MODE_STOPLEVEL);
      if(TrailingStop!=0 && TrailingStop<MarketInfo(Symbol(),MODE_STOPLEVEL))
TrailingStop=MarketInfo(Symbol(),MODE_STOPLEVEL);
      if(StopLoss!=0 && StopLoss<MarketInfo(Symbol(),MODE_STOPLEVEL))
StopLoss=MarketInfo(Symbol(),MODE_STOPLEVEL);
      if(TakeProfit!=0 && TakeProfit<MarketInfo(Symbol(),MODE_STOPLEVEL))
TakeProfit=MarketInfo(Symbol(),MODE_STOPLEVEL);
     }
//+-+
//Проверяем наличие торгового времени(разрешения на торговлю)
//+-+
   bool Traiding=TDt(DoubleToStr(CloseHour,0),DoubleToStr(CloseMinute,0),
DoubleToStr(OpenHour,0),DoubleToStr(OpenMinute,0));
//+-+
// Включение трейлингстопа:
//+-+
   if(TrailingStopUSE)SimpleTrailing(Symbol(),-1,Magic);

//+-+
//Получение сигналов от индикаторов:
//+-+

/*    *--- Здесь находится главнй блок управления сигналами ---*
При использовании этого блока следует знать:

При сигнале на покупку следует присваивать значение Signal=1;
При сигнале на продажу следует присваивать значение Signal=2;

 *--- Использование встроенных индикаторов ---*
 
 При использовании встроенных индикаторов необходимо руководствоваться 
встроенной справкой по языку программирования.
 Список встроенных индикаторов:
 
  • iAC
  • iAD
  • iAlligator
  • iADX
  • iATR
  • iAO
  • iBearsPower
  • iBands
  • iBandsOnArray
  • iBullsPower
  • iCCI
  • iCCIOnArray
  • iDeMarker
  • iEnvelopes
  • iEnvelopesOnArray
  • iForce
  • iFractals
  • iGator
  • iIchimoku
  • iBWMFI
  • iMomentum
  • iMomentumOnArray
  • iMFI
  • iMA
  • iMAOnArray
  • iOsMA
  • iMACD
  • iOBV
  • iSAR
  • iRSI
  • iRSIOnArray
  • iRVI
  • iStdDev
  • iStdDevOnArray
  • iStochastic
  • iWPR


  *--- Использование внешних индикаторов (пользовательских) ---*

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Пользовательский индикатор
 должен быть скомпилирован (файл с расширением EX4) и находиться в директории 
каталог_терминала\experts\indicators.

Параметры:
symbol   -   Символьное имя инструмента, на данных которого будет вычисляться 
индикатор. NULL означает текущий символ.
timeframe   -   Период. Может быть одним из периодов графика. 0 означает период 
текущего графика.
name   -   Имя пользовательского индикатора.
...   -   Список параметров (при необходимости). Передаваемые параметры должны 
соответствовать порядку объявления и типу внешних (extern) переменных 
пользовательского индикатора.
mode   -   Индекс линии индикатора. Может быть от 0 до 7 и должен 
соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift   -   Индекс получаемого значения из индикаторного буфера 
(сдвиг относительно текущего бара на указанное количество периодов назад).

Пример:
  double val=iCustom(NULL, 0, "SampleInd",13,1,0);

//
//       СТАРТ --- Г Л А В Н Ы Й   Б Л О К   И С П О Л Ь З О В А Н И Я    Ш А Б Л О Н А 
//



//+-+
// Пример: (Это лишь показательный пример использования пользовательского индикатора) 
//+-+

// Для этого ЧТОБЫ  эти параметры были доступны для оптимизации, их следует 
вывести в блок extern string Indicator_=" Настройки индикатора";
// (пример показан в внешних переменных)
   int FastEMA=12;
   int SlowEMA=26;
   int SignalSMA=9;

   double ind1=iCustom(NULL, 0, "MACD",FastEMA,SlowEMA,SignalSMA,0,0);
   double ind2=iCustom(NULL, 0, "MACD",FastEMA,SlowEMA,SignalSMA,0,1);


   if(/* Здесь указываем условие для индикатора, при котором мы будем покупать*/ 
    ind1>0 && ind2>0  )Signal=1;
   if(/* Здесь указываем условие для индикатора, при котором мы будем продавать*/  
  ind1<0 && ind2<0  )Signal=2;




//
//              ФИНИШ --- Г Л А В Н Ы Й   Б Л О К   И С П О Л Ь З О В А Н И Я    Ш А Б Л О Н А
//





//
//             Б Л О К   С О В Е Р Ш Е Н И Я    О П Е Р А Ц И Й
//




//+-+
// Если время торговли не истекло и мы не открывали позицию на этом баре:
//+-+

   if(Traiding && timeCheckSignal!=Time[0])

     {
      //+-+
      // Если сигнал на бай:
      //+-+
      if(Signal==1)// buy
        {
         //+-+
         // Проверяем если не используем отложки то
         //+-+
         if(!StopOrderUSE)
           {
            //Вычисляем стоплосс
            if(StopLoss!=0)sl=Bid-StopLoss*Point; else sl=0;
            // ВЫчисляем тейкпрофит
            if(TakeProfit!=0)tp=Ask+TakeProfit*Point; else tp=0;
            //+-+
            //Закрываем противоположную позицию
            //+-+
            if(ClosePosifChange)CPD(Symbol(),OP_SELL,Magic);
            //+-+
            //Открываем позицию
            //+-+
            if ((ONlyOnePosbySignal&&!EPs(Symbol(),OP_BUY,Magic)) || !ONlyOnePosbySignal)
OPs(Symbol(),OP_BUY,GetSizeLot(),sl,tp,Magic,"Templates www.expforex.at.ua");

           }
         //+-+
         //Если используем отложки то 
         //+-+
         if(StopOrderUSE)
           {
            //Вычисляем стоплосс
            if(StopLoss!=0)sl=Bid+StopOrderDeltaifUSE*Point-StopLoss*Point; else sl=0;
            // ВЫчисляем тейкпрофит
            if(TakeProfit!=0)tp=Ask+StopOrderDeltaifUSE*Point+TakeProfit*Point; else tp=0;
            //+-+
            //Закрываем противоположную позицию
            //+-+
            if(ClosePosifChange){CPD(Symbol(),OP_SELL,Magic);DxO(Symbol(),OP_SELLSTOP,Magic);}
            //+-+
            //Открываем Ордер
            //+-+
            if ((ONlyOnePosbySignal&&!ExO(Symbol(),OP_BUYSTOP,Magic)&&!EPs(Symbol(),OP_BUY,Magic)) 
|| !ONlyOnePosbySignal)SetOrder(Symbol(),OP_BUYSTOP,GetSizeLot(),
Ask+StopOrderDeltaifUSE*Point,sl,tp,Magic,"Templates www.expforex.at.ua");

           }

        }

      //+-+
      // Если сигнал на селл:
      //+-+
      if(Signal==2)// селл
        {
         //+-+
         // Проверяем если не используем отложки то
         //+-+
         if(!StopOrderUSE)
           {
            //Вычисляем стоплосс
            if(StopLoss!=0)sl=Ask+StopLoss*Point; else sl=0;
            // ВЫчисляем тейкпрофит
            if(TakeProfit!=0)tp=Bid-TakeProfit*Point; else tp=0;
            //Закрываем противоположную позицию
            if(ClosePosifChange)CPD(Symbol(),OP_BUY,Magic);
            //+-+
            //Открываем позицию
            //+-+
            if ((ONlyOnePosbySignal&&!EPs(Symbol(),OP_SELL,Magic)) || !ONlyOnePosbySignal)
OPs(Symbol(),OP_SELL,GetSizeLot(),sl,tp,Magic,"Templates www.expforex.at.ua");
           }
         //+-+
         //Если используем отложки то 
         //+-+
         if(StopOrderUSE)
           {
            //Вычисляем стоплосс
            if(StopLoss!=0)sl=Ask-StopOrderDeltaifUSE*Point+StopLoss*Point; else sl=0;
            // ВЫчисляем тейкпрофит
            if(TakeProfit!=0)tp=Bid-StopOrderDeltaifUSE*Point-TakeProfit*Point; else tp=0;
            //Закрываем противоположную позицию
            if(ClosePosifChange){CPD(Symbol(),OP_BUY,Magic);DxO(Symbol(),OP_BUYSTOP,Magic);}
            //+-+
            //Открываем Ордер
            //+-+
            if ((ONlyOnePosbySignal&&!ExO(Symbol(),OP_SELLSTOP,Magic)&&!EPs(Symbol(),OP_SELL,Magic)) 
|| !ONlyOnePosbySignal)SetOrder(Symbol(),OP_SELLSTOP,GetSizeLot(),
Bid-StopOrderDeltaifUSE*Point,sl,tp,Magic,"Templates www.expforex.at.ua");

           }

        }

      //+-+
      timeCheckSignal=Time[0];
      //+-+

     }

   return(0);
  }

 

Блок определения сигналов
 

 

 if(/* Здесь указываем условие для индикатора, при котором мы будем покупать*/    
 ind1>0 && ind2>0  )Signal=1;
   if(/* Здесь указываем условие для индикатора, при котором мы будем продавать*/   
 ind1<0 && ind2<0  )Signal=2;

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

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

 

 

Заключение

 

Данная статья и шаблон поможет новичкам в создании своих первых экспертов, 

исчезнут вопросы на форумах 

- как сделать простейшие системы торговли, а программисты смогут взять этот 

шаблон для разработки своих сложных систем.


Получить бесплатно Шаблон советника для автоматической торговли

Категория: Торговые системы,тактики | Добавил: expforex (29.07.2010) | Автор: Владислав
Просмотров: 10635 | Комментарии: 6 | Рейтинг: 4.0/6 |
Всего комментариев: 6
   6               expforex        (26.03.2016 10:49)
вариантов много. 
функция поиска последней позиции и флаг закрытия по тп:
Код
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
   datetime t;
   double   ocp, otp;
   int      dg, i, j=-1, k=OrdersHistoryTotal();

   if (sy=="0") sy=Symbol();
   for (i=0; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy || sy=="") {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op<0 || OrderType()==op) {
             if (mn<0 || OrderMagicNumber()==mn) {
               if (t<OrderCloseTime()) {
                 t=OrderCloseTime();
                 j=i;
               }
             }
           }
         }
       }
     }
   }
   if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
     dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
     if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
     ocp=NormalizeDouble(OrderClosePrice(), dg);
     otp=NormalizeDouble(OrderTakeProfit(), dg);
     if (ocp==otp) return(True);
   }
   return(False);
}


вызываем ее так: 
if(isCloseLastPosByTake(Symbol(),-1,Magic))

далее функция тип последней позиции 
Код
int GetTypeLastClosePos(string sy="", int mn=-1) {
   datetime t;
   int      i, k=OrdersHistoryTotal(), r=-1;

   if (sy=="0") sy=Symbol();
   for (i=0; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
       if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (t<OrderCloseTime()) {
             t=OrderCloseTime();
             r=OrderType();
           }
         }
       }
     }
   }
   return(r);
}


Можно определить тип последней позиции так: 
int type=GetTypeLastClosePos(Symbol(),Magic);

   4               expforex        (04.05.2015 09:13)
Можно
Программирование на заказ
http://www.expforex.com/index/programming_in_mql4_mql5/0-3

   2               expforex        (03.08.2010 11:06)
Спасибо, стараемся...

   1               alexeyussur        (29.07.2010 16:42)
Спасибо Влад, респект!

Имя *:
Email:
Код *:



WebMoney Яндекс цитирования.