Технический взгляд. Советники

Технический взгляд. Советники

3 марта 2016, 21:03
Alexey Surkov
0
187

Основное отличие советников от индикаторов в том, что в них можно использовать функции открытия, закрытия и модификации ордеров. Все эти функции есть в разделе Торговых функций. И находятся советники в папке Experts. Мы рассматриваем три советника, два из них в архиве.

Советник Zakryvator закрывает ордера при достижении ими заданного убытка в зависимости от объема ордера. Его ставим на любой график, а ордера он будет закрывать любые, не только открытые по этой паре.

Во входных параметрах мы присваиваем значения убытка по умолчанию на объем ордера:

input double min_001_002 =4;
input double min_002_005 =8;
input double min_005_01 =10;
input double min_01_03 =15;
input double min_03_05 =20;
input double min_05_1 =25;
input double min_from1 =30;

Функция void OnTick() запускает советник с каждым новым тиком на паре, где он установлен.

Далее перебираем ордера по порядковому номеру и выбираем каждый из открытых ордеров:

int _GetLastError = 0, _OrdersTotal = OrdersTotal();
for ( int z = _OrdersTotal – 1; z >= 0; z — )
{ if ( !OrderSelect( z, SELECT_BY_POS ) )

Теперь проверяем 2 условия: соответствие объема ордера заданному и текущий убыток по нему должен превышать заданное значение, умноженное на (-1):

if ( OrderLots()<=0.02 &&  OrderProfit()<= min_001_002*(-1)) 

А потом разделяем ордера на продажу и покупку, дабы правильно задать им цену закрытия (Bid или Ask).  if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),2,Violet))

При чем, мы используем тут функцию NormalizeDouble(Bid,Digits). Она округляет нам значение цены до количества знаков после запятой в терминале на паре, где этот ордер открыт (Digits).  Без использования этой функции есть вероятность, что цена на закрытие будет посылаться в виде 1.2345500000000 вместо 1.23455. Как результат – ошибка 4107. Хотя можно и проще. Использовать функцию OrderClosePrice().

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

Советник   Loss-Take выставляет стоп лосс и тейк профит на любой ордер в пунктах, которые задаются пользователем. Для пары USDDKK эти значения он увеличивает в 2,5 раза. Во входных параметрах мы задаем в пунктах эти значения. Аналогично предыдущему советнику перебираются открытые ордера. Далее проверяется условие:

 if(OrderType()==OP_BUY &&  OrderStopLoss()==0 &&  OrderSymbol()!=”USDDKK”)

Если ордер на покупку, он не имеет стопа (стоп равен нулю) и он открыт не по паре USDDKK, то он его модифицирует:

if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-MarketInfo(OrderSymbol(),MODE_POINT)*StopLoss,OrderOpenPrice()+MarketInfo(OrderSymbol(),MODE_POINT)*TakeProfit,0,Green))

Аналогично при установке стопа и тейка используется функция MarketInfo(OrderSymbol(),MODE_POINT), возвращающая размер пункта инструмента, где открыт ордер. Для ордеров для пары USDDKK в условии идет проверка, что открыт ордер по этой паре, а в модификации умножаем наши значения на 2,5.

 Архив с рассмотренными советниками на моем сайте 

Файлы:
Поделитесь с друзьями: