Вопросы от "чайника" - страница 51

 

Спасибо огромное papaklass, получилось, теперь попытаюсь осмыслить в чём разница.

 

Почему эксперт зацикливается на этом куске кода:

if(Orders_Total!=0)
  {
   for(i=Orders_Total;i>=0;i--)
     {
      Alert(Orders_Total);
      if(Symbol()==PositionGetSymbol(i))
        {
         OpenPrice=PositionGetDouble(POSITION_PRICE_OPEN);
         OrderLot = PositionGetDouble(POSITION_VOLUME);
         StopLoss = PositionGetDouble(POSITION_SL);
         TakeProfit=PositionGetDouble(POSITION_TP);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            for(i=0;i<12;i++)
              {
               if(Price[i].low<lowest)
                 {
                  lowest=Price[i].low;
                 }
              }
            Alert(lowest);
            SL=NormalizeDouble(lowest-spread-_Point,_Digits);
            if(StopLoss<SL)
              {
               request.action=TRADE_ACTION_SLTP;
               request.symbol=_Symbol;
               request.volume= OrderLot;
               request.sl=SL;
               request.tp=TakeProfit;
               request.type=ORDER_TYPE_BUY;
               OrderSend(request,result);
              }
           }
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            for(i=0;i<12;i++)
              {
               if(Price[i].high>highest)
                 {
                  highest=Price[i].high;
                 }
              }
            Alert(highest);
            SL=NormalizeDouble(highest+spread+_Point,_Digits);
            if(StopLoss>SL)
              {
               request.action=TRADE_ACTION_SLTP;
               request.symbol=_Symbol;
               request.volume= OrderLot;
               request.sl=SL;
               request.tp=TakeProfit;
               request.type=ORDER_TYPE_SELL;
               OrderSend(request,result);
              }
           }
        }
     }
  }

Вставил алерты Orders_Total=2 lowest и highest тоже дают адекватные значения тем не менее эксперт виснет в этом цикле, выдавая бесконечное множество алертов, других ошибок (касающихся модификация ордера) не выдает.

Помогите разобраться новичку :) 

 

На один внешний цикл и два внутренних цикла одна и та же переменная цикла i, которая с каждой новой итерацией внешнего цикла становится равной 12

 
stringo:

На один внешний цикл и два внутренних цикла одна и та же переменная цикла i, которая с каждой новой итерацией внешнего цикла становится равной 12

Спасибо!!!
 

Можете исправить код? Нужна цена открытия текущего бара. Заранее благодарю.

double Open[], val4;
ArraySetAsSeries(Open,true);
CopyOpen(Symbol_, PERIOD_M15,1,0,Open);
val4 = (Open[ArrayMinimum(Open,0,1)] );

 

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
abeiks:

Можете исправить код? Нужна цена открытия текущего бара. Заранее благодарю.

 

"Symbol_ " - неправильный параметр, подчеркивание должно быть спереди

Да и кол-во копируемых элементов указано 0. 

 

Приветствую! Если я подключаю к советнику внешний индикатор через iCustom,то не получается динамически менять входные параметры.Если iMA ,то все  в порядке.С постоянными значениями все работает.Две взаимозаменяемые строки.Поместил в OnTick() , MA период пересчитывается.

ma_handle = iCustom(_Symbol,0,"Examples\\JJMA.ex5",MA,4);
   
ma_handle = iMA(_Symbol,0, MA,0, MODE_EMA, PRICE_CLOSE); 

 Если в данном случае так и есть,что во внешних нельзя менять,то встраивать код в советник?

Извиняюсь,работает,просто на порядок дольше. 

 
Karlson:

Приветствую! Если я подключаю к советнику внешний индикатор через iCustom,то не получается динамически менять входные параметры.Если iMA ,то все  в порядке.С постоянными значениями все работает.Две взаимозаменяемые строки.Поместил в OnTick() , MA период пересчитывается.

 Если в данном случае так и есть,что во внешних нельзя менять,то встраивать код в советник?

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

Воспроизведите входные параметры индикатора в качестве входных параметров эксперта. И хендл лучше получать один раз при инициализации эксперта, чем на каждом новом тике.

 
Yedelkin:

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

Воспроизведите входные параметры индикатора в качестве входных параметров эксперта. И хендл лучше получать один раз при инициализации эксперта, чем на каждом новом тике.

У меня период средней меняется от ATR в процессе работы советника,поэтому хендл средней помещен в OnTick() .По сути входным параметром эксперта является период ATR.Он не меняется.ATR в OnInit().

int OnInit()
  {
  atr_handle = iATR(_Symbol,0, ATR);  //инициализируем хэндл ATR
  }

void OnTick()
  {
     CopyBuffer(atr_handle,0,0,5,atr);   //заполняем массив ATR
     ArraySetAsSeries(atr,true);

     MA=(int)(atr[1]*kMA);                 //рассчитываем период требуемый для средней от ATR

   //ma_handle = iCustom(_Symbol,0,"Examples\\JJMA.ex5",MA,4);  // получаем хэндл средней
   
     ma_handle = iMA(_Symbol,0, MA,0, MODE_EMA, PRICE_CLOSE);

     CopyBuffer(ma_handle,0,0,5,ma);     //заполняем массив средней
     ArraySetAsSeries(ma,true); 
  }
 
Karlson:

У меня период средней меняется от ATR в процессе работы советника,поэтому хендл средней помещен в OnTick() .По сути входным параметром эксперта является период ATR.Он не меняется.ATR в OnInit().

Примерно понял. Но это тяжко - получать хендл индикатора каждый раз на новом тике... А предыдущий хендл куда деваете?
Причина обращения: