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

 
lil_lil:

Спасибо, как написать цикл поиска номера бара пересечения двух МА когда первые два пункта алгоритма выполнены и есть значения двух МА на первом баре?

/

.


Ага, Вы решили всё таки не через массивы.

Примечание: решение через массивы (копирование в массивы First[], Second[] и Third[] ПОСЛЕДНИХ ТРЁХ значений с индикаторов) - Crossing of two iMA - OnTick():

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - значение индикатора MA1 на баре #i, MA1_prev - значение индикатора MA1 на баре #i+1
MA2_curr - значение индикатора MA2 на баре #i, MA2_prev - значение индикатора MA2 на баре #i+1

Когда получаете пересечение (переменная signal равна или "-1" или "1") - значение i и будет номером бара на котором произошло пересечение.

Это самый простой алгоритм поиска пересечения, но не самый точный.

 
Vladimir Karputov:

Ага, Вы решили всё таки не через массивы...


Спасибо, в качестве примера был взят другой ваш советник MA Cross

В нём и хочу сделать вход на третьем или на пятом или...n баре после пересечения

Vladimir Karputov:

В Вашем случае (получение по одному значению) цикл будет выглядеть примерно так:

Почему нет выхода из цикла, когда пересечение найдено?

Эти условия можно поставить за пределами цикла?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

Добрый день. Подскажите в каком формате качать исторические данные с сервера Финам или MFD.ru для импорта истории котировок? У меня совсем не получается.. Только могу из txt в csv сохранить и все.

 
Eol:

Добрый день. Подскажите в каком формате качать исторические данные с сервера Финам или MFD.ru для импорта истории котировок? У меня совсем не получается.. Только могу из txt в csv сохранить и все.


В MetaTrader 5 ничего качать не нужно :) - как только Вы подключились к торговому серверу - Вам сразу доступна реальная тиковая история. Смотрите в сторону CopyTicks

 
Vladimir Karputov:

В MetaTrader 5 ничего качать не нужно :) - как только Вы подключились к торговому серверу - Вам сразу доступна реальная тиковая история. Смотрите в сторону CopyTicks


Мне просто нужны минутки  по Россиийским акциям за 10 лет.. Мне мой брокер столько не дает и вряд ли найдется такой.

 
5.0 Build 1755

Описание проблемы

Добрый вечер  есть вопрос по MQL5 если сможете помочь былбы благодарен.
А то учебников по 5 нету пока что.
Вопрос такой.


#property indicator_level1 30  - Задал параметр. При Загрузки индикатора на график. Мне его ресует.
В коде програме функцыей ColorBuffer[] изменяю линию на другой цвет если линия опускаетса ниже данного параметра.

И тут родилась проблема. Если захожу в индикатор и меняю данный параметр на другой, даже при загрузке индикатора линия уровня ре суется там где надо а сам индикатор рассчитывает всё по тому параметру что установлен раньше тобиж #property indicator_level1 30

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

- Уже испробывал провирять параметр. И заново пересчитывать всю цепь индикатора.
Всеравно не хочет перерисовыватса как мне нужно!

Помогите!
 :)

Последовательность действий

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


В коде описания Calculaite. В конце где пробигаем по всему For Добавил функцыю изменить цвет линиии если линия ниже данного уровня.
  ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2&& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1&& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Ожидаемый результат


Ожидается то же самое что на картинке но когда в ходе использования индикатора я захожу в настройки и меняю уровень indicator_level1 / 2. То  индикатор перерисовывается так что если линия пересикает уровень то меняет цвет. А у меня она остаётся пока что на первоночальном уровне :(

Дополнительные сведения

...

Файлы:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

Описание проблемы

Добрый вечер  есть вопрос по MQL5 если сможете помочь былбы благодарен.
А то учебников по 5 нету пока что.
Вопрос такой.


#property indicator_level1 30  - Задал параметр. При Загрузки индикатора на график. Мне его ресует.
В коде програме функцыей ColorBuffer[] изменяю линию на другой цвет если линия опускаетса ниже данного параметра.

И тут родилась проблема. Если захожу в индикатор и меняю данный параметр на другой, даже при загрузке индикатора линия уровня ре суется там где надо а сам индикатор рассчитывает всё по тому параметру что установлен раньше тобиж #property indicator_level1 30

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

- Уже испробывал провирять параметр. И заново пересчитывать всю цепь индикатора.
Всеравно не хочет перерисовыватса как мне нужно!

Помогите!
 :)

Последовательность действий

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


В коде описания Calculaite. В конце где пробигаем по всему For Добавил функцыю изменить цвет линиии если линия ниже данного уровня.
  ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2&& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1&& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Ожидаемый результат


Ожидается то же самое что на картинке но когда в ходе использования индикатора я захожу в настройки и меняю уровень indicator_level1 / 2. То  индикатор перерисовывается так что если линия пересикает уровень то меняет цвет. А у меня она остаётся пока что на первоночальном уровне :(

Дополнительные сведения

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

Описание проблемы

Добрый вечер  есть вопрос по MQL5 если сможете помочь былбы благодарен.
А то учебников по 5 нету пока что.
Вопрос такой.

А чем не понравился ответ в отдельной теме?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Нужна помощь MQL5 #property indicator_level

Alexey Viktorov, 2018.01.31 09:06

Игорь, мы оба неправы. Я не сразу понял задачу...

Кроме директивы #property установить уровень индикатора можно функцией

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

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

Тестовый вариант

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Надеюсь поменять цвет в соответствии с уровнем level заданным во входящих параметрах не сложно.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Aleksey Rodionov, 2018.02.06 16:31

Вот интересное нашел:

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


Если в  pintf убрать %G то значение отображаться не будет, а в Print отображается без %G

Еще в Print выдается значение баланса  10000.0 а в printf просто целое 10000

Меня больше вопрос интересует в чем отличие в Print и printf а самое главное почему без %G не отображается. В справочнике ничего не понял.


 

Приветствую коллеги! Назрел такой вопрос, пытаюсь вставить виджет своего сигнала в подписи на форуме "форексденьги", но у них там отключен, то ли заблокирован HTML, есть какая то возможность переделать в URL? потому что они нормально вставляются и отображаются.

Вот такой код <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>