Как привязать пользовательский индикатор к эксперту

 

Впервые пишу эксперта и никак не :((Пожалуйства подскажите, в чем моя ошибка.Задача моего эксперта заключается в том, чтобы открывать позицию (длинную\короткую) в зависимости от последней сформировавшейся свечи, то есть если тело свечи (open-close)>0,001, то - "короткая", иначе (open-close)<0,001, то - "длянная". Почему то эксперт только открывает длиннную или только короткую!!(((

Заранее благодарен!!! 

Файлы:
 
energodmitry: Почему то эксперт только открывает длиннную или только короткую!!(((
 Вопрос не понятен. На одном инструменте может быть открыта либо позиция на покупку, либо позиция на продажу. Какая у Вас цель?
 

Я имел ввиду, к примеру, последняя сформировавшиеся свеча имеет тело (open-close)>0,001, то есть тело свечи больше 10 пунктов, тогда инструмент продается, или последняя сформировавшиеся свеча имеет тело (open-close)<-0,001, то есть тело свечи больше 10 пунктов только со знаком минус, тогда инстумент покупается! 

Пример

open = 1.2345

close=1.2357

open-close=-0.0012 следовательно инстумент покупать

или

 open = 1.2357

close=1.2345

open-close=0.0012 следовательно инстумент продавать

 
energodmitry:

Я имел ввиду, к примеру, последняя сформировавшиеся свеча имеет тело (open-close)>0,001, то есть тело свечи больше 10 пунктов, тогда инструмент продается, или последняя сформировавшиеся свеча имеет тело (open-close)<-0,001, то есть тело свечи больше 10 пунктов только со знаком минус, тогда инстумент покупается! 

Ну так у Вас по Вашим же словам, эксперт и открывает нужную позицию по последней сформировавшейся свече: "только открывает длиннную или только короткую". Что Вас не устраивает, если эксперт отрабатывает Ваш же алгоритм?
 

I'm sorry I did not accurately explain the problem ....

The problem is that the file signalbuyorsell.mgh, which are written in terms of open positions:   whatever condition I have not written in LongCondition and ShortCondition () expert " only opens a short position ? "(I can not understand why!

/ / + ----------------------------------------------- ------------------- +
/ / | "Voting" that the price will rise. |
/ / | INPUT: no. |
/ / | OUTPUT: kolichsetvo "voices" that the price will rise. |
/ / | REMARK: no. |
/ / + ---------------------------------------------- -------------------- +
int CSignalBOS :: LongCondition ()
  {
   int result = 0;
   int idx = StartIndex ();
   double last_BOS_value = BuyOrSell (idx);
   double last_last_BOS_value = BuyOrSell (idx +1);  
   if (last_BOS_value <0.001 && last_last_BOS_value <0.001)
     { 
      result = 100;
      } 
/ / --- returns "Voting" that the price will fall. | / / | INPUT: no. | / / | OUTPUT: number of "votes" That Will Fall price. | / / | REMARK: no. | / / + ---------------------------------------------- -------------------- + int CSignalBOS :: ShortCondition ()   {    int result = 0;    int idx = StartIndex ();    double last_BOS_value = BuyOrSell (idx);    double last_last_BOS_value = BuyOrSell (idx +1);      if (last_BOS_value> last_last_BOS_value && 0.001> 0.001)      {         result = 100;       }  / / --- returns






















 

 
energodmitry: Проблема заключается в том, что в файле signalbuyorsell.mgh, где пишутся условия для открытия позиций:  какие бы условия я не написал в LongCondition и ShortCondition() эксперт "только открывает короткую позицию"?(Не могу разобраться почему! 

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

 

Подскажите пожалуйста как это сделать?

 
int CSignalBOS::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
   double last_BOS_value=BuyOrSell(idx);
   double last_last_BOS_value=BuyOrSell(idx+1);   
   if(last_BOS_value<0.001 && last_last_BOS_value<0.001) result=100;  
   Print("last_BOS_value=",last_BOS_value,", last_last_BOS_value=",last_last_BOS_value,", LongCondition=",result);
   return(result);
  }
 

Спасибо огромное, все получилось!Теперь хоть понимаю в чем дело!!!)Почему-то не загружаются данные , пишет ошибку  CIndicator::GetData: invalid buffer? Хотя вроде дела по шаблону((Подскажите на что обратить внимание!!За ранее спасибо!

 
energodmitry:

Спасибо огромное, все получилось!Теперь хоть понимаю в чем дело!!!)Почему-то не загружаются данные , пишет ошибку  CIndicator::GetData: invalid buffer? Хотя вроде дела по шаблону((Подскажите на что обратить внимание!!За ранее спасибо!

//+------------------------------------------------------------------+
//| API access method "Copying an element of indicator buffer        |
//| by specifying number of buffer and position of element"          |        
//+------------------------------------------------------------------+
double CIndicator::GetData(const int buffer_num,const int index) const
  {
   CIndicatorBuffer *buffer=At(buffer_num);
//--- check
   if(buffer==NULL)
     {
      Print("CIndicator::GetData: invalid buffer");
      return(EMPTY_VALUE);
     }
//---
   return(buffer.At(index));
  }
Нужно посмотреть как Вы создаете индикатор и к какому буферу (по счету) обращаетесь за данными.
 

Не могу понять почему не видет буффер пользовательского индикатора в signalbuyorsell.mqh?(((

Я еще раз проверил номера буфферов, пробывал указывать любой буфер....все равно одна и таже ошибка(((( Подскажите, если при запуске советнки на "тесте" запускается так же и пользовательский индикатор, то в функции Ge tData достаточно только указать номер буффера или еще что-то на указать в файле signalbuyorsell.mqh???(

Подскажите пожалуйста! За ранее спасибо!!!

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