Учимся писать эксперты для 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