Индикатор на который ни кто не обращает внимание. - страница 4 12345 Новый комментарий Pavel Pavlov 2011.05.05 20:43 #31 supergiz - спасибо большое! С помощью твоих набросков я смог разобраться, что к чему! Вот результат того, что я хотел! А хотел я, чтобы по стрелкам данного индикатора открывалась одна позиция, и противоположной стрелкой закрывалась. //+------------------------------------------------------------------+ //| Moving Average+Идея Сидус+supergiz + спасибо большое!.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20110505 extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriodFast = 21; extern double MovingPeriodSlow = 210; extern double RSIPeriod = 21; extern double delta = 0.00005; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { int res; // 1. определяем данные===================================================== double ma42_0 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodSlow, 0, 1, 0, 1), Digits); double ma42_1 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodSlow, 0, 1, 0, 2), Digits); double dif_ma42 = ma42_0 - ma42_1; //---- double ma14_0 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodFast, 0, 1, 0, 1), Digits); double ma14_1 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodFast, 0, 1, 0, 2), Digits); double dif_ma14 = ma14_0 - ma14_1; //---- double rsi17_0 = NormalizeDouble(iRSI(Symbol(), 0, RSIPeriod, 0, 1), Digits); double rsi17_1 = NormalizeDouble(iRSI(Symbol(), 0, RSIPeriod, 0, 2), Digits); double dif_rsi17 = rsi17_0 - rsi17_1; //---- Comment("dif42 = "+dif_ma42, "\nma42_0="+ma42_0, " ma42_1="+ma42_1, "\n\ndif14 = "+dif_ma14, "\nma14_0="+ma14_0, " ma14_1="+ma14_1, "\n\ndifrsi = "+dif_rsi17, "\nrsi17_0="+rsi17_0, " rsi_17_1="+rsi17_1); // 1. ====================================================================== //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- sell conditions if(rsi17_1>50 && rsi17_0<50) { if(dif_ma42<delta && dif_ma14<delta) { OrderSend(Symbol(), OP_SELL, LotsOptimized(), NormalizeDouble(Bid, Digits), 3, 0, 0, "SELL_sidus", MAGICMA,0,Red); return; } } //---- buy conditions if(rsi17_1<50 && rsi17_0>50) { if(dif_ma42>delta && dif_ma14>delta) res=OrderSend(Symbol(), OP_BUY, LotsOptimized(), NormalizeDouble(Ask,Digits), 3, 0, 0, "BUY_sidus", MAGICMA,0,Blue); } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { // 1. определяем данные===================================================== double ma42_0 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodSlow, 0, 1, 0, 1), Digits); double ma42_1 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodSlow, 0, 1, 0, 2), Digits); double dif_ma42 = ma42_0 - ma42_1; //---- double ma14_0 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodFast, 0, 1, 0, 1), Digits); double ma14_1 = NormalizeDouble(iMA(Symbol(), 0, MovingPeriodFast, 0, 1, 0, 2), Digits); double dif_ma14 = ma14_0 - ma14_1; //---- double rsi17_0 = NormalizeDouble(iRSI(Symbol(), 0, RSIPeriod, 0, 1), Digits); double rsi17_1 = NormalizeDouble(iRSI(Symbol(), 0, RSIPeriod, 0, 2), Digits); double dif_rsi17 = rsi17_0 - rsi17_1; //---- Comment("dif42 = "+dif_ma42, "\nma42_0="+ma42_0, " ma42_1="+ma42_1, "\n\ndif14 = "+dif_ma14, "\nma14_0="+ma14_0, " ma14_1="+ma14_1, "\n\ndifrsi = "+dif_rsi17, "\nrsi17_0="+rsi17_0, " rsi_17_1="+rsi17_1); // 1. ====================================================================== //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(rsi17_1>50 && rsi17_0<50) { if(dif_ma42<delta && dif_ma14<delta) { OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } } } if(OrderType()==OP_SELL) { if(rsi17_1<50 && rsi17_0>50) { if(dif_ma42>delta && dif_ma14>delta) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+------------------------------------------------------------------+ Rashid Umarov 2011.05.06 06:26 #32 Автор топика забанен на месяц за ненормативную лексику. [Удален] 2011.05.06 18:15 #33 Ребята стоящие вещи предлагают. [Удален] 2011.05.06 19:05 #34 Кто что думает? [Удален] 2011.05.06 19:05 #35 такая тема заглохла. moskitman 2011.05.06 19:20 #36 перелогинился? ну-ну... [Удален] 2011.05.06 19:25 #37 Какой ты умный))) Konstantin Staryhin 2011.05.10 17:38 #38 Vinin: от него надо держаться подальше индикатор действительно работает некорректно подрихтовал, убрал все лишнее, теперь все работает и не перерисовывается! #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 DodgerBlue #property indicator_color2 Tomato extern int Fast = 14; extern int Slow = 21; extern int RSIPeriod = 17; double buf1[],buf2[]; int init(){ SetIndexStyle(0,DRAW_ARROW, STYLE_DASH,3);SetIndexArrow(0,233);SetIndexBuffer(0,buf1); SetIndexStyle(1,DRAW_ARROW, STYLE_DASH,3);SetIndexArrow(1,234);SetIndexBuffer(1,buf2);} //--------------------------------------------- double MA(int per,int bar){return(iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,bar));} //--------------------------------------------- int start() { for(int i=Bars;i>0;i--){ if(MA(Fast,i+1)<MA(Slow,i+1)&&MA(Fast,i)>MA(Slow,i)&&iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)>50)buf1[i]=Low[i]-20*Point; if(MA(Fast,i+1)>MA(Slow,i+1)&&MA(Fast,i)<MA(Slow,i)&&iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)<50)buf2[i]=High[i]+20*Point; }} Файлы: sidus-v.3.mq4 1 kb Konstantin Staryhin 2011.05.10 17:46 #39 сделанный советник выдал вот такую картинку с 2010 Victor Nikolaev 2011.05.10 18:55 #40 panelektrik: индикатор действительно работает некорректно подрихтовал, убрал все лишнее, теперь все работает и не перерисовывается! Так лучше будет #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 DodgerBlue #property indicator_color2 Tomato extern int Fast = 14; extern int Slow = 21; extern int RSIPeriod = 17; double buf1[],buf2[]; int init(){ SetIndexStyle(0,DRAW_ARROW, STYLE_DASH,3); SetIndexArrow(0,233); SetIndexBuffer(0,buf1); SetIndexStyle(1,DRAW_ARROW, STYLE_DASH,3); SetIndexArrow(1,234); SetIndexBuffer(1,buf2);} //--------------------------------------------- double MA(int per,int bar){return(iMA(NULL,0,per,0,MODE_EMA,PRICE_CLOSE,bar));} //--------------------------------------------- int start() { int counted_bars=IndicatorCounted(); int limit=Bars-counted_bars; if (limit>1) limit=Bars-1; for(int i=Bars;i>0;i--){ if(MA(Fast,i+1)<MA(Slow,i+1)&&MA(Fast,i)>MA(Slow,i)&&iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)>50) buf1[i]=Low[i]-20*Point; if(MA(Fast,i+1)>MA(Slow,i+1)&&MA(Fast,i)<MA(Slow,i)&&iRSI(NULL,0,RSIPeriod,PRICE_CLOSE,i)<50) buf2[i]=High[i]+20*Point; } return(0); } 12345 Новый комментарий
С помощью твоих набросков я смог разобраться, что к чему!
Вот результат того, что я хотел! А хотел я, чтобы по стрелкам данного индикатора открывалась одна позиция, и противоположной стрелкой закрывалась.
от него надо держаться подальше
индикатор действительно работает некорректно
подрихтовал, убрал все лишнее, теперь все работает и не перерисовывается!
сделанный советник выдал вот такую картинку с 2010
индикатор действительно работает некорректно
подрихтовал, убрал все лишнее, теперь все работает и не перерисовывается!
Так лучше будет