Люди помогите, начинающему...

 

Здравствуйте! Очень прошу помочь в одном вопросе...так я только начинаю программировать, то конечно не все получается, поэтому обращаюсь к "старшим братьям" по разуму...помогите в советник Moving Average_Modify  вставить индикатор iVAR, чтобы советник открывал сделки, когда значение индиктора менее 0,5....я уже неделю бьюсь, не могу сделать!!! Заранее всем огромное спасибо, кто поможет!!!

Советник прикрепляю, а вот код индикатора

// Индикатор отображает индекс вариации ценового ряда, вычисленного
// на минимальном предшествующем интервале длины 2^n. Индекс вариации
// показывает, что преобладает во временном ряду – трендовая или флетовая
// составляющая, или же ряд ведет себя случайно.

// М.М. Дубовиков и др. - Размерность минимального покрытия и локальный
// анализ фрактальных временных рядов.

#property copyright "(C)opyright © 2008, Ilnur"
#property link "http://www.metaquotes.net"
//---- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_level1 0.5
//---- входные параметры
extern int n = 5;
extern int nBars = 1000;
//---- буфер индикатора
double ibuffer[];
//+------------------------------------------------------------------+
//| Функция инициализации индикатора |
//+------------------------------------------------------------------+
int init()
{
//---- настройка параметров отрисовки
  SetIndexBuffer(0,ibuffer);
  SetIndexStyle(0,DRAW_LINE);
  SetIndexDrawBegin(0,Bars-nBars);
  SetIndexLabel(0,"iVAR");
//---- "короткое имя" отображаемое в окне индикатора
  IndicatorShortName("iVAR("+n+")");
  return(0);
}
//+------------------------------------------------------------------+
//| Основная функция индикатора |
//+------------------------------------------------------------------+
int start()
{
  int i, j, k, nTotal, nCountedBars = IndicatorCounted();
  int ihigh, ilow, nInterval;
  double Delta, Xс, Yс, Sx, Sy, Sxx, Sxy;
//---- последний посчитанный бар будет пересчитан
  if(nCountedBars==0) nTotal = nBars;
  if(nCountedBars>0) nTotal = Bars-nCountedBars-1;
//---- основной цикл индикатора
  for(j=nTotal; j>=0; j--)
  {
  Sx = 0; Sy = 0; Sxx = 0; Sxy = 0;
  for(i=0; i<=n; i++)
  {
  nInterval = MathPow(2,n-i);
  //---- суммируем разницы максимальной и минимальной цен на интервале
  for(Delta=0, k=0; k<MathPow(2,i); k++)
  {
  ihigh = iHighest(Symbol(),0,MODE_HIGH,nInterval,nInterval*k+j);
  ilow = iLowest(Symbol(),0,MODE_LOW,nInterval,nInterval*k+j);
  Delta += High[ihigh]-Low[ilow];
  }
  //---- вычисляем координаты вариации в двойном логарифмическом масштабе
  Xс = (n-i)*MathLog(2.0);
  Yс = MathLog(Delta);
  //---- накапливаем данные для нахождения коэффициентов линии регрессии с помощью МНК
  Sx += Xс; 
  Sy += Yс;
  Sxx += Xс*Xс; 
  Sxy += Xс*Yс;
  }
  //---- вычисляем индекс вариации (коэффициент наклона линии регрессии)
  ibuffer[j] = -(Sx*Sy-(n+1)*Sxy)/(Sx*Sx-(n+1)*Sxx);
  }
  return(0);
}

Файлы:
 

А зачем вставлять этот индюк в советник ? Можно же сделать оч. просто.

Сначала надо написать iCustom для этого индюка.

double VAR = iCustom ( ..... .... 

А потом уже совсем просто. 

В функцию СТАРТ  вставить это условие

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
void start()  {

double VAR = iCustom ( ..... .... );

//---- check for history and trading
//(если на графике есть более 100 баров и торговый поток свободен)
   if(Bars<100 || IsTradeAllowed()==false) return;
  //---- calculate open orders by current symbol
//если расчитанный размер лота соответствует текущему размеру депозита
   if(CalculateCurrentOrders(Symbol())==0){
    if(VAR<0.5)//если индикатор меньше 0.5
   CheckForOpen();}// начинием работу
   else     CheckForClose();//в противном случае, - закрываем позиции
            
              }              
//жжжжжжжжжж Конец функции  void start()жжжжжжжжжж+      
 
rid >>:

А зачем вставлять этот индюк в советник ? Можно же сделать оч. просто.

Сначала надо написать iCustom для этого индюка.

double VAR = iCustom ( ..... .... 

А потом уже совсем просто. 

В функцию СТАРТ  вставить это условие


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

//жжжжжжжжжжжж Функция открытия позиций жжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//| Check for open order conditions |
//+------------------------------------------------------------------+
void CheckForOpen() {
  double ma; 
  double VAR;
  double z= 0.5;
  int res;
   
//---- go trading only for first tiks of new bar
  if(Volume[0]>1) return;
   
//---- get Moving Average 
  ma= iMA(NULL,0,MovingPeriod_Open,MovingShift,MODE_SMA,PRICE_CLOSE,0);
  VAR= iCustom (NULL,0,"iVAR",n,nBars,1,0);
//---- sell conditions
  if((Open[1]>ma) && (Close[1]<ma) && (VAR<z ))
  {
  SL=0;TP=0;
  if(StopLoss>0) SL=Bid+Point*StopLoss;
  if(TakeProfit>0) TP=Bid-Point*TakeProfit;  
  res=WHCOrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,SL,TP,
  "Moving Average",MAGICMA,0,Red);
  if(res < 0){Print("Ошибка открытия ордера SELL #", GetLastError()); 
  Sleep(10000); return (0); }
  }

 

Странно! Я предполагаю, что при таком условии

   if(CalculateCurrentOrders(Symbol())==0){//если нет открытых поз
    if(VAR<0.5)//если индикатор меньше 0.5
   CheckForOpen();                         }// начинием работу
   else     CheckForClose();//в противном случае(если есть откр. поза ,
// - проверяем условия на закрытие позиции
            

Как раз и получается, что индюк  VAR задает условия(ограничение)  только для открытия позиций!

Но никак не влияет на функцию закрытия.

Если я не прав, - то присутствующие меня поправят.

 
rid >>:

Странно! Я предполагаю, что при таком условии

Как раз и получается, что индюк  VAR задает условия(ограничение)  только для открытия позиций!

Но никак не влияет на функцию закрытия.

Если я не прав, - то присутствующие меня поправят.


Не хочет работать советник, хотя все сделал как Вы сказали...и пробовал уже сделать как я выше писал...не видит 0,5, открывает только по советнику, не пойму, что ему еще надо (((

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