Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1959

 
MatveySt #:

Эти два условия должны выполняться в месте две линии пересекаются (ma[i] пересекает si[i] с верху вниз в области перекуплености (от 80-100-го уровня) тогда должен генерироваться сигнал

//+------------------------------------------------------------------+

//|                                           002 Stochastic RSI.mq5 |

//|                                             Copyright 2022,Игорь |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2022,Игорь"


//+------------------------------------------------------------------+

//|                                           002 Stochastic RSI.mq5 |

//|                                             Copyright 2022,Игорь |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "Copyright 2022,Игорь"

#property link      "https://www.mql5.com"

#property version   "1.00"

#property indicator_chart_window

#property indicator_buffers 4

#property indicator_plots   2

//--- plot buy

#property indicator_label1  "buy"

#property indicator_type1   DRAW_ARROW

#property indicator_color1  clrBlue

#property indicator_style1  STYLE_SOLID

#property indicator_width1  1

//--- plot sell

#property indicator_label2  "sell"

#property indicator_type2   DRAW_ARROW

#property indicator_color2  clrRed

#property indicator_style2  STYLE_SOLID

#property indicator_width2  1

//-------

input int                Kperiod=5;

input int                Dperiod=3; 

input int                slowing=3; 

input ENUM_MA_METHOD     ma_method=MODE_SMA;

input ENUM_STO_PRICE     price_field=STO_LOWHIGH;

input double             level1=20;

input double             level2=80;

int                      handle;

//--- indicator buffers

double                   buyBuffer[];

double                   sellBuffer[];

double                   ma[];

double                   si[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

      handle=iStochastic(Symbol(),Period(),Kperiod,Dperiod,slowing,ma_method,price_field);

      if(handle==INVALID_HANDLE){

         Print("Ошибка загрузки индикатора iStochastic");

         return(INIT_FAILED);

       }

      

//--- indicator buffers mapping

   SetIndexBuffer(0,buyBuffer,INDICATOR_DATA);

   SetIndexBuffer(1,sellBuffer,INDICATOR_DATA);

   SetIndexBuffer(2,ma,INDICATOR_CALCULATIONS);

   SetIndexBuffer(3,si,INDICATOR_CALCULATIONS);

//--- setting a code from the Wingdings charset as the property of PLOT_ARROW

   PlotIndexSetInteger(0,PLOT_ARROW,233);

   PlotIndexSetInteger(1,PLOT_ARROW,234);

   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,10);

   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-10);

//---

   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 start;

        if(prev_calculated==0){

           start=1;

         }

        else{

           start=prev_calculated-1;

         } 

        if(CopyBuffer(handle,MAIN_LINE,0,rates_total-start,ma)==-1 ||

           CopyBuffer(handle,SIGNAL_LINE,0,rates_total-start,si)==-1){

           Alert("Signal_buffer ERROR");

           return(0);

         }

         for(int i=start;i<rates_total-start;i++){

         

           buyBuffer[i]=EMPTY_VALUE;

           sellBuffer[i]=EMPTY_VALUE;

//----------------------------------------

          if((ma[i]<si[i] && ma[i-1]>=si[i]) && (ma[i]>level2 && si[i]>level2)){

             sellBuffer[i]=high[i];

           }  

//---------------- 

           }  

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+

Вставляйте правильно код пожалуйста. Там есть специальная кнопочка для этого. Не нужно простынь делать.

Удачи

 
Vladimir Perervenko #:

Вставляйте правильно код пожалуйста. Там есть специальная кнопочка для этого. Не нужно простынь делать.

Удачи

Спасибо за подсказку.Незнал

 
//+------------------------------------------------------------------+
//|                                           002 Stochastic RSI.mq5 |
//|                                             Copyright 2022,Игорь |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022,Игорь"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   2
//--- plot buy
#property indicator_label1  "buy"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot sell
#property indicator_label2  "sell"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//-------
input int                Kperiod=5;
input int                Dperiod=3; 
input int                slowing=3; 
input ENUM_MA_METHOD     ma_method=MODE_SMA;
input ENUM_STO_PRICE     price_field=STO_LOWHIGH;
input double             level1=20;
input double             level2=80;
int                      handle;
//--- indicator buffers
double                   buyBuffer[];
double                   sellBuffer[];
double                   ma[];
double                   si[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
      handle=iStochastic(Symbol(),Period(),Kperiod,Dperiod,slowing,ma_method,price_field);
      if(handle==INVALID_HANDLE){
         Print("Ошибка загрузки индикатора iStochastic");
         return(INIT_FAILED);
       }
      
//--- indicator buffers mapping
   SetIndexBuffer(0,buyBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,sellBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,ma,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,si,INDICATOR_CALCULATIONS);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,10);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-10);
//---
   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 start;
        if(prev_calculated==0){
           start=1;
         }
        else{
           start=prev_calculated-1;
         } 
        if(CopyBuffer(handle,MAIN_LINE,0,rates_total-start,ma)==-1 ||
           CopyBuffer(handle,SIGNAL_LINE,0,rates_total-start,si)==-1){
           Alert("Signal_buffer ERROR");
           return(0);
         }
         for(int i=start;i<rates_total-start;i++){
         
           buyBuffer[i]=EMPTY_VALUE;
           sellBuffer[i]=EMPTY_VALUE;
//----------------------------------------
          if(ma[i-1]>level2 && si[i-1]>level2){
             if(ma[i]<si[i] && ma[i-1]>si[i-1])
                sellBuffer[i]=high[i];
              }
//---------------- 
           }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Вот так правильно использовать цикл в цикле?
Descubra las nuevas posibilidades de MetaTrader 5 con la comunidad y los servicios MQL5
Descubra las nuevas posibilidades de MetaTrader 5 con la comunidad y los servicios MQL5
  • 2022.05.14
  • www.mql5.com
MQL5 es un lenguaje built-in de estrategias comerciales para el terminal MetaTrader 5. Este lenguaje permite escribir sus propios sistemas automáticos de trading, indicadores técnicos, scripts y bibliotecas de funciones.
 

Всем доброго времени суток! Подскажите, чем убираются эти лишние знаки после запятой? Я видать до этого в учебнике ещё не дошёл)))

И, в результате ATR_Day как сделать, чтоб не 0,011672, а просто 116? С учётом того, что код на разных парах работать будет, с разным количеством знаков после запятой.

Смысл кода - найти среднее значение, сколько прошла цена за выбранный период,  ATR другими словами

Пол дня провозился с ним, уже мозг пухнет от массивов, переменных и функций))) Зато почти получилось, что и хотел;)

    double delta = High[1]-Low[1];   // Начинаем с бара №1
    double ATR;
    double ATR_Day;
 int OnStart()
{  
  Print("---START---"); 
    int day=5;                 // Сколько баров рассчитываем
    int bar=1;  

    for(day++ ; bar<day; bar++) 
    {
        delta=High[bar]-Low[bar];   //Разница между Макс\Мин по барам
            
   Print("B = ",bar,", H= ",High[bar],", L= ",Low[bar],", D= ",delta); 
      
        ATR=ATR+delta;             // Плюсуем все дельты       
    }
        ATR_Day= ATR/(day-1);      //блин... на -1 день делить надо...
    Print("ATR= ",ATR_Day);
  return(0);
}
 
to_ha #:

Всем доброго времени суток! Подскажите, чем убираются эти лишние знаки после запятой? Я видать до этого в учебнике ещё не дошёл)))

И, в результате ATR_Day как сделать, чтоб не 0,011672, а просто 116? С учётом того, что код на разных парах работать будет, с разным количеством знаков после запятой.

Смысл кода - найти среднее значение, сколько прошла цена за выбранный период,  ATR другими словами

Пол дня провозился с ним, уже мозг пухнет от массивов, переменных и функций))) Зато почти получилось, что и хотел;)

см. в справке DoubleToString , NormalizeDouble,  PrintFormat, StringFormat

 
Maxim Kuznetsov #:

см. в справке DoubleToString , NormalizeDouble,  PrintFormat, StringFormat

Окей, спасибо))) Щяс разберёмся;)

 

В кодобазе MQL4 имеется замечательный индикатор под названием Казахский удав. На всякий случай прикреплю его как вложение.

Его код кажется достаточно простым. Я предпринял попытку портировать его на MQL5, но она не увенчалась успехом - индикатор не просто не показывается на графике, но даже не упоминается в Окне данных.

Пожалуйста, помогите разобраться, где я накосячил. Опыта в написании индикаторов на MQL5 не имею (только советники), но инструкцию вроде читал внимательно. Вот мои потуги:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input int Length = 6;
input int CountBars = 1000; 
//+------------------------------------------------------------------+
double buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
   SetIndexBuffer(0,buffer,INDICATOR_DATA);
   ArraySetAsSeries(buffer,true);
  }
//+------------------------------------------------------------------+
//| 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[]
)
  {
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
   int shift = CountBars-1,
       zu = shift,
       zd = shift,
       swing = 0,
       swing_n = 0;
   double HH, LL,
          BH = high[shift],
          BL = low[shift];
   for(shift=CountBars-1; shift>=0; shift--)
     {
      HH=high[iHighest(NULL,0,MODE_HIGH,Length,shift+1)];
      LL=low[iLowest(NULL,0,MODE_LOW,Length,shift+1)];
      if(low[shift]<LL && high[shift]>HH)
        {
         swing=2;
         if(swing_n== 1)
            zu=shift+1;
         if(swing_n==-1)
            zd=shift+1;
        }
      else
        {
         if(low[shift]<LL)
            swing=-1;
         if(high[shift]>HH)
            swing= 1;
        }
      if(swing!=swing_n && swing_n!=0)
        {
         if(swing== 2)
           {
            swing=-swing_n;
            BH=high[shift];
            BL=low[shift];
           }
         if(swing== 1)
            buffer[zd]=BL;
         if(swing==-1)
            buffer[zu]=BH;
         BH=high[shift];
         BL=low [shift];
        }
      if(swing== 1)
        {
         if(high[shift]>=BH)
           {
            BH=high[shift];
            zu=shift;
           }
        }
      if(swing==-1)
        {
         if(low[shift]<=BL)
           {
            BL=low [shift];
            zd=shift;
           }
        }
      swing_n=swing;
     }
   return 0;
  }
 

Всем привет))) Вот, вопрос к "Бывалым" назрел, к тем кто хорошо владеет языком MQL. Посоветуйте, как начинающему всё это в голове уложить??? Просто миллион этих функций, операторов, переменных, и всего прочего... Заучивать их что-ли сразу все?.. Или по мере возникшей необходимости при кодировании искать их?.. Или это с опытом приходит уже?.. Или достаточно для начала понимать, что такая функция должна быть, и заучивать её свойства сейчас и не надо...

Не то-что сложно, просто действительно много времени надо чтоб их выучить, но не факт, что не будет каши в голове. А если не учить, то можно тогда и не знать что она есть, а именно она сейчас и нужна...

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

 
to_ha #:

Всем привет))) Вот, вопрос к "Бывалым" назрел, к тем кто хорошо владеет языком MQL. Посоветуйте, как начинающему всё это в голове уложить??? Просто миллион этих функций, операторов, переменных, и всего прочего... Заучивать их что-ли сразу все?.. Или по мере возникшей необходимости при кодировании искать их?.. Или это с опытом приходит уже?.. Или достаточно для начала понимать, что такая функция должна быть, и заучивать её свойства сейчас и не надо...

Не то-что сложно, просто действительно много времени надо чтоб их выучить, но не факт, что не будет каши в голове. А если не учить, то можно тогда и не знать что она есть, а именно она сейчас и нужна...

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

Читайте документацию…

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

Затем читайте ВСЕ функции раздела когда есть необходимость найти одну только функцию. Читать не обязательно до зазубривания, достаточно понимать, что есть функция которая возвращает что-то. А когда будет необходимость прочтёте полностью и не один раз до полного понимания написанного.

В общем зубрить ничего не надо… Я, программируя с 2008го года, сейчас не могу написать, без документации, параметры iMA()… Зачем мне забивать память информацией которая на виду… смотри и пиши. У меня микросхемы памяти погорели, а мозги забивать жалко, вот приходится выкручиваться.

 
Alexey Viktorov #:

Читайте документацию…


 Я по книге, по главам иду... Пол книги прошёл - в принципе всё понятно. Просто в мозгу появилась мысль - как ПРАВИЛЬНО это усвоить всё. Вот вы мне и подсказали, спасибо, зазубривать не надо)))

Причина обращения: