|
Данное руководство не претендует на широту и всеобъемлимость. Тем не менее, за пару часов вы научитесь писать
довольно сложные эксперты, проверяющие на истории ваши любые торговые стратегии.
Ссылка на обсуждение книги:
http://forum.profiforex.org//showthread.php?t=67
Не секрет, что умение создавать свои эксперты и индикаторы, позволяет избежать серьезных ошибок. Тем не менее, не более 10% трейдеров умеют создать даже простейший эксперт.
В то же время, современные торговые терминалы позволяют делать это все настолько просто, что научиться этому можно за один день.
Данное руководство не претендует на широту и всеобъемлимость. Тем не менее, за пару часов вы научитесь писать довольно сложные эксперты, проверяющие на истории ваши любые торговые стратегии.
Данный эксперт можно спокойно копировать в МетаEditor, а дальше добавлять в него уже нужные условия.
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double TakeProfit = 500;
extern double Lots = 0.1;
extern double Stoploss = 30;
extern double TrailingStop = 30;
// Это переменные, которые будут
// отображаться во время
// соединения эксперта с графиком
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double a;
int b;
int total, ticket, cnt;
// Просто переменные для использования в программе
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
// Это условие проверяет, есть ли в истории графиков более 100 свечей и если нет,
// выдает ошибку. Требуется для того, чтобы обратить ваше внимание на проблему
// недостатка информации
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0);
}
// Это условие проверяет уровень Тейк-профита (одной из внешних переменных,
// которая управляет уровнем фиксации прибыли. Нужен для того, чтобы проверить, не
// выставили ли вы уровни фиксации прибыли на неразрешенном для вашего ДЦ
// уровне. Нужен лишь для того, чтобы при НЕсрабатывании советника, вы четко знали
// в чем здесь ошибка. Очень советую ставить.
total=OrdersTotal();
if(total<1)
// Эта проверка нужна для того, чтобы не открывать сразу нескольких одинаковых позиций. Если ее не будет, то, скажем, если ваш эксперт срабатывает, когда стохастик находится в зоне перекупленности, то он будет совершать сделку на каждом тике, пока не истратит всю маржу.
// Поэтому, чтобы ограничить количество открываемых позиций, ставят данный
// ограничитель. Если он стоит, то советник не будет открывать более определенного
// количества позиций <х
{
// no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
// Еще один вспомогательный кусок кода. Если средств на счете недостаточно, он
// выдаст ошибку. Данный кусок полностью бесполезен, если советник работает
// в реальном времени, но очень полезен при тестинге на истории.
if( ХХХХХХХХХХХХХХХ )
// Наконец, мы добрались до самого интересного. Вместо этих иксов, надо вставить
// условие, при котором происходит покупка.
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-Stoploss*Point, Ask+TakeProfit*Point ,"comment",16384,0,Green);
// Это условия покупки. В принципе, менять здесь ничего не надо, но для расширения
// кругозора, я расшифрую что здесь написано. Здесь сказано, что надо купить
// (OP_BUY) текущий символ (пара валют, к графику которого прикреплен советник),
// размер сделки Lots (переменная заданная в начале). Цена по рынку, с
// проскальзыванием 3, и со стоп-лосом и тейк-профитом, выставленными в
// начале, сделка будет с комментарием "comment", с определяющим числом 0, и на
// месте покупки, на графике, будет зелененькая срелочка с определяющим кодом
// 16384
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
return(0);
}
// Этот блок нужен только для того, чтобы записать в журнале, все ли прошло гладко.
// Или, в противном случае, записать ошибку, из-за которой что-то не получилось.
// Теперь тоже самое со ставкой на продажу. Вместо YYYYYYYY - условия
if(YYYYYYYY)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+Stoploss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// Теперь о выходе. Тут также ничего не изменилось, просто RRRRRRR - условие
// закрытия сделки по BUY, ZZZZZZZZ - по SELL
for(cnt=0;cnt
//с помощью for'a перебираются все открытые пощиции
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(RRRRRRRRRRR)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // Тоже самое с короткой позицией
{
// should it be closed?
if(ZZZZZZZZZZZZZ)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}
// the end.
Здесь есть все, что может понадобиться для сознания советника. Вы можете спокойно копировать весь этот советник со всеми комментариями, изменить XXXXXXX, YYYYYYY, RRRRRRRRRRRR, ZZZZZZZZZZ на условия (о них ниже) и спокойно торговать.
Условия Покупок/продаж.
Для этого, обычно вызывают технические индикаторы и дается простое задание покупать или продавать.
Сильная сторона Метатрейдера это простой вызов технических индикаторов. Полный их список приводится в хелпе к терминалу.
Приведу здесь только главные.
Скользящее среднее
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
Вычисляется индикатор Moving Average (Скользящее (динамическое) Среднее) и возвращает свою величину.
Параметры
| symbol | Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. |
| timeframe | Сдвиг относительно текущей позиции (количество периодов назад). |
| period | Число периодов для вычисления. |
| ma_shift | MA сдвиг. Смещение линии индикаторов относительно периода диаграммы. |
| Ma_method | MA метод. Может быть любым из значений методов скользящего среднего (Moving Average). |
| applied_price | Используемая цена. Может быть любой из ценовых констант. |
| shift | Сдвиг относительно текущей позиции (количество периодов назад). |
То есть, условие покупки (продажи, закрытия) для условия «3-периодная выше 20-периодной» будет выглядеть так:
iMA(NULL,0, 3,0, MODE_EMA,PRICE_OPEN,0) > iMA(NULL,0, 20,0, MODE_EMA,PRICE_OPEN,0)>
Стохастик:
double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int mode, int shift)
Расчет Stochastic Oscillator.
Параметры
| symbol | Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. |
| timeframe | Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). |
| %Kperiod | %K период линии. |
| %Dperiod | %D период линии. |
| slowing | Замедление значения. |
| method | MA метод. Может быть любым из значений методов скользящего среднего (Moving Average). |
| price_field | Параметр области цены. Может быть одной из следующих величин: 0 - Low/High или 1 - Open/Close. |
| mode | Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов. |
| shift | Сдвиг относительно текущей позиции (количество периодов назад). |
То есть, сигналом при то, когда Стохастик с параметрам (4,8,7) больше своей средней, будет:
if(iStochastic(NULL,0,4,8,7,MODE_SMA,0,MODE_MAIN,0)>iStochastic(NULL,0, 4,8,7,MODE_SMA,0,MODE_SIGNAL,0))
И так далее.
Все, что вам надо сделать для тестинга своих торговых систем, это скачать базу данных всех индикаторов ЗДЕСЬ.
И менять их параметры, вставляя вместо указанных строчек.
Отдельно хочется отметить, что, скажем, в Омеге убрано все то, что я комментировал и осталены только возможности вставлять условия (их четыре: покупка, продажа, закрытие покупки, закрытие продажи). И все. А потом из четырех условий, подбирая их разным образом, вы и собираете Торговую Стратегию.
Скрипты
Скрипты и советники различает всего одна, но существенная вещь. Советники обрабатываются каждый тик заново (также как и Индикаторы). Скрипты рисуются только один раз при добавлении на график и уже сами не меняются.
Поэтому, скрипты используют обычно для того, чтобы нарисовать какие-либо линии. Скажем, линии тренда, которые не надо менять постоянно.
Другими словами, здесь мало программирования и применение достаточно разнообразно. Более того, я еще не встречал особой нужды у учеников в особых скриптах.
Индикаторы
Индикаторы, это то, что применяют ВСЕ. Благодаря их популярности, число их огромно. Здесь размещен архивный файл с 1500 индикаторами. Кстати, он еще раз доказывает то, что ни один индикатор не является панацеей от проигрыша.
Индикаторы очень разнообразны, но все сводятся к уже сделанным, поэтому советую вам не создавать их с нуля, а просто изменять формулы уже созданных.
|