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

 

Какого типа константы  : MA_TALKING_LONG , MA_TALKING_SHORT ?

как вы их объявляете ? 

 
Vinin:

Учитывайте видимость переменных и массивов


 Задал в глобальных... та же ошибка.

FAQ:

Какого типа константы  : MA_TALKING_LONG , MA_TALKING_SHORT ?

как вы их объявляете ? 

#define MA_TALKING_LONG                         0                             // Машки расположены к покупке
#define MA_TALKING_SHORT                        1                             // Машки расположены к продаже
#define MA_TALKING_FLAT                        -1                             // Машки указывают на флет
 

покажите заголовок (объявление) вот этой функции GetStateMa() - проблема там

исправьте на GetStateMa(int signal){} должно попустить 

 
FAQ:

покажите заголовок (объявление) вот этой функции GetStateMa() - проблема там

исправьте на GetStateMa(int signal){} должно попустить 

 В общем, суть такая. Тут мне один профи. поправил эксперт, который у меня работал чётко. Была задача чтоб 4 разных сигналам открывался 1 ордер только, и каждый сигнал генерировался отдельно и просчитывался отдельно. Он мне поправил эксперт, но попутал логику.

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

 До этого было вот так у него:

в старте:

   int signal[4];
   CalcSignals(signal);

   if (!Trade(signal))
      return (0);

А вот функции что б было понятно что к чему:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_trading_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void CalcSignals(int& signal[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   for (int i = 0; i < 4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);
      signal[i] = SIGNAL_NO;

      if (ema1 < ema365_1 && ema0 > ema365_0)
         signal[i] = SIGNAL_BUY;
      if (ema1 > ema365_1 && ema0 < ema365_0)
         signal[i] = SIGNAL_SELL;
   }
}

  Вообще дико такое видеть, что функция т.к. void ничего не должна возвращать по определению, но, тем не менее, она возвращает значение элемента массива signal[i] 

 Мне вот интересно, часто такое применяют опытные программисты? Или это уже слишком?

 Щяс я пытаюсь написать то что нужно, видя приёмы, которые в том эксперте присуствуют. Т.к. без массивов там не обойтись. 

 
Тhoz:

 В общем, суть такая. Тут мне один профи. поправил эксперт, который у меня работал чётко. Была задача чтоб 4 разных сигналам открывался 1 ордер только, и каждый сигнал генерировался отдельно и просчитывался отдельно. Он мне поправил эксперт, но попутал логику.

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

 До этого было вот так у него:

в старте:

А вот функции что б было понятно что к чему:

  Вообще дико такое видеть, что функция т.к. void ничего не должна возвращать по определению, но, тем не менее, она возвращает значение элемента массива signal[i] 

 Мне вот интересно, часто такое применяют опытные программисты? Или это уже слишком?

 Щяс я пытаюсь написать то что нужно, видя приёмы, которые в том эксперте присуствуют. Т.к. без массивов там не обойтись. 

Применяют часто, секрет в int&, double&
 
Mislaid:
Применяют часто, секрет в int&double&

Я это уже понял, но по-моему это уже извращение. Зачем делать функцию void тогда? Это ж не логично. Нада возвратить что-то.. возврати через функцию типа int, double...

 
Появилась при отладке принтом ошибка:
2013.01.06 21:06:32     2011.11.28 00:20  Base150 EURUSD,M5: not enough stack for parameter

 Как быть?

 
hoz:

Я это уже понял, но по-моему это уже извращение. Зачем делать функцию void тогда? Это ж не логично.

Это логично.

Эта функция ничего не возвращает, она проделывает операции над элементами переданного в неё массива.

 
hoz:

 Вот моя функция модификация отложенного ордера. При модификации я задаю новую цену и новый стоплосс. Функция частично работает, но почему-то в тестере сыпяться ошибки 1.

 Верно ли моя функция написана?

if((b_mod) && (priceB > Ask)) OrderModify(b_ticket,priceB,priceS,0,0,Brown);
if((s_mod) && (priceS < Bid)) OrderModify(s_ticket,priceS,priceB,0,0,Brown);


 Здесь надо учитывать стоплевел  MarketInfo(Symbol(),MODE_STOPLEVEL) т.е. 

 priceB >= Ask+ MarketInfo(Symbol(),MODE_STOPLEVEL)*Point

 priceS < =Bid- MarketInfo(Symbol(),MODE_STOPLEVEL)*Point

 
PapaYozh:

Это логично.

Эта функция ничего не возвращает, она проделывает операции над элементами переданного в неё массива.


 Ну так если в функцию типа double или int передать элементы, то она тоже может проделать те же операции, тока уже без извращений. Зачем усложнять жизнь?