[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 181

 
Activict:

Добрый день. Есть такой вопрос.

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

Дело в том что он производит расчеты внутри себя и выдает на графике стрелочку вверх или вниз.

Подскажите как можно сделать эксперт, чтобы когда появляется стрелка на графике открывается ордер в нужную сторону

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

Приведу кусок кода чтобы было понятней, это инициализация в индикаторе

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

Заранее спасибо всем

Используйте встроенную ф-цию iCustom для получения в эксперте значений нужного вам пользовательского индикатора



double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Например, вам нужно узнать есть ли стрелка вверх или вниз на последнем полностью сформированном баре:


double Up=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 1, 1); // стрелка вверх
double Dw=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 2, 1); // стрелка вниз
 

спасибо за ответ! Да стрелки иногда пропадают. Этот способ через кастом будет считывать "0" если стрелка пропадет?

И стрелка рисуется только на формирующемся баре , предыдущие бары он не перерисовывает, в момент появления нужно открыть сделку ну и соответственно если исчезнет стрелка то закрыть 

 
 Есть ли возможность с помощью программного кода, заставить советник посылать запросы на сервер чаще чем обычно?? Чтобы вместо одного запроса было  два, или для этого можно просто повторить программную оболочку ... если три запроса вместо одного - то два раза повторить... ?
 
Activict:

Да стрелки иногда пропадают. Этот способ через кастом будет считывать "0" если стрелка пропадет?

Да, будет.

Activict:

И стрелка рисуется только на формирующемся баре , предыдущие бары он не перерисовывает, в момент появления нужно открыть сделку ну и соответственно если исчезнет стрелка то закрыть 

Следовательно если стрелка есть на одном из  полностью сформированных баров, то она уже не исчезнет. На текущем баре стрелка может появляться и исчезать несколько раз.
 
Activict:

спасибо за ответ! Да стрелки иногда пропадают. Этот способ через кастом будет считывать "0" если стрелка пропадет?

Через iCustom считается то значение, которое задано в коде индикатора как "пустое". Это как правило может быть 0 или EMPTY_VALUE.

EMPTY_VALUE принято в индикаторах по умолчанию, если же в init() прописано SetIndexEmptyValue, то будет другое.

 
yellownight:
 Есть ли возможность с помощью программного кода, заставить советник посылать запросы на сервер чаще чем обычно?? Чтобы вместо одного запроса было  два, или для этого можно просто повторить программную оболочку ... если три запроса вместо одного - то два раза повторить... ?
 Это ничего Вам не даст. Забомбите сервер запросами, и Вам счёт могут вообще отключить. Я знаю, такое бывает у тех кто "переусердствует с запросами" и "бомбит" ими чрезмерно много.
 

 Я написал простой индикатор. Вот код:

//+------------------------------------------------------------------+
//|                                            AngleByLineFromMA.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string  h1 = "основные параметры машки";
extern int     maTF = 0;
extern int     maPeriod = 50;
extern int     maShiftByPrice = 0;
extern int     maMethod = 0;
extern int     maPrice = 0;
extern int     shiftBarsBack1 = 2;                       // Первое значение shift
extern int     shiftBarsBack2 = 7;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Другие переменные";
double         pointOfMaFirst,                           // Первая тока (начало отрисовки отрезка)
               pointOfMaLast,                            // Вторая тока отрезка (конец отрисовки отрезка)
               varsAngle[1000];                              // Буфер для хранения значение возвращаемых машкой

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//#property indicator_minimum -45
//#property indicator_maximum 45
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {
    ObjectsDeleteAll();                                  // Очистим график от всего
    
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
    int i, countedBars = IndicatorCounted();
    int limit = Bars - countedBars;
    if (limit > 400) limit = 400;
        
    for(i = limit;i > 1;i--)
    {
      pointOfMaFirst = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1+i);   // Начальная точка прямой
      pointOfMaLast = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2+i);     // Крайняя точка прямой
    
      varsAngle[i] = pointOfMaFirst - pointOfMaLast;
      Print("varsAngle[i] = ", varsAngle[i]);
    }

    return(0);
  }
В нём только один буфер. Значения индикатора типа double.

В эксперте, решил получить значение индикатра и применить его в торговле в качестве фильтра.

 Вот я написал простой вызов в функции данного буфера индикатора на последнем сформировавшемся баре:

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
В тестере возвращается значение slope не верное:
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647

Почему так? Тип указан верно.. Вызов тоже вроде как верно. Индиатор работает вообще исправно. Вот лог журнала на тестере, а с реального рынка текущего:

 

2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001

 Почему возвращается какое-то число 2147483647 постоянно вместо требуемого ?

 
hoz:

 Я написал простой индикатор. Вот код:

В нём только один буфер. Значения индикатора типа double.

В эксперте, решил получить значение индикатра и применить его в торговле в качестве фильтра.

 Вот я написал простой вызов в функции данного буфера индикатора на последнем сформировавшемся баре:

В тестере возвращается значение slope не верное:

Почему так? Тип указан верно.. Вызов тоже вроде как верно. Индиатор работает вообще исправно. Вот лог журнала на тестере, а с реального рынка текущего:

 

 Почему возвращается какое-то число 2147483647 постоянно вместо требуемого ?

В тестере при начале работы недостаточно баров в истории для корректного расчёта индикатора.

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF)<maPeriod) { Print("Недостаточно баров в истории для корректного расчёта значений индикатора!"); return(-1.0); }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
 
//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF) < maPeriod)
   {
      Print("Недостаточно баров в истории для корректного расчёта значений индикатора!");
      return(0);
   }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   Print ("iBars(NULL, i_TF) = ", iBars(NULL, i_TF));
   
   return(slope);
}

у меня закачано история с дукаскопи с 2007 года... не может быть чтоб баров не хватало. Период МА всего 50.

Вот вставил Вашу строку, тока поправил return(0) .. и добавил вывод количества баров на графике:

 

Вот в журнале:

2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647


 
hoz:

у меня закачано история с дукаскопи с 2007 года... не может быть чтоб баров не хватало. Период МА всего 50.

Вот вставил Вашу строку, тока поправил return(0) ..

Вот в журнале:

 

 


Похоже проблема в индикаторе

 if (limit > 400) limit = 400;
Причина обращения: