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

 
Fox_RM:

Я там пытался открывать ордера на новом баре используя функцию NewBar(). Если ее использовать для этого?

К примеру if(NewBar())i++; Как-то так.

NewBar не заметил, извиняюсь

Тогда измените следующее: Вам же нет необходимости считать каждый тик весь индикатор, если сделки вы открываете только на новом баре.

Вот и переместите весь расчет индикатора перед проверкой условий открытия сделки и считайте не limit баров, а столько, сколько вам необходимо (20 если не ошибаюсь)


То есть стратегия такая:

1) новый бар? нет - гуляем

2) да - считаем все что надо (MA, индикатор, все остальное для условий)

3) проверяем условия - нет - гуляем

4) да - открываемся по _текущей цене_ (Ask или Bid соответственно)

 
ilunga:

NewBar не заметил, извиняюсь

Тогда измените следующее: Вам же нет необходимости считать каждый тик весь индикатор, если сделки вы открываете только на новом баре.

Вот и переместите весь расчет индикатора перед проверкой условий открытия сделки и считайте не limit баров, а столько, сколько вам необходимо (20 если не ошибаюсь).

Все верно 20. Это я примерно понял как сделать. Вы объясните уж пожалуйста В ЧЕМ именно разница при моем подсчете и подсчете ТОЛЬКО 20 баров для эксперта.

Просто хочу суть ошибки понять.

 
Fox_RM:
Доброго всем дня!
Решил переделать код своего индикатора под эксперта чтобы отследить
отработку его сигналов.
При компиляции ошибок 0. В тестере прогоняет тоже без ошибок, но ни

одной сделки, в чем ошибка?

З.Ы. Уверен, что ошибок много и глупых, просьба расстреливать холостыми.

Проще переписать код по-своему видению, чем разбираться "что Вы тут танцуете", например, здесь:

  ArrayResize(MA1,Bars);ArrayResize(MA2,Bars);

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

  int counted_bars=IndicatorCounted();  

Но, если "без разницы", то организуемый Вами цикл:

   for(i=0; i<=limit; i++) 

Где limit = Bars - counted_bars, на 2-м тике примет значение равное 0, потом по коду ему присвоится значение... ОПА - а вот это вообще НОВОЕ СЛОВО в прграммировании:

  if(limit>0) limit=0;

...попробуйте записать это условие так, если это не поломает ВСЮ стратегию:

  if(limit<=0) limit=1;
 
Fox_RM:

Т.е. использовать это условие для пересчета баров?

Но у меня в индикаторе на каждом тике рассчитываются массивы TP_UP и TP_DN. Соответственно первостепенно нужно их рассчитать.


Повторяюсь, цена открытия позиции OP_BUY==Ask,, OP_SELL==Bid.

А у вас Close[i].

 
Fox_RM:

Все верно 20. Это я примерно понял как сделать. Вы объясните уж пожалуйста В ЧЕМ именно разница при моем подсчете и подсчете ТОЛЬКО 20 баров для эксперта.

Просто хочу суть ошибки понять.

Ошибки как таковой в расчете всего индикатора нету. Просто подумайте что быстрее:

1) считать Bars (около 10000) баров каждый тик

2) считать 20 баров 1 раз в в минуту (а то и в несколько)

 
Fox_RM:
Доброго всем дня!
Решил переделать код своего индикатора под эксперта чтобы отследить
отработку его сигналов.
При компиляции ошибок 0. В тестере прогоняет тоже без ошибок, но ни

одной сделки, в чем ошибка?

З.Ы. Уверен, что ошибок много и глупых, просьба расстреливать холостыми.

НЕ ПРИНЦИПИАЛЬНО, но для упрощения кода, эту конструкцию:

  ArrayResize(TP_UP,20);ArrayResize(TP_DN,20); 
  ArrayResize(TP_UPMin,20);ArrayResize(TP_DNPl,20);

следовало бы заменить на простое объявление массива УЖЕ с размерностью:

double delta,price,old_price,col_bar,sum_tick,sum_pip,TP_UP[20],TP_DN[20],TP_UPMin[20],TP_DNPl[20];
 
Fox_RM:

Все верно 20. Это я примерно понял как сделать. Вы объясните уж пожалуйста В ЧЕМ именно разница при моем подсчете и подсчете ТОЛЬКО 20 баров для эксперта.

Просто хочу суть ошибки понять.

Это ПРИНЦИПИАЛЬНЫЕ\ФУНДАМЕНТАЛЬНЫЕ принципы программирования - не делай того, что не имеет смысла! :)))
 
Fox_RM:
И еще вопрос связанный с работой библиотеки.
Создал файл библиотеки, откомпилировал, все прошло без ошибок.
Импортировал функцию в код индикатора, откомпилировал, все тоже нормально.
При запуске индикатора импортируемая функция не выполнилась, при использовании

этой функции из кода самого индикатора все работает. Вот код библиотеки.

Это вызов в коде индикатора:

//+------------------------------------------------------------------+
//|                                                         lib1.mq4 |
//|                                         Copyright © 2012, Fox.RM |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Fox.RM"
#property link      "http://www.metaquotes.net"
#property library
//+------------------------------------------------------------------+
//| My function                                                      |
//+------------------------------------------------------------------+
double Sredn(double &ArrSr[])
{
double a=1,c,step=1/20;
for (int i=0;i<=20;i++)
{if (ArrSr[i]==0){a*=1;}else{a*=MathAbs(ArrSr[i]);}}
c=MathPow(a, step);
  return(c);
}
//+------------------------------------------------------------------+
 
Zhunko:

Вадим, ты такую маленькую закорючку (&) поставил, что сразу и не разглядишь!.. :)))

Интересно, как у Автора (в авторском исполнении) эта функция в одном месте исполнялась, а в другом нет?! ;)

 
Fox_RM:

Все верно 20. Это я примерно понял как сделать. Вы объясните уж пожалуйста В ЧЕМ именно разница при моем подсчете и подсчете ТОЛЬКО 20 баров для эксперта.

Просто хочу суть ошибки понять.

Кстати, обратил внимание: Вы объявляете рабочие массивы с размерностью 20:

  ArrayResize(TP_UP,20);ArrayResize(TP_DN,20); 
  ArrayResize(TP_UPMin,20);ArrayResize(TP_DNPl,20);

А библиотека Ваша рассчитывает 21 элемент:

for (int i=0;i<=20;i++)

Могу предположить, что цикл нужно начинать с 1:

for (int i=1;i<=20;i++)
Причина обращения: