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

 
Vladimir Pastushak:

А как узнать тип входного параметра? 

пишу ж, что типы компилятор сам подставляет в момент вызова шаблонной функции, если такого вызова еще не было в коде, то компилятор создаст еще одну копию функции и поставит сам типы - ну как бы логично - шаблон


если вопрос про как в такой функции определить тип, используйте 

typename

UPD: дописал в пример выше принты типа параметров:

#define PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: дополнил еще __FUNCSIG__ этот пример 

 

Добрый день.
Столкнулся с некоторой странностью при написании индикатора на MQL5 (индикатор в отдельном подокне, 4 линии).

Начальные описания буферов такие:

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

Далее в OnInit:

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).

Двухцветность за счет способа рисования DRAW_COLOR_LINE.

Теперь вопрос: первая линия (буфера 2 и 3 в коде выше)  прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit;
вторая линия почему-то выпендривается: например явно не срабатывает строка:

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная.
Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?

Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....

И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?

 
satorifx:

Добрый день.
Столкнулся с некоторой странностью при написании индикатора на MQL5 (индикатор в отдельном подокне, 4 линии).

Начальные описания буферов такие:

Далее в OnInit:

По сути: индикатор рисует 4 линии: две первые - просто одноцветные, две последующие - двухцветные (меняют цвет на перегибах).

Двухцветность за счет способа рисования DRAW_COLOR_LINE.

Теперь вопрос: первая линия (буфера 2 и 3 в коде выше)  прекрасно рисуется, срабатывает весь код, который для нее прописан в OnInit;
вторая линия почему-то выпендривается: например явно не срабатывает строка:

Т.е вместо заданного мной текста в окне данных на месте буфера отображается просто имя индикатора. Хотя сама по себе линия рисуется, и она, как и надо, разноцветная.
Полагаю, здесь прикол в сдвиге нумерации? Мне, например, не очень понятно, почему в верхней части кода, когда объявляю последнюю линию через директивы #property, индекс должен быть 4, а не 5, ведь буферов уже перед этим использовано 4. Есть ли вообще какая то связь между нумерацией линий при объявлении через директивы #property и нумерацией буферов при связывании с массивами в OnInit?

Подскажите, что в коде выше не так. Возможно у кого-то просто найдется пример индикатора, в котором рисуются хотя бы две линии с помощью способа рисования DRAW_COLOR_LINE....

И еще попутный вопрос: каким образом связываются буфера разноцветной линии? Всмысле откуда скомпилированный код знает, что если я помещу значение в буфер цвета, то этим цветом надо разукрасить линию какого то другого буфера?

Нумерация отображений отличается от нумерации буферов.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

так должно сработать.

 

Всем добрый день!

Сделал функцию модификации стоплосса. Но при работе выдает  EURUSD,H1: OrderModify error 130.

Причем цена далеко от того места куда должен встать стоплосс.

вот сама функция:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Доброго времени суток. Хочу написать советник, основанный на измерении угла наклона скользящей средней (а лучше набора таковых, а именно Аллигатор), чтоб советник выдавал алерт при сильном импульсе цены, желательно с малым запаздыванием. Подскажите пожалуйста как измерить угол МА или "объяснить  советнику" что произошёл импульс. Может есть какие либо уже известные способы это решить. Или к примеру бесплатный индикатор основанный на вычислении резких импульсов? 
 

Написал функцию для нахождения номера бара фрактала из 3х баров. На онлайн графике вроде определяет правильно. А при визуальном тестировании  в тестере врёт. Может кто-нибудь из профессионалов, глянув на код, обнаружит какие-нибудь огрехи?

Буду премного благодарен.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
Файлы:
 

Здравствуйте! 

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

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Доброго времени суток. КАКОЙ КОД НУЖНО ДОБАВИТЬ ЧТОБЫ ИНДИКАТОР ПЕРЕСТАЛ РАБОТАТЬ В ТЕСТЕРЕ ЧЕРЕЗ МЕСЯЦ ? ТОЕСТЬ Я НАПИСАЛ ВСЁ ОК! НО КОГДА УЖЕ ДЕЛАЮ БЭКТЕСТ СНОВА РАБОТАЕТ. (мгл4)

Тебе не в OnInit надо писать данный код, а в OnTick().

 
Yerkin Sagandykov:

Здравствуйте! 

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

Попробуйте так:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }