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

 
Vitaly Muzichenko:

Вот подправленный, в изначальном просто мрак.

P.S. Dot.mq4 - полный оригинал

Прошу прощения, что так долго - работой был занят.

Держи:

//+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
//--- plot ARR
#property indicator_label1  "MaOSC"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrLimeGreen,clrOrangeRed,clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ArrUP
#property indicator_label2  "Up"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ArrDN
#property indicator_label3  "Down"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrCrimson
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint     InpA=40;
//--- indicator buffers
double         BufferMAOSC[];
double         BufferColorsARR[];
double         BufferArrUP[];
double         BufferArrDN[];
double         BufferMAV[];
double         BufferMAA[];
double         BufferTMP[];
//--- gv
int a=0;
int per=0;
int val=0;
int handle_mav=INVALID_HANDLE;
int handle_maa=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAOSC,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColorsARR,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferArrUP,INDICATOR_DATA);
   SetIndexBuffer(3,BufferArrDN,INDICATOR_DATA);
   SetIndexBuffer(4,BufferMAV,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,BufferMAA,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,BufferTMP,INDICATOR_CALCULATIONS);
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,225);
   PlotIndexSetInteger(2,PLOT_ARROW,226);
//---
   ArraySetAsSeries(BufferMAOSC,true);
   ArraySetAsSeries(BufferColorsARR,true);
   ArraySetAsSeries(BufferArrUP,true);
   ArraySetAsSeries(BufferArrDN,true);
   ArraySetAsSeries(BufferMAV,true);
   ArraySetAsSeries(BufferMAA,true);
   ArraySetAsSeries(BufferTMP,true);
//---
   a=(InpA<4 ? 4 : InpA);
   per=(int)floor(sqrt(a));
   val=(int)floor(a/1.9);
//---
   handle_mav=iMA(NULL,PERIOD_CURRENT,val,0,MODE_SMA,PRICE_LOW);
   if(handle_mav==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",val,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
   handle_maa=iMA(NULL,PERIOD_CURRENT,a,0,MODE_SMA,PRICE_LOW);
   if(handle_maa==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",a,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
//---
   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 limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMAOSC,EMPTY_VALUE);
      ArrayInitialize(BufferColorsARR,2);
      ArrayInitialize(BufferArrUP,EMPTY_VALUE);
      ArrayInitialize(BufferArrDN,EMPTY_VALUE);
      ArrayInitialize(BufferMAV,0);
      ArrayInitialize(BufferMAA,0);
      ArrayInitialize(BufferTMP,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_mav,0,0,count,BufferMAV);
   if(copied!=count) return 0;
   copied=CopyBuffer(handle_maa,0,0,count,BufferMAA);
   if(copied!=count) return 0;

//--- Предварительный расчёт
   for(int i=limit;i>WRONG_VALUE;i--)
      BufferTMP[i]=2.0*BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if(SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)==0)
      return 0;
   for(int i=limit;i>WRONG_VALUE;i--)
     {
      BufferArrUP[i]=EMPTY_VALUE;
      BufferArrDN[i]=EMPTY_VALUE;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+1] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+1] ? 1 : 2);
      if((BufferColorsARR[i]==0 && BufferColorsARR[i+1]==1) || (BufferColorsARR[i]==0 && BufferColorsARR[i+1]==2))
         BufferArrUP[i]=BufferMAOSC[i];
      if((BufferColorsARR[i]==1 && BufferColorsARR[i+1]==0) || (BufferColorsARR[i]==1 && BufferColorsARR[i+1]==2))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

Эту мысль я понял, она полезна, но в данном случае мне не подходит. Мне нужно в индикаторе засечь   Tester: stop button pressed  

не факт, что после нажатия кнопки принты в журнал пишутся

поэтому пробуйте в файл каждый новый бар писать все функции работы с окружением - запрет торговли, тестирования, окончания работы программы..... https://docs.mql4.com/ru/check

если не поможет, значит нельзя, тогда остается искать что-нибудь средствами WinAPI

ЗЫ: кнопку сделайте и жмакайте ее - нажали, выполнили все действия, а визуализатор пусть потом вхолостую прогон заканчивает, имхо быстрее чем искать 

 
Igor Makanu:

не факт, что после нажатия кнопки принты в журнал пишутся

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

если не поможет, значит нельзя, тогда остается искать что-нибудь средствами WinAPI

ЗЫ: кнопку сделайте и жмакайте ее - нажали, выполнили все действия, а визуализатор пусть потом вхолостую прогон заканчивает, имхо быстрее чем искать 

Принт кнопки стоп в журнале   Tester: stop button pressed

Но вот в доках не нашел. Для советника стоп вызывает ОнДеинит, для индикатора только принт в журнали. В индикаторе происходит остановка тестирования и все. Вообще еще и пауза есть. Но вот она не принтуется в журнале.

Зы

вообще не сложно и руками удалить индикатор или окно закрыть. Но вопрос просто интересный. Это как доступ к реальному времени через запрос к стороннему символу) Вроде  должно же как то отслеживаться завершение тестирования кнопкой стоп.)

 
Valeriy Yastremskiy:

Принт кнопки стоп в журнале   Tester: stop button pressed

Но вот в доках не нашел. Для советника стоп вызывает ОнДеинит, для индикатора только принт в журнали. В индикаторе происходит остановка тестирования и все. Вообще еще и пауза есть. Но вот она не принтуется в журнале.

Зы

вообще не сложно и руками удалить индикатор или окно закрыть. Но вопрос просто интересный. Это как доступ к реальному времени через запрос к стороннему символу) Вроде  должно же как то отслеживаться завершение тестирования кнопкой стоп.)

не знаю

поиском по форуму IsTesting() - находились похожие обсуждения

ЗЫ: по моему принты в журнал выводит терминал, а нужно ведь чтобы код MQL это делал

ЗЫЗЫ: напишите ЕА, имхо, визуализация индикатора это утомительно )))

 
Artyom Trishkin:

Прошу прощения, что так долго - работой был занят.

Держи:

Изменения кардинальные, но суть не в этом. 

Буду разбираться с iMAOnArray, это и была цель

Спасибо!

 
Vitaly Muzichenko:

Изменения кардинальные, но суть не в этом. 

Буду разбираться с iMAOnArray, это и была цель

Спасибо!

Да просто всё тут именно то, что и там. Только там - в четвёрке, для этого нужны танцы с бубном, а в MQL5 вот так просто.

 

Здраствуйте. Почему при удалении константы не описаной в  ObjectCreate(); 

К примеру z_order или hidden? После компиляции выдается ошибка? Они же не участвуют в построении линии.

bool VLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="VLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time=0,            // время линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray=true,          // продолжение линии вниз 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if(!time) 
      time=TimeCurrent(); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим вертикальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
 
Дмитрий:

Здраствуйте. Почему при удалении константы не описаной в  ObjectCreate(); 

К примеру z_order или hidden? После компиляции выдается ошибка? Они же не участвуют в построении линии.

При удалении одного из входных параметров функции будьте внимательны к запятым и закрывающей скобке.

 
Alexey Viktorov:

При удалении одного из входных параметров функции будьте внимательны к запятым и закрывающей скобке.

Алексей спасибо. На пунктуацию в первую очередь обратил внимание. Скрипт сократил до минимума, оставил необходимое для  ObjectCreate() (точку привязки, симв., И ТД). И получается, что только в шапке те константы в коде ни где не встречаются) по этому и возник вопрос, почему удаляя хоть одну появляется ошибка. И возникает вопрос, может есть обязательные условия со списком констант в шапке польз. Функции)))?
 
Dzmitry Zaitsau:
Алексей спасибо. На пунктуацию в первую очередь обратил внимание. Скрипт сократил до минимума, оставил необходимое для  ObjectCreate() (точку привязки, симв., И ТД). И получается, что только в шапке те константы в коде ни где не встречаются) по этому и возник вопрос, почему удаляя хоть одну появляется ошибка. И возникает вопрос, может есть обязательные условия со списком констант в шапке польз. Функции)))?

вы бы написали какая ошибка появляется, было бы сразу понятно, а то выходит телепатия - догадайся какая у меня ошибка)

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