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

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

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


   Вопрос – ответ


   Андрей Сироткин прислал 2 интересных вопроса.


   “1. Я хочу что б эксперт торговал по определенной паре, но я бы мог играть вручную по другой. В эксперте вход осуществляется при условии
   if TotalTrades<1 then {
   Но потому что, я открываю позицию вручную по другой паре, вход в эксперт не может осуществиться (ведь if TotalTrades уже =1) по паре к которой прикреплен эксперт.
   Что можно сделать?

   ..”


   Ответ:


/*[[
Name := test
Lots := 1.00
Stop Loss := 0
Take Profit := 0
Trailing Stop := 0
]]*/
var : cnt(0),tt(0);
for cnt=1 to totaltrades { if OrderValue(cnt,VAL_SYMBOL)=Symbol then tt=tt+1;};
if tt=0 then {…


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


   ” 2. Можно ли сделать, так что бы эксперт понимал, какие сделки открыл он, а какие открыл я? Это нужно для возможности торговли экспертом и руками на одной паре. …”


   Ответ:


   Специальных идентификаторов для открытых позиций в МТ нет. Для идентификации позиций удобно использовать размер лота (с тех ДЦ где поддерживаются дробные размеры). Например, Вы играете вручную 1 лотом, тогда экспертом по этой же паре, Вы можете торговать 1.1 лота или 0.9. ММ от этого сильно не пострадает, хотя, конечно, это надуманное решении, но ничего не остается.


var : cnt(0),tt(0);
for cnt=1 to totaltrades { if OrderValue(cnt,VAL_SYMBOL)=Symbol and
OrderValue(cnt,VAL_LOTS)=lots then tt=tt+1;};


   Похоже на первый случай, но отсеивание открытых позиций идет еще и по размеру лота.


   Александр Е. спрашивает.


   “Могу ли я закрыть часть открытой позиции, например по достижении определенного профита? …”


   Ответ:


   Да это возможно, но не во всех ДЦ.


   Код эксперта будет примерно такой:


…….
lot=0.5;
for cnt=1 to TotalTrades
{
if OrderValue(cnt,VAL_TYPE)<=OP_SELL and
OrderValue(cnt,VAL_SYMBOL)=Symbol then
{
If OrderValue(cnt,VAL_TYPE)=OP_BUY then
{
if (bid-OrderValue(cnt,VAL_OPENPRICE))>20*point then {
CloseOrder(OrderValue(cnt,VAL_TICKET),lot,Bid,3,Violet);
Exit;
};


};
If OrderValue(cnt,VAL_TYPE)=OP_SELL then
{
if (OrderValue(cnt,VAL_OPENPRICE)-ask)> 20*point then {
CloseOrder(OrderValue(cnt,VAL_TICKET),lot,ask,3,Violet);
Exit;
};
};
};
};};
……..


CloseOrder(OrderValue(cnt,VAL_TICKET),lot,Bid,3,Violet);


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


   До сих пор приходят вопросы о таймауте. Уважаемы читатели, перед тем как задавать вопросы, убедительно рекомендую прочитать все выпуски журнала.


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


   if curtime-LastTradeTime<11 then exit;


Халхальян Артур
artur@fxtest.ru