Igonter 404 Share Posted August 11, 2009 Добавил "режим портфеля МТС", когда все позиции открываются/закрываются пропорционально, с сохранением MagicNumber. Постараюсь ЭТОТ режим испытать на реале сегодня-завтра... Volume Correction v4.0.mq4 Quote Link to post Share on other sites
Igonter 404 Share Posted August 12, 2009 (edited) Попробовал на реале. На этот раз сработало, но выявилось еще 2 бага. Поправил в этой версии. 1) Учитывались отложки тоже, чего быть не должно 2) По всей программе стояли вызовы Бид и Аск, хотя идет работа с разными инструментами. Результат - ошибка 129 на инструментах, отличных от текущего. PS. Забыл отладочную заглушку удалить, заменил файл... Volume Correction v4.1.mq4 Edited August 12, 2009 by Igonter Quote Link to post Share on other sites
Igonter 404 Share Posted August 12, 2009 И еще один момент. Частичное закрытие на ПАММах происходит через переоткрытие ордера. Поэтому, если в торговом советнике используется в явном виде обращение к уровню открытия 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); } Quote Link to post Share on other sites
Igonter 404 Share Posted August 14, 2009 Два дня на реале, на полном автомате. Ура, товарищи! По крайней мере, "режим портфеля МТС" работает как положено. А остальное я уже проверить не могу Quote Link to post Share on other sites
Programmer 33 Share Posted August 14, 2009 Два дня на реале, на полном автомате. Ура, товарищи! По крайней мере, "режим портфеля МТС" работает как положено. А остальное я уже проверить не могу Молодец, Igonter! Спасибо! Quote Link to post Share on other sites
|Alpari| 172 Author Share Posted August 14, 2009 Молодец, Igonter! Спасибо! Однако, мне казалось, что такой важный советник должен был быть разработан ведущим этого раздела, а не нашими клиентами. Это к вопросу о необходимости и пользе этого раздела. Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
goI 21 Share Posted August 14, 2009 Жаль, что не удалось услышать Начальника Транспортного Цеха... и мой шумогрыз не делается... даже ответа не получил... пойду у Игонтера канючиць... мож сделает... Quote . Link to post Share on other sites
goI 21 Share Posted August 14, 2009 Однако, мне казалось, что такой важный советник должен был быть разработан ведущим этого раздела, а не нашими клиентами. Это к вопросу о необходимости и пользе этого ведущего. поправил... во всяк случае я так воспринял Ваши слова... Quote . Link to post Share on other sites
Programmer 33 Share Posted August 15, 2009 Однако, мне казалось, что такой важный советник должен был быть разработан ведущим этого раздела, а не нашими клиентами. Это к вопросу о необходимости и пользе этого раздела. и мой шумогрыз не делается... даже ответа не получил... пойду у Игонтера канючиць... мож сделает... К сожалению, всё не успеваю. О пользе и необходимости судите сами. Quote Link to post Share on other sites
|Alpari| 172 Author Share Posted August 16, 2009 К сожалению, всё не успеваю. Без 2 недель год, как была поставлена эта задача. Это самый важный советник в этом разделе, к тому же от администрации. Quote С уважением, Дмитрий Орлов. Link to post Share on other sites
Trosh 0 Share Posted September 25, 2009 А из какого поста в итоге брать советника? Quote Link to post Share on other sites
Igonter 404 Share Posted September 25, 2009 А из какого поста в итоге брать советника?Из этогоЯ написал и проверил только "режим портфеля МТС", т.е. при ModeMTS=1 Это - точно работает, висит у меня на реале уже больше месяца. Остальные режимы не проверял. Quote Link to post Share on other sites
Trosh 0 Share Posted September 25, 2009 Из этогоЯ написал и проверил только "режим портфеля МТС", т.е. при ModeMTS=1 Это - точно работает, висит у меня на реале уже больше месяца. Остальные режимы не проверял. А если я торгую руками то этот советник мне не подойдет? Quote Link to post Share on other sites
Igonter 404 Share Posted September 25, 2009 А если я торгую руками то этот советник мне не подойдет?Подойдет. Главное, чтоб он запущен был в момент ролловера. Quote Link to post Share on other sites
Igonter 404 Share Posted November 17, 2010 Один из управляющих обратил мое внимание на то, что на счетах типа NDD советник коррекции объема работает неправильно. Причиной было маркет-исполнение (т.е. невозможность отправить рыночный ордер сразу со стопом и профитом). Выкладываю новую версию, адаптированную для ПАММ-ов типа NDD. Она же подойдет и для классика, просто там теперь есть переключатель ModeMarket. Для счетов Classic нужно выставить ModeMarket=0, для NDD ModeMarket=1. Volume Correction v4.2.mq4 2 1 Quote Link to post Share on other sites
Melady 1,359 Share Posted October 4, 2013 Здравствуйте. У меня несколько вопросов по работе советника корректировки обьемов Volume Correction v4.2 1. Количество средств увеличилось до 19000 и Советник не откорректировал количество лотов при вводе средств в сумме 550 в один ролловер и 250 в другой. (Ранее советник работал нормально) 2. Вопрос к программистам. Как можно доработать советник, чтобы он корректировал не только лоты рабочих ордеров, а и отложенных ордеров. (Например стоит 3 ордера BUYSTOP и 3 ордера SELLSTOP. Я думаю, что надо в массив записать отложенные ордера и потом выбирая из массива по одному удалять старый и устанавливать новый с новым количеством лотов. Но с массивами я не очень разобралась) Quote Невозможно победить того, кто не сдается. (Бейб Рут) Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения). Link to post Share on other sites
Pavel Kononenko 27 Share Posted October 11, 2013 Елена, разобрались с отложками? Или нужна помощь? Quote Link to post Share on other sites
Melady 1,359 Share Posted October 12, 2013 Елена, разобрались с отложками? Или нужна помощь? Пока не разобралась. Я самоучка в программировании, и не все тонкости понимаю. Мне надо время, чтобы разобраться. А если Вы хотите помочь, то с радостью приму помощь. Благодарю. :-D Quote Невозможно победить того, кто не сдается. (Бейб Рут) Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения). Link to post Share on other sites
Pavel Kononenko 27 Share Posted October 12, 2013 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, то надо будет дробить. Потом скажу где подкорректировать. Quote Link to post Share on other sites
Melady 1,359 Share Posted October 12, 2013 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, то надо будет дробить. Потом скажу где подкорректировать. Большое спасибо, Павел. Попробую разобраться. Quote Невозможно победить того, кто не сдается. (Бейб Рут) Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения). Link to post Share on other sites
AntFX 6,474 Share Posted October 12, 2013 (edited) 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 October 12, 2013 by AntFX Quote 1 Link to post Share on other sites
Pavel Kononenko 27 Share Posted October 12, 2013 По-хорошему, тикет нужно сохранять перед OrderSend. Потому что не гарантирована сохранность выделения текущего выбранного ордера. Гарантирована. MQL4 имеет синхронную архитектуру исполнения. В JS не сработало бы) Там в том дело, что циклом перебираются открытые ордера по позициям. И переменную новую объявлять нельзя в цикле. Можно во вне. Но зачем? Пы.Сы: советник универсальный и не зависит от схемы частичного закрытия ордеров. Quote Link to post Share on other sites
Melady 1,359 Share Posted October 13, 2013 По-хорошему, тикет нужно сохранять перед 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. Поэтому все отложенные ордера по-моему надо сначала загнать в массив, удалить и только потом выставить новые откорректированные. А вот с массивами я не очень разобралась. Спасибо. Quote Невозможно победить того, кто не сдается. (Бейб Рут) Для инвесторов, желающих вложить крупные суммы, я открываю персональный непубличный ПАММ. (обращаться в личные сообщения). Link to post Share on other sites
AntFX 6,474 Share Posted October 14, 2013 По просьбам трудящихся добавил в советник опцию корректировки отложенных ордеров. Новые параметры: CorrPendings - корректировать отложенные ордера да/нет (по умолчанию нет) MinIncrease - минимальный процент ввода средств, при котором производим увеличение ордеров MinDecrease - минимальный процент вывода средств, при котором производим уменьшение ордеров MinDistance - минимальное количество пунктов от текущей цены до цены ордера, чтобы его можно было корректировать. Пользователю следует самостоятельно следить, чтобы этот параметр был больше, чем минимальный уровень выставления отложенных ордеров, иначе ордера будут удаляться, но не будут устанавливаться заново. ForcedDecrease - если выведено данное число процентов от эквити или более, то пытаемся заменить ордер, даже если он располагается ближе MinDistance PendMode - порядок коррекции отложенных ордеров 0 - Порядок ордеров при корректировке не важен 1 - Ордера перевыставляются в порядке уменьшения их объема (от большего к меньшему, независимо от символа) 2 - Ордера перевыставляются в порядке близости к текущей цене (сначала наиболее близкие, потом более далекие, независимо от символа) У меня в данный момент нет возможности проверить корректность работы, так как нет открытого памма, так что если что не так, прошу больно не пинать Volume Correction v5.0.rar 1 Quote 1 Link to post Share on other sites
EGOBOSS 5 Share Posted October 17, 2013 У меня в данный момент нет возможности проверить корректность работы, так как нет открытого памма, так что если что не так, прошу больно не пинать А что если открыть центовый счет, закинуть туда 50 у.е., открыть отложки и повыводить\вводить туда-сюда средства? Или я чего-то не понимаю? Quote Link to post Share on other sites
Recommended Posts
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.