Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1462

 
Vitaly Muzichenko:

Aqui está o tweaked, o original é simplesmente sombrio.

P.S. Dot.mq4 - original completo

Desculpe pelo longo tempo, eu estava ocupado com o trabalho.

Aqui está:

//+------------------------------------------------------------------+
//|                                                      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:

Entendo esta idéia, é útil, mas não funciona para mim neste caso. Preciso cronometrar o Testador: botão de parada pressionado no indicador

não é certo que depois de pressionar o botão as impressões serão escritas no registro

então tente escrever em cada nova barra no arquivo todas as funções de trabalhar com o ambiente - proibindo o comércio, testando, terminando o programa.....https://docs.mql4.com/ru/check

se não houver ajuda, você não pode, então procure algo através do WinAPI

HH: faça um botão e clique nele - pressione, faça todas as ações, e depois deixe o visualizador terminar o funcionamento ocioso, imho mais rápido que a busca

 
Igor Makanu:

não é certo que as impressões sejam escritas no registro depois que o botão é pressionado

então tente escrever no arquivo cada nova barra todas as funções para trabalhar com o ambiente - proibindo o comércio, testando, terminando o programa.....

Se isso não ajudar, então você não pode, então procure algo por meio do WinAPI

HH: Faça um botão e pressione - pressione, faça todas as ações, e depois deixe o visualizador terminar o funcionamento ocioso, imho mais rápido do que procurar

Botão de parada de impressão no compartimento do Testador: botão de parada pressionado

Mas ainda não o encontrei nos documentos. Para o Expert Advisor a parada é chamada pela OnDynit, para o indicador apenas a impressão na revista. O indicador deixa de testar e pronto. Na verdade, há uma pausa. Mas não é impresso na revista.

Nota

Em geral, não é difícil apagar o indicador ou fechar a janela manualmente. Mas a questão é interessante. É como o acesso ao tempo real através de um pedido a um símbolo de terceiros) É suposto acompanhar de alguma forma o final dos testes com o botão de parada).

 
Valeriy Yastremskiy:

Impressão do botão de parada no magazine do Testador: botão de parada pressionado

Mas ainda não o encontrei nos documentos. Para o Expert Advisor a parada é chamada pelo OnDeinit, pois o indicador só é impresso na revista. O indicador deixa de testar e pronto. Na verdade, há uma pausa. Mas não é impresso na revista.

Nota

Em geral, não é difícil apagar o indicador ou fechar a janela manualmente. Mas a questão é interessante. É como o acesso ao tempo real através de um pedido a um símbolo de terceiros) Parece que deveria de alguma forma rastrear o final da parada do botão de teste).

não sei

procurar no fórum IsTesting() - encontrou discussões similares

ZZY: Acho que o log imprime o terminal, mas preciso do código MQL para fazer isso

ZZZY: escreva EA, imho, a visualização do indicador é tediosa ))))

 
Artyom Trishkin:

Lamento que tenha levado tanto tempo - tenho estado ocupado com o trabalho.

Aqui está:

As mudanças são drásticas, mas não é essa a questão.

Eu vou lidar com o iMAOnArray, esse era o objetivo

Obrigado!

 
Vitaly Muzichenko:

As mudanças são dramáticas, mas não é essa a questão.

Eu vou lidar com o iMAOnArray, esse era o objetivo

Obrigado!

É que tudo aqui é exatamente o mesmo que ali. Mas na MQL5 é tão fácil quanto isso.

 

Olá. Por que ao apagar uma constante não descrita emObjectCreate();

Por exemplo, z_ordem ou oculto? Será que isso causará um erro após a compilação? Eles não participam do desenho da linha.

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); 
     } 
 
Дмитрий:

Olá. Por que ao apagar uma constante não descrita emObjectCreate();

Por exemplo, z_ordem ou oculto? Será que isso causará um erro após a compilação? Eles não participam do desenho da linha.

Ao apagar um dos parâmetros da função de entrada, tenha cuidado com as vírgulas e os parênteses de fechamento.

 
Alexey Viktorov:

Ao apagar um dos parâmetros de entrada de uma função, tenha cuidado com as vírgulas e os parênteses de fechamento.

Alexey, obrigado. Prestei atenção à pontuação, antes de tudo. O script foi reduzido a um mínimo, deixado necessário para ObjectCreate()(ponto de ancoragem, symv, AND TD). E acontece que somente no cabeçalho as constantes do código em qualquer lugar não ocorrem) sobre isso e a questão surgiu, por que eliminar pelo menos um erro ocorre. E a questão surge, pode haver condições obrigatórias com uma lista de constantes no cabeçalho. cabeçalho da função)))?
 
Dzmitry Zaitsau:
Alexey, obrigado. Prestei atenção à pontuação, antes de tudo. O roteiro foi reduzido ao mínimo, deixei o necessário para ObjectCreate()(ponto de ancoragem, symv, AND TD). E acontece que somente no cabeçalho as constantes do código em qualquer lugar não ocorrem) sobre isso e a questão surgiu, por que eliminar pelo menos um erro ocorre. E a questão surge, pode haver condições obrigatórias com uma lista de constantes no cabeçalho. cabeçalho da função)))?

Se você pudesse escrever o erro que aparece, seria mais fácil de entender, caso contrário ele sai como telepatia - adivinhe que erro eu tenho)