Помогите упаковать индикатор в советник!..

 

Здравствуйте!

Вот такая проблема: нужно упаковать индикатор прямо в советник. Не спрашивайте зачем. Надо мне! Я с трудом написала одну очень хитрую функцию, похожую на классический "Стохастик", и хочу с ней работать прямо изнутри советника. Потому что отдельный индикатор пока никак не получается. Да и не нужен он мне, главное -- его значение.

Итак: как, скажем, упаковать классический "Стохастик" в советник? Меня интересует только пересечение фиксированного значения. Например, что-то вроде:

if (iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)<50

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

Заранее признательна.

 

Огромное спасибо!

 

Чего-то никак не получается...

 

Попробуйте еще

 
//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_buffers 2

//---- input parameters
int KPeriod=5;
int DPeriod=3;
int Slowing=3;
//---- buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];
//----
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, HighesBuffer);
   SetIndexBuffer(3, LowesBuffer);
//---- indicator lines
//   SetIndexStyle(0,DRAW_LINE);
//   SetIndexBuffer(0, MainBuffer);
//   SetIndexStyle(1,DRAW_LINE);
//   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
//   short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")";
//   IndicatorShortName(short_name);
//   SetIndexLabel(0,short_name);
//   SetIndexLabel(1,"Signal");
//----
//   draw_begin1=KPeriod+Slowing;
//   draw_begin2=draw_begin1+DPeriod;
//   SetIndexDrawBegin(0,draw_begin1);
//   SetIndexDrawBegin(1,draw_begin2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Stochastic oscillator                                            |
//+------------------------------------------------------------------+
int start() {
int NewSize = iBars(NULL, NULL);
  //----  Проверка на смену нулевого бара
  if(ArraySize(MainBuffer[]) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(SignalBuffer[], false);
      ArraySetAsSeries(HighesBuffer[], false);
      ArraySetAsSeries(LowesBuffer[], false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(SignalBuffer[], NewSize); 
      ArrayResize(HighesBuffer[], NewSize); 
      ArrayResize(LowesBuffer[], NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(SignalBuffer[], true);
      ArraySetAsSeries(HighesBuffer[], true);
      ArraySetAsSeries(LowesBuffer[], true); 
    } 

  {
   int    i,k;
   int    counted_bars=IndicatorCounted();
   double price;
//----
   if(Bars<=draw_begin2) return(0);
//---- initial zero
   if(counted_bars<1)
     {
      for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0;
      for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0;
     }
//---- minimums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double min=1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=Low[k];
         if(min>price) min=price;
         k--;
        }
      LowesBuffer[i]=min;
      i--;
     }
//---- maximums counting
   i=Bars-KPeriod;
   if(counted_bars>KPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double max=-1000000;
      k=i+KPeriod-1;
      while(k>=i)
        {
         price=High[k];
         if(max<price) max=price;  // 	<== Вот тут он почему-то выдаёт ошибку "'\end_of_program' - ending bracket '}'".
			Хотя несколькими строчками выше точно такой же код, только наоборот.
         k--;
        }
      HighesBuffer[i]=max;
      i--;
     }
//---- %K line
   i=Bars-draw_begin1;
   if(counted_bars>draw_begin1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i+Slowing-1);k>=i;k--)
        {
         sumlow+=Close[k]-LowesBuffer[k];
         sumhigh+=HighesBuffer[k]-LowesBuffer[k];
        }
      if(sumhigh==0.0) MainBuffer[i]=100.0;
      else MainBuffer[i]=sumlow/sumhigh*100;
      i--;
     }
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
//---- signal line is simple movimg average
   for(i=0; i<limit; i++)
      SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
Swetten писал (а) >>

У Вас лишняя фигурная скобка

{
int i,k;
int counted_bars=IndicatorCounted();
double price;
.....
 

Да код еще тот. Вряд ли он будет когда-нибудь работать.

 

Напишите словами/формулами, что хотели сделать. Завтра попробую помочь.

 
Talex писал (а) >>

Напишите словами/формулами, что хотели сделать. Завтра попробую помочь.

Ну, хочу реализацию "Стохастика", чтобы функция возвращала его значение от 0 до 100. А уж он >50 или <50 -- я как-нибудь сама догадаюсь!..

:)

На этом пока всё. Что-то голова разболелась. Пойду отдыхать.

До свидания.

P.S. Спасибо. :)

 
Swetten писал (а) >>

Ну, хочу реализацию "Стохастика", чтобы функция возвращала его значение от 0 до 100. А уж он >50 или <50 -- я как-нибудь сама догадаюсь!..

:)

На этом пока всё. Что-то голова разболелась. Пойду отдыхать.

До свидания.

P.S. Спасибо. :)

Если хотите только Стохастика, то пользуйтесь Справочник MQL4 - Технические индикаторы - iStochastic

double iStochastic( string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int mode, int shift)
Расчет Stochastic Oscillator.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
%Kperiod - Период(количество баров) для вычисления линии %K.
%Dperiod - Период усреднения для вычисления линии %D.
slowing - Значение замедления.
method - Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
price_field - Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.
mode - Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Причина обращения: