Здравствуйте, уважаемые разработчики!
Нужна Ваша помощь в добавлении(доработке) в советник условия на выставление ордеров от пользовательского стрелочного индикатора
ASCtrend.
Сам недавно начал изучать язык программирования mql4, но с добавлением стрелочного индикатора себе весь мозг вынес!?..
Код советника легко читаем, так что проблем у знающих возникнуть не должно. Работа с отложенными ордерами по фракталам.
Дело в том, что советник открывает и модифицирует ордера по каждому новому фракталу. Надо сделать так, чтобы он открывал и
модифицировал ордера только при появлении сигналов от индикатора
ASCtrend, т.е. при появлении сигнала от индикатора
ASCtrend на покупку, советник должен открыть или модифицировать отложенный ордер
SellStop на ближайший фрактал, тоже самое и для ордеров на покупку — при появлении сигнала от индикатора
ASCtrend на продажу, советник должен открыть или модифицировать отложенный ордер
BuyStop на ближайший фрактал. Для примера прилагаю скриншот:
Также не мешало бы изменить в нем TrailingStop от уровня безубытка, но это не столь важно.
Думаю, если посмотрите на его работу, сразу поймете что к чему!?..
Буду премного благодарен за помощь!
ASCtrend.mq4 (5 Kb)
Andrju81.mq4 (30 Kb)
Комментарии (19)
Когда сигнал появляется, его значение скажем 1.190237 как на скрине.
Значит наличие сигнала можем проверять не с помощью условия if(f_up>0) а if(f_up<2)
Проверить мое предположение не удалось, т.к. чужой код для меня темный лес
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
При появлении точки, выставляю ордер на расстоянии от цены:
Что вам мешает сделать, подобным образом?
35 AM2 Сообщений: 16665 - Андрей
Вот часть кода советника, отвечающая за открытие и модификацию ордеров на покупку с комментариями:
в этом случае ордера будут выставляться только если появляются сигналы от индикатора ASCtrend и фрактал на третьем баре от текущей цены, а мне надо, чтобы поиск ближайшего фрактала начинался с первого или второго бара, пока не найдется подходящий!?.. Как это лучше сделать?!.. Редактирован: 17 января 2015, 16:46
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
<code> //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 07.10.2006 | //| Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| mode - тип фрактала (MODE_LOWER|MODE_UPPER) | //+----------------------------------------------------------------------------+ double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) { if (sy=="" || sy=="0") sy=Symbol(); double f=0; int d=MarketInfo(sy, MODE_DIGITS), s; if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2; for (s=2; s<100; s++) { f=iFractals(sy, tf, mode, s); if (f!=0) return(NormalizeDouble(f, d)); } Print("FindNearFractal(): Фрактал не найден"); return(0); } //+----------------------------------------------------------------------------+ </code><code> //+------------------------------------------------------------------+ //| ASC.mq4 | //| Copyright © 2015, AM2 | //| http://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright © 2015, AM2" #property link "http://www.forexsystems.biz" #property description "Forex expert advisor" //--- Inputs extern int StopLoss = 2000; // стоплосс ордера extern int TakeProfit = 2000; // тейкпрофит ордера extern int Expiration = 14; // время истечения ордера extern int Delta = 100; // расстояние от вершин extern double Lots = 0.1; // объем позиции extern int MAGIC = 333; // магик double ASCBuy,ASCSell,FUP,FDN,price; //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void PutOrder() { int res,b,s; datetime expiration = TimeCurrent()+3600*Expiration; ASCBuy=iCustom(Symbol(),0,"ASCtrend",1,1); ASCSell=iCustom(Symbol(),0,"ASCtrend",0,1); FUP=iFractals(Symbol(),0,MODE_UPPER,2); FDN=iFractals(Symbol(),0,MODE_LOWER,2); for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { if(OrderType()==OP_BUYSTOP)b++; if(OrderType()==OP_SELLSTOP)s++; } } } //--- buy if(ASCSell<2 && b<1) { price=FDN+Delta*Point; res=OrderSend(Symbol(),OP_BUYSTOP,Lots,fND(price),3,fND(price-StopLoss*Point),fND(price+TakeProfit*Point),"",MAGIC,expiration,Blue); } //--- sell if(ASCBuy<2 && s<1) { price=FUP-Delta*Point; res=OrderSend(Symbol(),OP_SELLSTOP,Lots,fND(price),3,fND(price+StopLoss*Point),fND(price-TakeProfit*Point),"",MAGIC,expiration,Red); } Comment("\nBuy Price ",ASCBuy,"\nSell Price ",ASCSell, "\nFUP ",FindNearFractal(NULL,0,MODE_UPPER),"\nFDN ",FindNearFractal(NULL,0,MODE_LOWER)); } //+------------------------------------------------------------------+ void DelOrder() { bool del; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if (OrderType()==OP_BUYSTOP) del=OrderDelete(OrderTicket()); if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket()); } } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 07.10.2006 | //| Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| tf - таймфрейм ( 0 - текущий ТФ) | //| mode - тип фрактала (MODE_LOWER|MODE_UPPER) | //+----------------------------------------------------------------------------+ double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) { if (sy=="" || sy=="0") sy=Symbol(); double f=0; int d=MarketInfo(sy, MODE_DIGITS), s; if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2; for (s=2; s<100; s++) { f=iFractals(sy, tf, mode, s); if (f!=0) return(NormalizeDouble(f, d)); } Print("FindNearFractal(): Фрактал не найден"); return(0); } //+----------------------------------------------------------------------------+ //+------------------------------------------------------------------+ bool NewBar() { static datetime lastbar = 0; datetime curbar = Time[0]; if(lastbar!=curbar) { lastbar=curbar; return (true); } else { return(false); } } //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ double fND(double d,int n=-1) { if(n<0) return(NormalizeDouble(d, Digits)); return(NormalizeDouble(d, n)); } //+------------------------------------------------------------------+ //| OnTick function | //+------------------------------------------------------------------+ void OnTick() { //--- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; if(CountTrades()<1)PutOrder(); if(CountTrades()>0)DelOrder(); //--- } //+------------------------------------------------------------------+ </code>Редактирован: 19 января 2015, 19:1735 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
18 Andrju81 Автор Сообщений: 245 - Андрей
35 AM2 Сообщений: 16665 - Андрей
<code>//--------------------------------------------------- Обработка изменения баланса if(CurrentAccountBalance!=AccountBalance()) { CurrentAccountBalance=AccountBalance(); if((BuyOrdersTotal()!=0 && BuyStopOrdersTotal()!=1) || (BuyOrdersTotal()!=1 && BuyStopOrdersTotal()!=0)) { tp=BuyOrderLossLess()+TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов SetBuyOrderTakeProfit(tp); } if((SellOrdersTotal()!=0 && SellStopOrdersTotal()!=1) || (SellOrdersTotal()!=1 && SellStopOrdersTotal()!=0)) { tp=SellOrderLossLess()-TPLossLess*MarketInfo(EASymbol,MODE_POINT);//TakeProfit равен безубыток плюс желаемое количество пунктов SetSellOrderTakeProfit(tp); } }</code>Поправьте, если я где-то или как-то ошибаюсь!?.. Редактирован: 20 января 2015, 15:51
18 Andrju81 Автор Сообщений: 245 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий