Jump to content

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


Recommended Posts

Igonter

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

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

Volume Correction v4.0.mq4

Link to post
Share on other sites
  • Replies 267
  • Created
  • Last Reply

Top Posters In This Topic

  • AntFX

    81

  • solandr

    33

  • Melady

    18

  • Igonter

    16

Top Posters In This Topic

Popular Posts

Пожалуйста: новый параметр Rounding отвечает за метод округления до минимального шага лота. 1 - до ближайшего меньшего, 2 - до ближайшего большего, 3 - до ближайшего "целого". По умолчанию установлен

А ещё Вы можете, solandr, создать собственный корректировщик и открыто выложить его для скачивания в этом разделе, изложив подробно принципы, заложенные в его основу. Вот это было бы конструктивно. Пр

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

Posted Images

Igonter

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

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

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

 

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

Volume Correction v4.1.mq4

Edited by Igonter
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);

}

Link to post
Share on other sites
Igonter

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

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

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

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

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

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

 

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

Спасибо!

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

Спасибо!

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

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

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

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


.

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

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


.

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

 

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

 

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

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

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

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


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

Link to post
Share on other sites
  • 1 month later...
Trosh

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

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

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

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

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

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

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

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

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

 

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

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

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

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

ModeMarket=1.

Volume Correction v4.2.mq4

  • Thanks 2
  • Downvote 1
Link to post
Share on other sites
  • 2 years later...
Melady

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

 

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

 

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

 

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


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

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

Link to post
Share on other sites
Pavel Kononenko

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

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

 

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

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

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


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

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

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, то надо будет дробить. Потом скажу где подкорректировать.

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, то надо будет дробить. Потом скажу где подкорректировать.

 

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

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


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

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

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

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

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

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

 

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

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. Поэтому все отложенные ордера по-моему надо сначала загнать в массив, удалить и только потом выставить новые откорректированные.

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

Спасибо.


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

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

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

Link to post
Share on other sites
EGOBOSS

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    No registered users viewing this page.


×
×
  • Create New...