Подскажите как правильно писать функции если они строятся из уже написанных

 
Решил отказаться от выражений типа iCustomer(... стал вставлять функции в текст эксперта. Странная картина - некоторые функции работают. Некоторые нет - неработают те функции которые я построил из работающих ну например : Фновая = Фстарая1-Фстарая2. Подскажите пожалуйста - я наверное что-то не так делаю. Буду благодарен если вышлите пример на моё мыло : bertek@rambler.ru
 
Функции или индикаторы?
 
Itso:
Функции или индикаторы?

у меня были индикаторы - на основе них я строил советника - но как я читал писать iCustom(...) - это дурной тон - поэтому тексты индикаторов оформил в виде функций в теле советника. Один из индикаторов - это разность двух других - так вот он и не работает - хотя каждый из его составляющих - работают нормально.
 
Недостаточно перенести код индикатора в эксперта. Не забывайте о том, что большинство индикаторов написано с применением экономичных перерасчетов. Да и нутро индикаторов сильно отличается от экспертов. Например, в экспертах нет автоматических индексных массивов, нет поддержки функции IndicatorCounted() для экономичного пересчета индикаторов и тд.

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

Привожу код советника

//+------------------------------------------------------------------+
//|                                                        BS003.mq4 |
//|                                                                  |
//+------------------------------------------------------------------+
 
#define MAGICMA  20050610
extern int    Lots               = 1;
extern int    d                  = 60;
extern double k                  = 1;
extern string iname              = "N00015";  
extern int    n                  = 0;
extern double p                  = 15;
 
//+------------------------------------------------------------------+
//| Определение открытых позиций                                     |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;iOrdersTotal();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);
  }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen()
  {
   double n13_h,n13_l,sko,verge_up,verge_dw;
   double n18_h0,n18_l0,n18_m0,n18_h1,n18_l1,n18_m1;
   int    res;
 
//---- get Indicator Data
   n13_h=iCustom(NULL,0,"N00013",d,k,iname,2,0);
   n13_l=iCustom(NULL,0,"N00013",d,k,iname,1,0);
   sko=(n13_h-n13_l)/100*p;
   verge_up =  sko;
   verge_dw = -sko;
   n18_h0=iCustom(NULL,0,"N00018",d,k,iname,1,0);
   n18_l0=iCustom(NULL,0,"N00018",d,k,iname,2,0);
   n18_m0=iCustom(NULL,0,"N00018",d,k,iname,0,0);
  
   n18_h1=iCustom(NULL,0,"N00018",d,k,iname,1,1);
   n18_l1=iCustom(NULL,0,"N00018",d,k,iname,2,1);
   n18_m1=iCustom(NULL,0,"N00018",d,k,iname,0,1);
  
     Print("n18_h1 = ",n18_h1," verge_up = ",verge_up);
     Print("n18_h0 = ",n18_h0," verge_up = ",verge_up);
  
//---- buy conditions
   if (n18_h1verge_up && n18_h1>0 && n18_h0>verge_up)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MAGICMA,0,Green);
      return;
     }  
//---- sell conditions
   if (n18_l1>verge_dw && n18_l10 && n18_l0verge_dw)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",MAGICMA,0,Red);
      return;
     }
//----
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
{
   double n13_h,n13_l,sko,verge_up,verge_dw;
   double n18_h0,n18_l0,n18_m0,n18_h1,n18_l1,n18_m1;
   int    res;
 
//---- get Indicator Data
   n13_h=iCustom(NULL,0,"N00013",d,k,iname,2,0);
   n13_l=iCustom(NULL,0,"N00013",d,k,iname,1,0);
   sko=(n13_h-n13_l)/100*p;
   verge_up =  sko;
   verge_dw = -sko;
   n18_h0=iCustom(NULL,0,"N00018",d,k,iname,1,0);
   n18_l0=iCustom(NULL,0,"N00018",d,k,iname,2,0);
   n18_m0=iCustom(NULL,0,"N00018",d,k,iname,0,0);
  
   n18_h1=iCustom(NULL,0,"N00018",d,k,iname,1,1);
   n18_l1=iCustom(NULL,0,"N00018",d,k,iname,2,1);
   n18_m1=iCustom(NULL,0,"N00018",d,k,iname,0,1);
//----
   for(int i=0;iOrdersTotal();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 ((fast_tekslow_tek && sdown_tek != EMPTY_VALUE))
         if (n18_l1>verge_dw && n18_l10 && n18_l0verge_dw)
          OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         break;
        }
        
     if(OrderType()==OP_SELL)
        {
         //if ((fast_tek>slow_tek) ||(fast_tek
         if (n18_h1verge_up && n18_h1>0 && n18_h0>verge_up)
         OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow);
         break;
        }
     }
//----
  }
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
  {
//---- check for history and trading
   if(Bars100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();
//----
  }
//+------------------------------------------------------------------+
Данный советник работает нормально. Заменил функции
n13_h=iCustom(NULL,0,"N00013",d,k,iname,2,0);
n13_l=iCustom(NULL,0,"N00013",d,k,iname,1,0);
их ходами (из индикатора) - советник работает нормально.


Но как только заменяю коды

n18_h0=iCustom(NULL,0,"N00018",d,k,iname,1,0);
n18_l0=iCustom(NULL,0,"N00018",d,k,iname,2,0);
n18_m0=iCustom(NULL,0,"N00018",d,k,iname,0,0);
на их исходники - эксперт перестаёт работать.

Подскажите как вставить в текст советника текст индикатора .

 
Индикаторы очень простые - один цифровой фильтр, а другой похож на скользящую кауфмана - никаких наваротов в них нет - но когда я проверяю вычисления - он даёт на всём периоде один и тот же - одинаковый результат. Может я некоректно написал текст советника?
 
bertek:
Itso:
Функции или индикаторы?

...я читал писать iCustom(...) - это дурной тон

Ктоже это так сказал? У меня совсем другое мнение на этот счет, даже противоположное.
 
bertek:
Индикаторы очень простые - один цифровой фильтр, а другой похож на скользящую кауфмана - никаких наваротов в них нет - но когда я проверяю вычисления - он даёт на всём периоде один и тот же - одинаковый результат. Может я некоректно написал текст советника?

Если скользящая кауфмана простой индикатор, то какой сложный? Вот его точно запаришься в эксперт переносить.
 
bertek:

Привожу код советника

Для вставки примеров исходного кода MQL4 используейте, пожалуйста, кнопку на панели инструментов редактора сообщений.

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