В прошлый раз я представлял вашему вниманию торгового робота, который заключает сделки, следуя за ценой. У него есть ряд своих специфических особенностей. Во-первых, каждую длинную позицию он заключает выше предыдущей, а каждую короткую — ниже. Поэтому его целесообразно использовать на временном промежутке не более одного дня, и каждый следующий день перезапускать, обновляя, таким образом, точку начала отсчета. Во вторых он показывает хорошие результаты только при сильных движениях цены с минимумом «ложных» колебаний.
На этот раз я решил несколько усложнить алгоритм торгового робота, пытаясь, таким образом, сделать его более универсальным. Это не означает, что он однозначно лучше своего предшественника. И тот и другой могут показывать приличные результаты при различных характерах ценовых движений и правильно подобранных входящих параметрах переменных.
Я добавил в алгоритм фильтрацию сигналов посредством простой скользящей средней, таким образом, что когда цена находится ниже нее, могут открываться только короткие позиции, а когда выше — только длинные. В остальном всё то же самое: каждая короткая позиция может открываться по цене ниже либо равной предыдущей, а каждая длинная позиция — по цене выше либо равной предыдущей. Ах да, кроме этого я стал обнулять счетчик при каждом переходе цены через скользящую среднюю. То есть, теперь начало отсчета для длинных и коротких позиций будет перемещаться вместе со скользящей средней, и применять этого робота можно на любом временном промежутке.
Итак, алгоритм торгового робота следующий:
1) Робот проверяет наличие открытых торговых позиций, если открытые позиции есть, ничего не происходит, если открытых позиций нет, то работает дальше;
2) А дальше определяемся, с какой стороны от скользящей средней находится в данный момент цена;
3) Если цена находится ниже скользящей средней и при этом она ниже или равна цене открытия предыдущей короткой позиции, то открывается короткая позиция;
4) Если цена находится выше скользящей средней и при этом она выше или равна цене открытия предыдущей длинной позиции, то открывается длинная позиция;
5) Далее открытая позиция закрывается либо по ордеру стоп-лосс, либо по ордеру тейк-профит и цикл повторяется.
Примечание: в пунктах 3 и 4 в случаях, когда цена только пересекла скользящую среднюю, предыдущих позиций может и не быть, в этом случае позиция просто открывается по текущей цене.
А вот и текст программы, который вы при желании можете скопировать и использовать, как вашей душе будет угодно. Я нежадный.
#property copyright "Blokhin Oleg" #property link "azbukatreydera.ru" int b,s,w=0,p=20,sl=200,tp=200; double pos=1,v,v1,n,n1; int start() { if(w=0) {v1=Bid; n1=Bid; w=1; } //--засекаем текущее значение цены v=Bid;//для счетчика коротких позиций n=Bid;//для счетчика длинных позиций //-------------------------------- if(OrdersTotal()==0)//если открытых ордеров нет { if(Bid<iMA(NULL,0,p,0,MODE_SMA,PRICE_CLOSE,0)) {if(v<=v1)//если текущее значение цены меньше либо равно предыдущему {s=OrderSend(Symbol(),OP_SELL,pos,Bid,3,Bid+sl*Point,Bid-tp*Point,0); v1=Bid;//отсечка цены продажи n1=Bid;//обнуление для счетчика длинных позиций } } if(Bid>iMA(NULL,0,p,0,MODE_SMA,PRICE_CLOSE,0)) {if(n>=n1)//если текущее значение цены больше либо равно предыдущему {b=OrderSend(Symbol(),OP_BUY,pos,Ask,3,Ask-sl*Point,Ask+tp*Point,0); n1=Bid;//отсечка цены покупки v1=Bid;//обнуление для счетчика коротких позиций } } } return; }