[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 326

 

 Я не сторонник индикаторов, но решил проверить одну вещь. Нужно, чтоб по цене верхнего уровня индикатора RSI эксперт покупал, а по цене нижнего продавал, соответственно. Только если уже цена выше верхней границы индикатора RSI, то покупка должна быть выше данной границы и ниже значения значения данной границы + какое-то значение отступа от границы вверх (в коде я указал просто число 0.1), Для продаж, наоборот.

Я сделал вот так:

 Внешние параметры:

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

 

Код функции получающей сигнал и само значение RSI: (0.1 тут допуск отступа для диапазона покупок или продаж)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

 Эксперт открывает ордера бывает от самого уровня, а бывает значительно выше (для покупок), значительно ниже (для продаж). Почему? Ведь алгоритм то элементарен.

 
Привет всем. У меня вопрос. Поставил себе копировальщик /**/, хорошая и удобная вещь, когда работаешь с несколькими счетами. Но проблема - когда паралельно на компе запускаешь любую другую программу (видеоролик, игру, просто карты) из динамиков идет постоянный треск. Можно ли устранить эту проблему (треск)? За ранее благодарен.
 

Помогите пожалуйста, мозг кипит, бьюсь уже пару дней, но никак не вдуплю в чем проблема.

Пытаюсь написать простейший индикатор на основе RSI (за аналог взят индикатор RandomIndicatorSignals.mq4 из статьи Язык MQL4 для "чайников". Пользовательские индикаторы (часть 1) (https://www.mql5.com/ru/articles/1500).

Суть простая, если RSI рисует вершину или впадину, то он рисует стрелку на графике.

Вроде все правильно сделал, но по моему буфер значений RSI для каждой свечки не заполняется, из-за этого и не работает. Вот код.

 

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

Помогите пожалуйста, мозг кипит, бьюсь уже пару дней, но никак не вдуплю в чем проблема.

Пытаюсь написать простейший индикатор на основе RSI (за аналог взят индикатор RandomIndicatorSignals.mq4 из статьи Язык MQL4 для "чайников". Пользовательские индикаторы (часть 1) (https://www.mql5.com/ru/articles/1500).

Суть простая, если RSI рисует вершину или впадину, то он рисует стрелку на графике.

Вроде все правильно сделал, но по моему буфер значений RSI для каждой свечки не заполняется, из-за этого и не работает. Вот код.

 

 

Вы в цикле обращаетесь к нерасчитанным значениям индикатора.

Поменяйте

for(i=0; i<limit; i++)

на

for(i=limit-1; i>=0; i--)
 
PapaYozh:

Вы в цикле обращаетесь к нерасчитанным значениям индикатора.

Поменяйте

на

 

 


спасибо, натолкнули на мысль! Однако хотелось бы понять "фифзический СМЫСЛ" :) как говаривал наш физик 

у самого проблема: 2 "слегка" разных  , но по сути одного действа коды: Удалить ВСЕ отложенные ордера

1) не работает как надо - удаляет только один ордер

 

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2)   работает нормально - удаляет все

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

Объясните: смысл "в цикле обращаетесь к нерасчитанным значениям индикатора"

 
PapaYozh:

Вы в цикле обращаетесь к нерасчитанным значениям индикатора.

Поменяйте

на

 

 


а можно разжевать? почему так? чтобы я в дальнейшем не допускал ошибок
 
PapaYozh:

Вы в цикле обращаетесь к нерасчитанным значениям индикатора.

Поменяйте

на

 

 


и все равно не работает, RSIBuffer3 при наведении на бар показывает только значение RSI на последнем баре
 
Merincool:

и все равно не работает, RSIBuffer3 при наведении на бар показывает только значение RSI на последнем баре

У тебя 5-й параметр равен 0 - т.е. последний бар!

сделай так:     

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

 Выдержка из доки:

double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Calculates the Relative strength index and returns its value.
Parameters:
symbol   -   Symbol the data of which should be used to calculate indicator. NULL means the current symbol.
timeframe   -   Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.
period   -   Number of periods for calculation.
applied_price   -   Applied price. It can be any of Applied price enumeration values.
shift   -   Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).
 
PapaYozh:

Вы в цикле обращаетесь к нерасчитанным значениям индикатора.

Поменяйте

на

 

 


И вот что я еще подумал, согласно вашей логике индюк должен рассчитать RSI от limit и до 0 бара, а разве есть разница с какой стороны рассчитывать RSI с конца или с начала? он же должен рассчитать RSI для каждого бара в заданном диапазоне и положить значение в буфер (то бишь в массив), а потом просто сравнить три подряд идущих значения в массиве между собой. Или не так?

 
amurik61:

У тебя 5-й параметр равен 0 - т.е. последний бар!

сделай так:     

 Выдержка из доки:

double iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Calculates the Relative strength index and returns its value.
Parameters:
symbol   -   Symbol the data of which should be used to calculate indicator. NULL means the current symbol.
timeframe   -   Timeframe. It can be any of Timeframe enumeration values. 0 means the current chart timeframe.
period   -   Number of periods for calculation.
applied_price   -   Applied price. It can be any of Applied price enumeration values.
shift   -   Index of the value taken from the indicator buffer (shift relative to the current bar the given amount of periods ago).

ща попробую, спасибо