Учимся писать эксперты для MetaTrader. Урок №11
|

Учимся писать эксперты для MetaTrader. Урок №11

   Сегодня мы напишем эксперт, торговля будет осуществляться только в направлении тренда, сигналы будут реверсивными (т.е. направление открытия позиций будет постоянно чередоваться), в эксперте будет использована всего одна скользящая средняя.


   11.1. Алгоритм


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


   Поскольку после закрытия одной позиции, сразу идет открытие противоположной, в эксперте выдержан таймаут ДЦ.


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


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


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


/*[[
Name := MA
Author := fxtest.ru
Link := forextimes.ru
Lots := 1.00
Stop Loss := 2000
Take Profit := 2000
Trailing Stop := 0
]]*/
defines: Npips(2),Per(21); // 2 внешние переменные
Npips-разница между значениями МА, Per- период МА
var: cnt(0), s(0), fb(0), fs(0), MA1(0), MA2(0);
if CurTime – LastTradeTime< 10 then exit; // 10 секундный таймаут
MA1=iMA(per,MODE_EMA,1); // значение МА записываем в отдельные переменные, для удобства (МА – ЕМА, Вы можете изменить тип)
MA2=iMA(per,MODE_EMA,2);
s=0; // счетчик открытых позиций, в начале каждый раз мы его обнуляем
if fb=1 then { fb=0; SetOrder(op_buy,lots,ask,3,bidstoploss*point,bid+takeprofit*point,green); exit;};
// открытие противоположных позиций, при условии равенства (fb=1 или fs=1)
if fs=1 then { fs=0; SetOrder (op_sell, lots, bid, 3, ask + stoploss*point, ask-takeprofit*point, red); exit;};
for cnt=1 to TotalTrades { if OrderValue (cnt, VAL_SYMBOL ) = Symbol then s=s+1;};
// циклом for мы считаем количество открытых позиций именно по текущему инструменту
if s<1 then { // если открытых позиций нет то…
if MA1-MA2>Npips*point then
{ SetOrder(op_buy,lots,ask,3,bidstoploss*point,bid+takeprofit*point,green); exit;};
if MA2-MA1>Npips*point then
{
SetOrder(op_sell,lots,bid,3,ask+stoploss*point,asktakeprofit*point,red); exit;};
// определение возможности открыть позицию, заметьте в этот блок эксперт зайдет только 1 раз
};
if s>0 then // если есть открытые позиции, то проверяй на возможность закрытия
{
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)<=OP_SELL and // buy
или sell
OrderValue(cnt,VAL_SYMBOL)=Symbol then //
инструмент совпадает
{
If OrderValue(cnt,VAL_TYPE)=OP_BUY then //
если buy…
{
if MA2-MA1>Npips*point then // условие закрытия
{
CloseOrder (OrderValue (cnt, VAL_TICKET),
OrderValue(cnt, VAL_LOTS),Bid,3,Violet); // закрывай
fs=1; // флаг на открытие противоположной позиции
Exit;
};
};
If OrderValue(cnt,VAL_TYPE)=OP_SELL then //
если sell
{
if MA1-MA2>Npips*point then // условие закрытия
{
CloseOrder (OrderValue (cnt, VAL_TICKET),
OrderValue(cnt, VAL_LOTS), ask,3, Violet); // закрывай
fb=1; // флаг на открытие противоположной позиции
Exit;
};
};
};
};};


Компания «Fxtest»
для Forex Magazine
Халхальян Артур
artur@fxtest.ru