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

Kvin_:

При запуске Советника на график добавляются две скользящие средние (функция ChartIndicatorAdd). Обе скользящие рисуются красным цветом. Как их программно раскрасить в другие цвета?

В справке же всё понятно написано:

Когда создаёшь хэндл индюка, с которым дальше работаешь можно задать параметр в строке:

indicator_handle=iMACD(symbol,period,fast_ema_period,slow_ema_period,signal_period,apr);
Artyom Trishkin:

Ютуб - наше всё? Где север-юг тоже по роликам с ютуба узнаёте?

ну конечно какой Вы догадливый . 

Kvin_:

При запуске Советника на график добавляются две скользящие средние (функция ChartIndicatorAdd). Обе скользящие рисуются красным цветом. Как их программно раскрасить в другие цвета?

Использовать пользовательский индикатор, в котором есть специальная настройка: цвет.

Пример в коде Custom Moving Average Input Color:

На примере советника Crossing of two iMA, теперь в визуальном тестере стратегий вызов трех индикаторов визуально отлично различается:

Crossing of two iMA

Vladimir Karputov:

Использовать пользовательский индикатор, в котором есть специальная настройка: цвет.

Пример в коде Custom Moving Average Input Color:

На примере советника Crossing of two iMA, теперь в визуальном тестере стратегий вызов трех индикаторов визуально отлично различается:

То, что надо. Спасибо!

Не получается задать правильно коэффициент умножения лота.

Раньше в советнике из кодбайз было так что он умножал предыдущий лот на 2

if(last_position_type==POSITION_TYPE_BUY && m_symbol.Bid()+count_positions*ExtStep<last_position_price_open)
         m_trade.Sell(last_position_volume*2,m_symbol.Name());

Я изменил на 

input double   KLot              = 1.5;     //Коэффициент умножения лота
//------------------------------------------
if(last_position_type==POSITION_TYPE_BUY && m_symbol.Bid()+count_positions*ExtStep<last_position_price_open)
         m_trade.Sell(last_position_volume*KLot,m_symbol.Name());


Получаю неверный обьем лота

ilyav:

Не получается задать правильно коэффициент умножения лота.

Раньше в советнике из кодбайз было так что он умножал предыдущий лот на 2

Я изменил на 

Получаю неверный обьем лота

После проведения арифметических действий лот нужно привести в соответствие шагу лотности для данного символа.

Пример: Coin Flip расчёт и проверка лота для BUY

//+------------------------------------------------------------------+
//| Open Buy position                                                |
//+------------------------------------------------------------------+
void OpenBuy(double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);

   double check_open_long_lot=0.0;
   if(Risk>0.0)
     {
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      Print("sl=",DoubleToString(sl,m_symbol.Digits()),
            ", CheckOpenLong: ",DoubleToString(check_open_long_lot,2),
            ", Balance: ",    DoubleToString(m_account.Balance(),2),
            ", Equity: ",     DoubleToString(m_account.Equity(),2),
            ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
      if(check_open_long_lot==0.0)
        {
         Print(__FUNCTION__,", ERROR: method CheckOpenLong returned the value of \"0.0\"");
         return;
        }
     }
   else
      check_open_long_lot=InpLots;
   if(last_lots_sl>0.0)
      check_open_long_lot=last_lots_sl*InpMartingale;
   if(check_open_long_lot>InpMaxLots)
     {
      Print(__FUNCTION__,", ERROR: check_open_long_lot (",DoubleToString(check_open_long_lot,2),") > \"Max lots\" (",DoubleToString(check_open_long_lot,2),")");
      ExpertRemove();
      return;
     }
   check_open_long_lot=LotCheck(check_open_long_lot);
   if(check_open_long_lot==0)
     {
      Print(__FUNCTION__,", ERROR: LotCheck -> 0.0");
      return;
     }
//--- check volume before OrderSend to avoid "not enough money" error (CTrade)
   double check_volume_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);
   if(check_volume_lot!=0.0)
     {
      if(check_volume_lot>=check_open_long_lot)
        {
         if(m_trade.Buy(check_open_long_lot,NULL,m_symbol.Ask(),sl,tp))
           {
            if(m_trade.ResultDeal()==0)
              {
               Print("#1 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription());
               PrintResult(m_trade,m_symbol);
              }
            else
              {
               Print("#2 Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),
                     ", description of result: ",m_trade.ResultRetcodeDescription());
               PrintResult(m_trade,m_symbol);
              }
           }
         else
           {
            Print("#3 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
                  ", description of result: ",m_trade.ResultRetcodeDescription());
            PrintResult(m_trade,m_symbol);
           }
        }
      else
        {
         string text="";
         if(Risk>0.0)
            text="< method CheckOpenLong ("+DoubleToString(check_open_long_lot,2)+")";
         else
            text="< Lots ("+DoubleToString(InpLots,2)+")";
         Print(__FUNCTION__,", ERROR: method CheckVolume (",DoubleToString(check_volume_lot,2),") ",
               text);
         return;
        }
     }
   else
     {
      Print(__FUNCTION__,", ERROR: method CheckVolume returned the value of \"0.0\"");
      return;
     }
//---
  }

здравствуйте такой вопрос:

можно ли динамически изменить количество буферов/линий в индикаторе?

Andrii Djola:

здравствуйте такой вопрос:

можно ли динамически изменить количество буферов/линий в индикаторе?

Нельзя.

Здравствуйте, подскажите пожалуйста, в коде ниже без блока цикла (который после CopyByffer идет) индикатор штатно запускается, но если включать с циклом сравнивания цены свечи с ценой одной из полос, сами полосы после запуска перестают отображаться, в чем может быть проблема?

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  Olive
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_type3   DRAW_LINE
#property indicator_color3  Olive

input int peroid = 20;        // период полос 1
input int bands_shift= 0;           // смещение полос 1 
input double deviation = 2.3;   // отклонение полос 1

input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены 

double      Base[];     // массив для BASE_LINE индикатора iBands
double      Upper[];    // массив для UPPER_BAND индикатора iBands
double      Lower[];    // массив для LOWER_BAND индикатора iBands

int iBands1_handle; //Указатель на первый индикатор 
int iBands2_handle; //Указатель на первый индикатор 

int g_i_Window;


int OnInit()
  {
   g_i_Window=ChartWindowFind();
   SetIndexBuffer(0,Base,INDICATOR_DATA);
   SetIndexBuffer(1,Upper,INDICATOR_DATA);
   SetIndexBuffer(2,Lower,INDICATOR_DATA);
           
   iBands1_handle=iBands(NULL,PERIOD_CURRENT,peroid,bands_shift,deviation,applied_price);

   if(iBands1_handle==INVALID_HANDLE){
         Alert("Неудалось загрузить индикатор, повторите попытку");
         return(-1);
         }
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[])         // Spread 
  {
   int i;
   int shift = 0;
   int shift1;
   int shift2;
   int shift3;
   string alert;
   
   double O, O1, O2, C, C1, C2, L, L1, L2, H, H1, H2;
      shift1 = shift;
      shift2 = shift + 1;
      shift3 = shift + 2;   
      O = open[shift1];
      O1 = open[shift2];
      O2 = open[shift3];
      H = high[shift1];
      H1 = high[shift2];
      H2 = high[shift3];
      L = low[shift1];
      L1 = low[shift2];
      L2 = low[shift3];;
      C = close[shift1];
      C1 = close[shift2];
      C2 = close[shift3]; 
   
   i = (prev_calculated==0)?1: prev_calculated;
   i = (prev_calculated==rates_total)?rates_total-1: i;
   
   CopyBuffer(iBands1_handle,0,0,rates_total-1,Base);
   CopyBuffer(iBands1_handle,1,0,rates_total-1,Upper);
   CopyBuffer(iBands1_handle,2,0,rates_total-1,Lower);

   for (i = i; i < rates_total; i++)
   {
    if(H > L && O > Lower[i])
    {
     int time_waiting = (int)TimeLocal() + 1;
     while(TimeLocal() < time_waiting){}
     Comment("True");
     return(0);
    }
     else Comment("False"); 
   }
   
   
   if (prev_calculated==0) ChartRedraw();   
   return(rates_total);
  }

Результат: