Индикатор на который ни кто не обращает внимание. - страница 4

 
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();
//----
  }
//+------------------------------------------------------------------+
 
Автор топика забанен на месяц за ненормативную лексику.
 
Ребята стоящие вещи предлагают.
 
Кто что думает?
 
такая тема заглохла.
 
перелогинился? ну-ну...
 
Какой ты умный)))
 
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
 

сделанный советник выдал вот такую картинку с 2010


 
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);
}
Причина обращения: