Почему не работает советник, не торгует?

 

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


extern int period1 = 10; // период первой MA

extern int period2 = 20; // период второй MA

extern int adx_period = 14; // период ADX

extern double risk = 4.0; // риск в процентах от депозита

extern double stop_loss = 100.0; // размер стоп-лосса в пунктах

double ma1[], ma2[], adx[]; // массивы для хранения значений индикаторов

int init()

{

   SetIndexBuffer(0, ma1); // устанавливаем буфер для первой MA

   SetIndexBuffer(1, ma2); // устанавливаем буфер для второй MA

   SetIndexBuffer(2, adx); // устанавливаем буфер для ADX


   SetIndexStyle(0, DRAW_LINE);

   SetIndexStyle(1, DRAW_LINE);

   SetIndexStyle(2, DRAW_LINE);


   SetIndexLabel(0, "MA1");

   SetIndexLabel(1, "MA2");

   SetIndexLabel(2, "ADX");


   IndicatorDigits(Digits + 1);


   return(0);

}


int start()

{

int counted_bars = IndicatorCounted();

int limit = Bars - counted_bars;


double lots = NormalizeDouble(AccountBalance() * risk / 100 / stop_loss / 10, 2); // расчет размера лота


int ticket; // объявляем переменную "ticket"


for (int i = limit; i >= 0; i--)

{

ma1[i] = iMA(NULL, 0, period1, 0, MODE_EMA, PRICE_CLOSE, i);

ma2[i] = iMA(NULL, 0, period2, 0, MODE_EMA, PRICE_CLOSE, i);

adx[i] = iADX(NULL, 0, adx_period, PRICE_CLOSE, MODE_MAIN, i);


  if (adx[i] > 25 && ma1[i] > ma2[i] && ma1[i - 1] < ma2[i - 1])

  {

     // сигнализируем о пересечении восходящего тренда и открываем позицию на покупку

     if (!OrdersTotal())

     {

        ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - stop_loss * Point, Bid + stop_loss * Point);

        if (ticket > 0)

           Print("Открыта позиция на покупку: ", lots, " лотов");

     }

  }

  else if (adx[i] > 25 && ma1[i] < ma2[i] && ma1[i - 1] > ma2[i - 1])

  {

     // сигнализируем о пересечении нисходящего тренда и открываем позицию на продажу

     if (!OrdersTotal())

     {

        ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + stop_loss * Point, Ask - stop_loss * Point);

        if (ticket > 0)

           Print("Открыта позиция на продажу: ", lots, " лотов");

     }

  }

}


return(0);

}


void deinit()

{

 //очищаем буферы индикаторов

ArrayInitialize(ma1, 0.0);

ArrayInitialize(ma2, 0.0);

ArrayInitialize(adx, 0.0);

}


Файлы:
Test.mq4  5 kb
 
Здесь сплетение кода советника и индикатора. Я вот даже не знаю, будет ли в советнике работать  SetIndexBuffer(). По идее, не должен. В советнике все это не нужно. Цикл по барам тоже не нужен. Берите напрямую значения МА и ADX на нужных барах без сохранения значений в массив, достаточно сохранения в локальные переменные.
 
Ihor Herasko #:
Здесь сплетение кода советника и индикатора. Я вот даже не знаю, будет ли в советнике работать  SetIndexBuffer(). По идее, не должен. В советнике все это не нужно. Цикл по барам тоже не нужен. Берите напрямую значения МА и ADX на нужных барах без сохранения значений в массив, достаточно сохранения в локальные переменные.

А что надо убрать? Я вообще профан в кодинге..  SetIndexBuffer()?

 
У вас вообще код основан на старой версии языка, которой уже лет 10-15. 
Функций  int init(),  int start(),  void deinit() давно уже нет, вместо extern используются input.
Лучше возьмите простенький советник из кодобазы, которому не более 2-3 лет, 
разберитесь как он работает и модифицируйте потихоньку по своим нуждам.
Так будет продуктивнее.
Причина обращения: