Как в данном iCustom передать данные стрелок в эксперт?

 

Четыре недели бьюсь, голову сломал... никак не могу выдернуть из буфера индикатора данные. (на форуме уже все темы по iCustom перечитал, испробовал все рекомендации)

Индикатор рисует две МА. быструю и медленную. Показывает пересечения, а также, на быстрой МА стрелками рисует точки продажи и покупки.

Хотел эксперта написать, который бы открывал позиции по стрелкам и закрывал один ордер противоположной стрелкой и открывал новый ордер в своем направлении.


Рисунок индикатора:


//+------------------------------------------------------------------+
//|                                                        iTest.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright " "
#property link      " "

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 Red
#property indicator_width3 2
#property indicator_width4 2
  //Value 4 -sell
  //Value 3 -buy

#include <WinUser32.mqh>
//---- input parameters
extern int       FastEMA=21;
extern int       SlowEMA=210;
extern int       RSIPeriod=21;
extern bool      Alerts=true;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

//---- variables
int sigCurrent=0;
int sigPrevious=0;
double pipdiffCurrent=0;
double pipdiffPrevious=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,217);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexEmptyValue(2,0.0);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,218);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexEmptyValue(3,0.0);



//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
   double rsi_sig=0;
   bool entry=false;
   double entry_point=0;
   
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

   //---- main loop
   for(int i=0; i<limit; i++)
   {
     //---- ma_shift set to 0 because SetIndexShift called abowe
     ExtMapBuffer1[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i);
     ExtMapBuffer2[i]=iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
     rsi_sig = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i);
     
     pipdiffCurrent=(ExtMapBuffer1[i]-ExtMapBuffer2[i]);

     Comment("pipdiffCurrent = "+pipdiffCurrent+" ");
     if (pipdiffCurrent>0 && rsi_sig>50) 
     {
       sigCurrent = 1;  //Вверх

     }
     else if (pipdiffCurrent<0 && rsi_sig<50)
     {
       sigCurrent = 2;  //Вниз

     }

     if (sigCurrent==1 && sigPrevious==2)
     {
        ExtMapBuffer4[i-1] = High[i-1]-5*Point;
        
        entry=true;
        entry_point=Ask; //здесь покупка
        
     } 
     else if (sigCurrent==2 && sigPrevious==1)
     {
        ExtMapBuffer3[i-1] = Low[i-1]-5*Point;
        
        entry=true;
        entry_point=Bid; //здесь продажа
        
     }

   
     sigPrevious=sigCurrent;
     pipdiffPrevious=pipdiffCurrent;
     
   }

   //----
   if(Alerts && entry)
   {
     PlaySound("expert.wav");
     if (sigPrevious==1)
     {
        MessageBox("Entry point: buy at "+entry_point+"!!", "Entry Point", MB_OK);
     }
     else if (sigPrevious==2)
     {
        MessageBox("Entry point: sell at "+entry_point+"!!", "Entry Point", MB_OK);
     }

     entry=false;
   }

//----
   return(0);
  }
//+------------------------------------------------------------------+


Здесь четыре буфера.

Два первых рисуют линии, а третий и четвертый используются для расчетов данных по точкам входа и выхода, и там же стрелки.

Только когда вызываю данные из третьего и четвертого буфера, там все время одни нули! Никак не могу найти в буферах моменты появления стрелок...

Я уже в эксперте пробовал выводить на печать все данные всех буферов: Print ("index1=", Indexbufer3) и так далее... там только одни нули!

(вообще-то, я учусь MQL4, поэтому столько вопросов и никак не могу освоить iCustom)

 
Индикатор неправильно работает.
 
Integer:
Индикатор неправильно работает.

Да, я знаю... он стрелки не на пересечении рисует, а по одной только быстрой машке... но, мне нужно выдернуть данные из буфера, чтобы использовать эту ошибку и заключать сделки по одной только быстрой машке по стрелкам.
 
Integer:
Индикатор неправильно работает.

... и еще одни вопрос, если можно:

в учебнике приведен пример по iCustom:

  double val=iCustom(NULL, 0, "SampleInd",13,1,0);
параметр,13,
... - Parameters set (if necessary). The passed parameters and their order must correspond with the desclaration order and the type of extern variables of the custom indicator.


...что значит 13? что это за параметры?

 
Integer:
Индикатор неправильно работает.

Просто, я заметил в данном индикаторе, что желтая стрелка на покупку в своей очередности никогда не уходит выше красной, в свою очередь, красная стрелка на продажу никогда не уходит в своей очередности ниже желтой стрелки... вот эту особенность индикатора я и хотел использовать для советника, который бы открывал и закрывал сделки используя эти стрелки.
 
160777:

Да, я знаю... он стрелки не на пересечении рисует, а по одной только быстрой машке... но, мне нужно выдернуть данные из буфера, чтобы использовать эту ошибку и заключать сделки по одной только быстрой машке по стрелкам.

Совершенно не волнует алгоритм по которому работает этот индикатор, разговор о том, что индикатор глючит.
 
160777:

... и еще одни вопрос, если можно:

в учебнике приведен пример по iCustom:

параметр,13,
... - Parameters set (if necessary). The passed parameters and their order must correspond with the desclaration order and the type of extern variables of the custom indicator.


...что значит 13? что это за параметры?


Эти параметры взяты условно, лишь в качестве примера, на их месте могли быть любые другие. Внимательно ознакомьтесь с работой ф-ии.

В редакторе МЕ на нее (эту ф-ию) встаньте курсором и нажмите F1.

 
160777:


...что значит 13? что это за параметры?

 

Это параметр индикатора  SampleInd. 13 - это значение параметра.

 

Если использовать пересечение двух машек MA5+MA21+RSI21... то это будет метод Баговино. По нему я смог собрать свой первый советник на основе Moving Average Simple.


#define MAGICMA  20110505
extern double Lots               = 0.1;
extern double MaximumRisk        = 0.02;
extern double DecreaseFactor     = 3;
extern double MovingPeriodFast   = 5;
extern double MovingPeriodSlow   = 12;
extern double RSIPeriod          = 21;
//+------------------------------------------------------------------+
//| 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()
  {
   double FastMA;
   double SlowMA;
   double RsiSig=0;
   int    res;
   int    sigCurrent=0;
   int    sigPrevious=0;
   double pipdiffCurrent=0;
   double pipdiffPrevious=0;

//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average 
   FastMA=iMA(NULL,0,MovingPeriodFast,0,MODE_EMA,PRICE_CLOSE,0);
   SlowMA=iMA(NULL,0,MovingPeriodSlow,0,MODE_EMA,PRICE_CLOSE,0);
   RsiSig=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
   pipdiffCurrent=(FastMA-SlowMA);
   Comment("pipdiffCurrent = "+pipdiffCurrent+" ");
     if (pipdiffCurrent>0 && RsiSig>50) 
          {
           sigCurrent = 1;  //Up
          }
     else if (pipdiffCurrent<0 && RsiSig<50)
          {
             sigCurrent = 2;  //Down
          }
 
//---- sell conditions
if(sigCurrent == 2)  
{res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return;}
//---- buy conditions
if(sigCurrent == 1)  
{res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);return;}
//----
}
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
   double FastMA;
   double SlowMA;
   double RsiSig=0;
   int sigCurrent=0;
   int sigPrevious=0;
   double pipdiffCurrent=0;
   double pipdiffPrevious=0;
//---- go trading only for first tiks of new bar
if(Volume[0]>1) return;
//---- get Moving Average 
   FastMA=iMA(NULL,0,MovingPeriodFast,0,MODE_EMA,PRICE_CLOSE,0);
   SlowMA=iMA(NULL,0,MovingPeriodSlow,0,MODE_EMA,PRICE_CLOSE,0);
   RsiSig=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0);
   pipdiffCurrent=(FastMA-SlowMA);
   Comment("pipdiffCurrent = "+pipdiffCurrent+" ");
     if (pipdiffCurrent>0 && RsiSig>50) 
     {
       sigCurrent = 1;  //Up

     }
     else if (pipdiffCurrent<0 && RsiSig<50)
     {
       sigCurrent = 2;  //Down

     }
//----
   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(sigCurrent == 2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(sigCurrent == 1) 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();
//----
  }
//+------------------------------------------------------------------+


В индикаторе еще высчитываются такие параметры, как :

= High[i-1]+5*Point;

= Low[i-1]-5*Point;


Теперь вот с ними никак не разберусь, как их правильно прокомментировать и прочитать?

С комментариями быстрее учится и осваивается...

 

bool pokup=false; if (iCustom(NULL,0,"test",4,1)>0)pokup=true;

bool prodaza=false; if (iCustom(NULL,0,"test",3,1)>0)prodaza=true;

расчет для 1-го бара

я только учусь)) извиняйте за корявость

 

... я проверил советом Rosh о значениях буферов:

//+------------------------------------------------------------------+
//|                                                        Check.mq4 |
//|                                                             Rosh |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Rosh"
#property link      ""
 
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
  double bufer1,bufer2,bufer3,bufer4;
//----
   for (int shift=100;shift>-0;shift--)
      {
      bufer1=iCustom(Symbol(),0,"iTest",0,shift);
      bufer2=iCustom(Symbol(),0,"iTest",1,shift);
      bufer3=iCustom(Symbol(),0,"iTest",2,shift);
      bufer4=iCustom(Symbol(),0,"iTest",3,shift);
      Print("i=","  bufer1=",bufer1,"  bufer2=",bufer2,"  bufer4=",bufer4,"  bufer3=",bufer3);
      }
//----
   return(0);
  }
//+------------------------------------------------------------------+


первые два буфера выводят значения МА и рисуют линии... а третий и четвертый буфер всегда нули показывает, независимо от того, что индикатор рисует стрелки.

подскажите, как достать данные из буфера 3 и 4 до их обнуления?

Причина обращения: