Jump to content
dao

Советник - Коррекция Объема

Recommended Posts

Igonter

Добавил "режим портфеля МТС", когда все позиции открываются/закрываются пропорционально, с сохранением MagicNumber.

Постараюсь ЭТОТ режим испытать на реале сегодня-завтра...

Volume Correction v4.0.mq4

Share this post


Link to post
Share on other sites
Igonter

Попробовал на реале. На этот раз сработало, но выявилось еще 2 бага. Поправил в этой версии.

1) Учитывались отложки тоже, чего быть не должно

2) По всей программе стояли вызовы Бид и Аск, хотя идет работа с разными инструментами. Результат - ошибка 129 на инструментах, отличных от текущего.

 

PS. Забыл отладочную заглушку удалить, заменил файл... :)

Volume Correction v4.1.mq4

Edited by Igonter

Share this post


Link to post
Share on other sites
Igonter

И еще один момент. Частичное закрытие на ПАММах происходит через переоткрытие ордера. Поэтому, если в торговом советнике используется в явном виде обращение к уровню открытия OrderOpenPrice(), работать после этого оно будет некорректно.

В связи с этим, в своих советниках я заменил стандартную функцию на свою

GetMyOrderOpenPrice() . Рекурсия, первый вызов - с параметром IsHistory==False.

double GetMyOrderOpenPrice(int ticket, bool IsHistory)

{

string comments="";

int index,new_ticket;

double Open_Price;

 

if (IsHistory)

OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY);

else

OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

comments=StringTrimRight(OrderComment());

index=StringFind(comments, "from #", 0);

if (index>=0)

{

new_ticket=StrToInteger(StringSubstr(comments, index+6));

Open_Price=GetMyOrderOpenPrice(new_ticket,true);

}

else

Open_Price=OrderOpenPrice();

if (IsHistory)

OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY);

else

OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

return(Open_Price);

}

Share this post


Link to post
Share on other sites
Igonter

Два дня на реале, на полном автомате. Ура, товарищи! :)

По крайней мере, "режим портфеля МТС" работает как положено.

А остальное я уже проверить не могу :roll:

Share this post


Link to post
Share on other sites
Programmer
Два дня на реале, на полном автомате. Ура, товарищи! :)

По крайней мере, "режим портфеля МТС" работает как положено.

А остальное я уже проверить не могу :roll:

 

Молодец, Igonter! =D>

Спасибо!

Share this post


Link to post
Share on other sites
dao
Молодец, Igonter! =D>

Спасибо!

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

С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
goI
Жаль, что не удалось услышать Начальника Транспортного Цеха...

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


.

Share this post


Link to post
Share on other sites
goI
Однако, мне казалось, что такой важный советник должен был быть разработан ведущим этого раздела, а не нашими клиентами. Это к вопросу о необходимости и пользе этого ведущего.

поправил... во всяк случае я так воспринял Ваши слова...


.

Share this post


Link to post
Share on other sites
Programmer
Однако, мне казалось, что такой важный советник должен был быть разработан ведущим этого раздела, а не нашими клиентами. Это к вопросу о необходимости и пользе этого раздела.

 

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

 

К сожалению, всё не успеваю. О пользе и необходимости судите сами.

Share this post


Link to post
Share on other sites
dao
К сожалению, всё не успеваю.

Без 2 недель год, как была поставлена эта задача. :smt102

Это самый важный советник в этом разделе, к тому же от администрации.


С уважением, Дмитрий Орлов.

Share this post


Link to post
Share on other sites
Trosh

А из какого поста в итоге брать советника?

Share this post


Link to post
Share on other sites
Igonter
А из какого поста в итоге брать советника?
Из этого

Я написал и проверил только "режим портфеля МТС", т.е. при ModeMTS=1

Это - точно работает, висит у меня на реале уже больше месяца.

Остальные режимы не проверял. :roll:

Share this post


Link to post
Share on other sites
Trosh
Из этого

Я написал и проверил только "режим портфеля МТС", т.е. при ModeMTS=1

Это - точно работает, висит у меня на реале уже больше месяца.

Остальные режимы не проверял. :roll:

 

А если я торгую руками то этот советник мне не подойдет?

Share this post


Link to post
Share on other sites
Igonter
А если я торгую руками то этот советник мне не подойдет?
Подойдет. Главное, чтоб он запущен был в момент ролловера.

Share this post


Link to post
Share on other sites
Igonter

Один из управляющих обратил мое внимание на то, что на счетах типа NDD советник коррекции объема работает неправильно. Причиной было маркет-исполнение (т.е. невозможность отправить рыночный ордер сразу со стопом и профитом).

Выкладываю новую версию, адаптированную для ПАММ-ов типа NDD. Она же подойдет и для классика, просто там теперь есть переключатель ModeMarket. Для счетов Classic нужно выставить ModeMarket=0, для NDD

ModeMarket=1.

Volume Correction v4.2.mq4

  • Thanks 2
  • Downvote 1

Share this post


Link to post
Share on other sites
Melady

Здравствуйте.

 

У меня несколько вопросов по работе советника корректировки обьемов Volume Correction v4.2

 

1. Количество средств увеличилось до 19000 и Советник не откорректировал количество лотов при вводе средств в сумме 550 в один ролловер и 250 в другой. (Ранее советник работал нормально)

 

2. Вопрос к программистам. Как можно доработать советник, чтобы он корректировал не только лоты рабочих ордеров, а и отложенных ордеров. (Например стоит 3 ордера BUYSTOP и 3 ордера SELLSTOP. Я думаю, что надо в массив записать отложенные ордера и потом выбирая из массива по одному удалять старый и устанавливать новый с новым количеством лотов. Но с массивами я не очень разобралась)


Невозможно победить того, кто не сдается. (Бейб Рут)   

Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения).

Share this post


Link to post
Share on other sites
Pavel Kononenko

Елена, разобрались с отложками? Или нужна помощь?

Share this post


Link to post
Share on other sites
Melady
Елена, разобрались с отложками? Или нужна помощь?

 

Пока не разобралась. Я самоучка в программировании, и не все тонкости понимаю.

Мне надо время, чтобы разобраться. А если Вы хотите помочь, то с радостью приму помощь.

Благодарю. :-D


Невозможно победить того, кто не сдается. (Бейб Рут)   

Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения).

Share this post


Link to post
Share on other sites
Pavel Kononenko

if (OrderType()==OP_BUYSTOP){
 res = OrderSend(sym,OP_BUYSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);
 if (res>0) OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP){
 res = OrderSend(sym,OP_SELLSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);
 if (res>0) OrderDelete(OrderTicket());
}

 

Добавить в обоих случаях, после этого

if (OrderType()==OP_BUY) 
 res=... 
else
 ...

где else заменить на

if(OrderType()==OP_SELL)
... 

Если объем лотов будет больше 100, то надо будет дробить. Потом скажу где подкорректировать.

Share this post


Link to post
Share on other sites
Melady
if (OrderType()==OP_BUYSTOP){
 res = OrderSend(sym,OP_BUYSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);
 if (res>0) OrderDelete(OrderTicket());
}
if (OrderType()==OP_SELLSTOP){
 res = OrderSend(sym,OP_SELLSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);
 if (res>0) OrderDelete(OrderTicket());
}

Добавить в обоих случаях, после этого

if (OrderType()==OP_BUY) 
 res=... 
else
 ...

где else заменить на

if(OrderType()==OP_SELL)
... 

Если объем лотов будет больше 100, то надо будет дробить. Потом скажу где подкорректировать.

 

Большое спасибо, Павел.

Попробую разобраться.


Невозможно победить того, кто не сдается. (Бейб Рут)   

Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения).

Share this post


Link to post
Share on other sites
AntFX
if (OrderType()==OP_BUYSTOP){

res = OrderSend(sym,OP_BUYSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);

if (res>0) OrderDelete(OrderTicket());

}

По-хорошему, тикет нужно сохранять перед OrderSend. Потому что не гарантирована сохранность выделения текущего выбранного ордера. Скорее всего он останется выбранным, но может быть что и новый ордер будет выбранным.

Тогда код выглядел бы так:

if (OrderType()==OP_BUYSTOP){

int now_tick=OrderTicket();

res = OrderSend(sym,OP_BUYSTOP,lot,OrderOpenPrice(),slip,0,0,OrderComment(),OrderMagicNumber(),0);

if (res>0) OrderDelete(now_tick);

}

 

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

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

 

if (OrderType()>=2)
{ 
double dist=0;
switch(OrderType())
{
  case OP_BUYSTOP: dist=OrderOpenPrice()-Ask;
  case OP_SELLSTOP: dist=Bid-OrderOpenPrice();
  case OP_BUYLIMIT: dist=Ask-OrderOpenPrice();
  case OP_SELLLIMIT: dist=OrderOpenPrice()-Bid;
}
if(dist>=MathMax(100*Point,(Ask-Bid)*5))
{
if(OrderDelete(OrderTicket()))
{
OrderSend(...); 
}
}
}

 

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

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Pavel Kononenko
По-хорошему, тикет нужно сохранять перед OrderSend. Потому что не гарантирована сохранность выделения текущего выбранного ордера.

Гарантирована. MQL4 имеет синхронную архитектуру исполнения. В JS не сработало бы)

Там в том дело, что циклом перебираются открытые ордера по позициям. И переменную новую объявлять нельзя в цикле. Можно во вне. Но зачем?

 

Пы.Сы: советник универсальный и не зависит от схемы частичного закрытия ордеров.

Share this post


Link to post
Share on other sites
Melady
По-хорошему, тикет нужно сохранять перед OrderSend. Потому что не гарантирована сохранность выделения текущего выбранного ордера. Скорее всего он останется выбранным, но может быть что и новый ордер будет выбранным.

Тогда код выглядел бы так:

 

 

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

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

 

if (OrderType()>=2)
{ 
double dist=0;
switch(OrderType())
{
  case OP_BUYSTOP: dist=OrderOpenPrice()-Ask;
  case OP_SELLSTOP: dist=Bid-OrderOpenPrice();
  case OP_BUYLIMIT: dist=Ask-OrderOpenPrice();
  case OP_SELLLIMIT: dist=OrderOpenPrice()-Bid;
}
if(dist>=MathMax(100*Point,(Ask-Bid)*5))
{
if(OrderDelete(OrderTicket()))
{
OrderSend(...); 
}
}
}

 

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

Но в моем случае есть несколько отложенных ордеров с разными SL и TP. Поэтому все отложенные ордера по-моему надо сначала загнать в массив, удалить и только потом выставить новые откорректированные.

А вот с массивами я не очень разобралась.

Спасибо.


Невозможно победить того, кто не сдается. (Бейб Рут)   

Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения).

Share this post


Link to post
Share on other sites
AntFX

По просьбам трудящихся добавил в советник опцию корректировки отложенных ордеров.

 

Новые параметры:

CorrPendings - корректировать отложенные ордера да/нет (по умолчанию нет)

MinIncrease - минимальный процент ввода средств, при котором производим увеличение ордеров

MinDecrease - минимальный процент вывода средств, при котором производим уменьшение ордеров

MinDistance - минимальное количество пунктов от текущей цены до цены ордера, чтобы его можно было корректировать.

Пользователю следует самостоятельно следить, чтобы этот параметр был больше, чем минимальный уровень выставления отложенных ордеров,

иначе ордера будут удаляться, но не будут устанавливаться заново.

ForcedDecrease - если выведено данное число процентов от эквити или более, то пытаемся заменить ордер, даже если он располагается ближе MinDistance

PendMode - порядок коррекции отложенных ордеров

0 - Порядок ордеров при корректировке не важен

1 - Ордера перевыставляются в порядке уменьшения их объема (от большего к меньшему, независимо от символа)

2 - Ордера перевыставляются в порядке близости к текущей цене (сначала наиболее близкие, потом более далекие, независимо от символа)

 

У меня в данный момент нет возможности проверить корректность работы, так как нет открытого памма, так что если что не так, прошу больно не пинать :)

Volume Correction v5.0.rar

  • Thanks 1

1

Share this post


Link to post
Share on other sites
EGOBOSS

У меня в данный момент нет возможности проверить корректность работы, так как нет открытого памма, так что если что не так, прошу больно не пинать :)

А что если открыть центовый счет, закинуть туда 50 у.е., открыть отложки и повыводить\вводить туда-сюда средства? Или я чего-то не понимаю?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×