Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 411

 
Leanid Aladzyeu:

Начал изучать массивы .

Написал функцию про ордерам с массивами , 3 массива = 0 покупка, 1= продажа, 2= всего сделок покупки и продажи.

Далее написал в условие на покупку если ( первое условие && массив [0] == 0 )то открываем покупку

и на продажу если ( первое условие && массив  [1]==0) то открываем на продажу.

Но в тестере кидает ошибку и тест останавливается, в чем дело?   ( ошибка " выход из массива " )

Значит индекс, к которому Вы обращаетесь лежит за пределами разметки массива. Например, если array[ 3 ]; то вы можете обращаться только к элементам с 0 по 2. Проверяйте свой код.

Еще может быть такое, что Вы не разметили массив (с помощью ArrayResize()), но пробуете обратиться к какому-то его элементу. 

 
код.. 
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
код.. 
Попробуйте разобраться сами, тестер должен указать в какой строке и позиции в строке возникла ошибка.
 
Tapochun:
Попробуйте разобраться сами, тестер должен указать в какой строке и позиции в строке возникла ошибка.

О_о спс не знал что еще и терминал тыкает где ошибка, в первый раз на критическую ошибку нарвался.

   case 1:mas[1]++; mas [2]++;break;// 1 продажа

 на нее плюется. 

 
Исправил . было всего массивов 2 , а мне надо было 3. в инициализации массива и в функции количество сделал +1. и заработало)
 

Подскажите  как реализовать проверку работы индикатора.

Суть в следующем: советник при образовании нового бара обращается к индикатору, а у индикатора в этот момент нет еще данных и я получаю данные предыдущего бара.( типа он еще не успел посчитать)

Как обойти эту засаду. Причем на тестере все ок. На демо -  то ок, то нет ! 

Все, неактуально. Решено. 

 

Здравствуйте, у меня проблема новичка...

Никак не могу заставить систему сравнивать значение закрытия последнего бара с максимумами и минимумами за определенный период, например

последние 20 баров. Что я делаю не так?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Проверял через Alert и по непонятным мне причинам тестер выдает максимально значение с вычисления с самого последнего тика, но он выдает это значение

столько же раз сколько и тиков по-этому ордер не открывается.


И вторая проблема, как заставить советник ждать до открытия следующего бара (30m period)?  При тесте по контрольным точкам все отлично, а если по тикам,

то советник открывает в том же баре сразу же где и закрылся по стоп-лосу например...


Так же, как можно закрывать сделку не зависимо был тик или нет? например на периоде 30m я хочу закрывать ордер за 5 секунд до конца бара (29.55, 59.55)

основываясь на всех данных в этот момент. На данном этапе проблема в том, что если тик не происходит в течении 5 секунд, следовательно не совершается

никаких логических операций, сигнал не поступает и момент упущен до следующего сигнала :( в теории фигня, а на деле втестере следующий сигнал может

оказаться аж через несколько свечей почему-то.


Заранее спасибо!
 

Помогите с коментариями. На каждом баре формируются комментарии. На каждом тике хочу чтоб добавлял к существующему коментарию еще текст.

Вызываю код: 

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

 Добавляет новый комент и на каждом тике в новую строку и текст сползает вниз.

Как сделать чтоб перед выводом он удалял  последние несколько строк ?

 
ForTorg ZEVs:

Помогите с коментариями. На каждом баре формируются комментарии. На каждом тике хочу чтоб добавлял к существующему коментарию еще текст.

Вызываю код: 

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

 Добавляет новый комент и на каждом тике в новую строку и текст сползает вниз.

Как сделать чтоб перед выводом он удалял  последние несколько строк ?

Мне кажется что можно только полностью заменить Comment()

А соответственно чтобы часть комментария менять на каждом тике, надо менять комментарий полностью на каждом тике.

 
ForTorg ZEVs:

Помогите с коментариями. На каждом баре формируются комментарии. На каждом тике хочу чтоб добавлял к существующему коментарию еще текст.

Вызываю код: 

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

 Добавляет новый комент и на каждом тике в новую строку и текст сползает вниз.

Как сделать чтоб перед выводом он удалял  последние несколько строк ?

Так у тебя в комменте стоит управляющий символ "\n " - это символ перевода строки. Если его убрать, многострочия не будет.
Причина обращения: