Здравствуйте уважаемые программисты! Прошу написать хеджирующий советник по следующей стратегии:
По заданному условию открывается первый ордер buy либо sell (зависит от условия — скажем для buy: Open[1]<Close[1] && Open[0]>Close[1]
для sell: Open[1]>Close[1] && Open[0 ]<Close[1] ) Хотя не суть важно. У этого первого ордера
предположим buy, выставляется тейк профит и одновременно с ним на расстоянии N пунктов выставляется sellstop с увеличенным лотом. Если цена дошла до тейк профита-
sellstop удаляется и цикл начинается снова. Если цена пошла вниз и сработал sellstop-
тейк профит первого ордера удаляется и открывается buystop также с увеличенным лотом на уровне открытия первого ордера buy. Дальше если цена пошла вниз — ждём суммарного профита (в валюте) и закрываем все ордера. Если цена пошла вверх и сработал buystop — и цена пошла дальше — также ждём закрытия по суммарному профиту. И так далее.
Между ордерами sellstop и buystop всегда одинаковое расстояние заданное в меню.
stoploss ордеров не выставляется. Тейк профит выставляется только у первого ордера и удаляется после сработавшего за ним стопового ордера. Все ордера (их может быть
несколько, поэтому ввести в меню ограничение по колличеству) закрываются по достижению суммарного профита в валюте.
В меню должно быть:
— расстояние между ордерами (около 30)
— тейк профит первого ордера
— уровень суммарного профита для закрытия ордеров
— лот1 — 0.01
— лот2 — 0.02
— лот3 — 0.03
— лот4 — 0.06
— лот5 — 0.12
— лот6 — 0.24
— лот7 — 0.48
— лот8 — 0.96
— лот9 — 1.92
— лот10- 3.84
— колличество открытых ордеров ( хотя может это лишнее)
— проскальзывание цены
— магическое число
картинка для пояснения:
shot.qip.ru/00GmGP-6Ogbqip2b/
Комментарии (45)
35 AM2 Сообщений: 16665 - Андрей
35 AM2 Сообщений: 16665 - Андрей
35 AM2 Сообщений: 16665 - Андрей
А то я не у компьютера.
9 vikas Автор Сообщений: 113 - Алексей
www.opentraders.ru/downloads/890/
35 AM2 Сообщений: 16665 - Андрей
Так, нет как то всё не так. Давай с самого начала.
Сов начинает работу — открывается предположим buy. У него выставляется тейк профит.
Одновременно с этим выставляется sellstop(на величину дельта указанную в меню).
К примеру, цена до ТП не дошла, развернулась и пошла вниз. Сработал sellstop-
т.е. открылся sell. Сразу же выставляется buystop. Выставляется он на том же уровне что и первый ордер buy. Затем цена гуляет туда сюда и идёт вверх — сра-
батывает buystop, тут же выставляется sellstop (на том же уровне, что и предыдущий открытый ордер sell, дальше цена погуляла вверх, недобрала суммарного
профита и пошла круто вниз — сработал sellstop, естественно выставился buystop,
(у нас уже открыто 4 ордера, суммарный объём sell превышает суммарный объём buy)
но цена продолжила движение вниз, и как только суммарный профит достиг уровня указанного в меню т.е. как только профит ордеров sell превысил просадку ордеров
buy, советник закрывает все эти ордера.
Не должно быть никаких стоплосов. Тейк профит только у первоначального ордера и
удаляется если цена пошла в другую сторону и сработал стоповый ордер.
Посмотри пожалуйста картинку shot.qip.ru/00GmGP-3Ogbqip3K/
Все ордера buy по одной цене и все sell по одной цене, между ними дельта
лот каждого последующего открываемого ордера должен повышаться как в ТЗ Редактирован: 6 октября 2015, 19:39
9 vikas Автор Сообщений: 113 - Алексей
35 AM2 Сообщений: 16665 - Андрей
9 vikas Автор Сообщений: 113 - Алексей
www.opentraders.ru/downloads/890/
35 AM2 Сообщений: 16665 - Андрей
Входящие параметры не меняла, тестировала евро с июля по октябрь 2015. Ушло на юг
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Входные параметры по умолчанию, стоят левые. Ставила на оптимизацию?
35 AM2 Сообщений: 16665 - Андрей
Тогда чем не устраивает, советник с мкл? Если бы вы мне сразу дали ссылку на советник, мне это облегчило бы работу в разы.
35 AM2 Сообщений: 16665 - Андрей
закрываются по суммарному профиту. Но если ТП первого ордера поставить 20
(каким он и должен быть) то ты увидишь, что ТП почемуто у всех ордеров. А он
должен быть только у первоначального ордера. Вот посмотри ССылку
www.mql5.com/ru/market/product/11420
Это то самое. Только у него закрываются по определённому колличеству пунктов
указанных в меню. А это я считаю не совсем правильно. Надо в валюте. Да с
йеной почемуто не работает. А так идёт на север.
Всё, убегаю на работу. Буду только поздно вечером.
Скачай, прогони на визуализации на Eurusd H1
9 vikas Автор Сообщений: 113 - Алексей
обьяснения. Насчет этого советника. нужно чтобы закрытие было
в валюте. во вторых он не работает с йеной -что то с запятой.
третье хотелось иметь возможность редактирования кода.
9 vikas Автор Сообщений: 113 - Алексей
<code> //+------------------------------------------------------------------+ //| HedgeMartin.mq4 | //| Copyright 2015, AM2 | //| http://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, AM2" #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern int StopLoss = 300; // лось extern int TakeProfit = 500; // язь extern int Delta = 200; // дельта extern double Profit = 100; // профит в валюте extern double Lots = 0.1; // лот extern int Slip = 30; // проскальзывание extern int Count = 1; // количество открываемых ордеров extern int Magic = 123; // магик double Lot[10]={0.01,0.02,0.03,0.06,0.12,0.24,0.48,0.96,1.92,3.84}; double BuyStopPrice=0, SellStopPrice=0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++; } } } return(count); } //+------------------------------------------------------------------+ int LastOrderType() { int type=0; if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) type=1; //sell if(OrderType()==OP_SELL) type=2; //buy } } return(type); } //+------------------------------------------------------------------+ void CloseAll() { bool cl=true; double pBid,pAsk; for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { pBid=MarketInfo(OrderSymbol(),MODE_BID); pAsk=MarketInfo(OrderSymbol(),MODE_ASK); if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),fND(pBid),Slip,Blue); if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),fND(pAsk),Slip,Red); } } } } //+------------------------------------------------------------------+ double fND(double d,int n=-1) { if(n<0) return(NormalizeDouble(d, Digits)); return(NormalizeDouble(d, n)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double AllProfit() { double profit=0; for(int i=OrdersTotal()-1;i>=0;i--) { bool sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) if(OrderType()==OP_BUY || OrderType()==OP_SELL) profit+=OrderProfit(); } return(profit); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DelOrder() { bool del; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; { if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue; { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderType()==OP_BUYSTOP) del=OrderDelete(OrderTicket()); if(OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket()); } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int LastDealResult() { int result=0; if(OrdersHistoryTotal()==0) { result=0; } if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY)) { if(OrderProfit()>0) { result=1;//tp } if(OrderProfit()<0) { result=2;//sl } } return(result); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // торгуем int res=0,i=0; double tp=0,bid=0,ask=0,pr=0; bid=MarketInfo(Symbol(),MODE_BID); ask=MarketInfo(Symbol(),MODE_ASK); i=CountTrades(); // открытие первого ордера по условию if(CountTrades()<1) { //---- buy if(Open[1]<Close[1] && Open[0]>Close[1]) { tp=NormalizeDouble(ask+TakeProfit*Point,Digits); res=OrderSend(Symbol(),OP_BUY,Lot[i],NormalizeDouble(ask,Digits),Slip,0,tp,"",Magic,0,Blue); BuyStopPrice=ask; SellStopPrice=ask-Delta*Point; i++; return; } //---- sell if(Open[1]>Close[1] && Open[0]<Close[1]) { tp=NormalizeDouble(bid-TakeProfit*Point,Digits); res=OrderSend(Symbol(),OP_SELL,Lot[i],NormalizeDouble(bid,Digits),Slip,0,tp,"",Magic,0,Red); SellStopPrice=bid; BuyStopPrice=pr=bid+Delta*Point; i++; return; } } // открытие последующих ордеров if(CountTrades()>0) { if(LastOrderType()==1) { pr=SellStopPrice; res=OrderSend(Symbol(),OP_SELLSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Red); i++; return; } if(LastOrderType()==2) { pr=BuyStopPrice; res=OrderSend(Symbol(),OP_BUYSTOP,Lot[i],NormalizeDouble(pr,Digits),Slip,0,0,"",Magic,0,Blue); i++; return; } } if(LastDealResult()==1)DelOrder(); if(AllProfit()>=Profit) {CloseAll();DelOrder();} Comment("\n Profit: ",AllProfit(), "\n Last Order Type: ",LastOrderType()); } //+------------------------------------------------------------------+ </code>Редактирован: 7 октября 2015, 12:2835 AM2 Сообщений: 16665 - Андрей
должен быть только у первоначального ордера и удаляться если сработал
отложенник. А дальше все должно закрыться по суммарному профиту в валюте. Ты же ведь смотрел наверное работу советника.
(закроется не закроется — другой вопрос. Но логика должна быть такая)
Иначе нарушается стратегия. Конечно многое зависит от того, какой я
выставлю суммарный профит в меню. Тут есть свои тонкости. Надо вводить коэффициент по уровню суммарного профита после срабатывании очередного
отложенника. Но это уже другая история. Я лишь прошу повторить алгоритм
того советника.
9 vikas Автор Сообщений: 113 - Алексей
35 AM2 Сообщений: 16665 - Андрей
По йене — дело не в ноликах. Когда я ставлю дельту 30, советник устанавливает её 3000. Я бы рад поставить в меню 0.3, так не даёт.
9 vikas Автор Сообщений: 113 - Алексей
9 vikas Автор Сообщений: 113 - Алексей
Неужели пункт с дельтой и условием вызывает у вас затруднения?
Дельта в настройках. Нужно всего лишь поменять инт на дабл.
А для входов вызвать индикатор и прописать условие.
35 AM2 Сообщений: 16665 - Андрей
Редактирован: 7 октября 2015, 14:00
9 vikas Автор Сообщений: 113 - Алексей
Какой индикатор?
35 AM2 Сообщений: 16665 - Андрей
35 AM2 Сообщений: 16665 - Андрей
Вот посмотри на картинку shot.qip.ru/00GmGP-5Ogbqip5F/
Это последняя твоя версия. Всё замечательно. Только первый рыночный ордер BUY
закрылся по своему ТП уже после того как сработали отложенники. А нужно было
чтобы ТП этого первого ордера удалился после сработки sellstop и чтобы этот первый BUY закрылся вместе со всеми.
9 vikas Автор Сообщений: 113 - Алексей
Вы определитесь пожалуйста.
35 AM2 Сообщений: 16665 - Андрей
Здесь нормально. Дальше цена пошла вниз сработал Sellstop. ТП ордера Buy должен
удалиться. А он не удаляется. Что не так?
9 vikas Автор Сообщений: 113 - Алексей
на «by indicator». Тогда он тестится. (если тебе это ещё интересно)
9 vikas Автор Сообщений: 113 - Алексей
Думаете, он будет лучше работать, если закрытие в валюте, а не в пунктах?
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
В базе уже есть похожий советник с разными модификациями. Извините программисты что не сказал, думал будет что то новое.
14 beton2011 Сообщений: 895
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
он иногда открывает очень много ордеров. Очень здорово растёт маржа. По пунктам
он не доходит до закрытия. А вот в валюте мог бы. Ну и вообще я хотел поиграться
с кодом — изменить например условия открытия ордера, ввести какие нибудь коэффициенты, фильтры и т.д. Я уже так делал в предыдущих ваших с Андреем советниках.
9 vikas Автор Сообщений: 113 - Алексей
Одно из решений — более точные сигналы для входа.
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Так работает удаляет тейк:
А так ни в какую:
Смотрите может у вас получится:
35 AM2 Сообщений: 16665 - Андрей
Тогда может его не удалять а загнать
куда подальше. А в меню указать куда?
главное ведь что бы он не мешал.
Все равно ведь закрытие то в валюте?
Короче модифицировать?
9 vikas Автор Сообщений: 113 - Алексей
35 AM2 Сообщений: 16665 - Андрей
Или в процессе модификации?
Если первое то не подходит.
Если второе то я об этом и говорил.
9 vikas Автор Сообщений: 113 - Алексей
спасибо за упорство и терпение. Дальше я сам.
9 vikas Автор Сообщений: 113 - Алексей
9 vikas Автор Сообщений: 113 - Алексей
16 cerber04 Сообщений: 409
9 vikas Автор Сообщений: 113 - Алексей
Научилась делать графики, смотрящие строго на север.
Осталось выровнять кривую баланса.
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
35 AM2 Сообщений: 16665 - Андрей
9 vikas Автор Сообщений: 113 - Алексей
Вот советник
yadi.sk/d/42dCUGHJpPpKE
15 cashyra Сообщений: 392 - Юра
Нужно ставить на отладку, а это трейдерам от 3-го уровня после создания топика с столе заказов.
35 AM2 Сообщений: 16665 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий