Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1462

 
Vitaly Muzichenko:

Ecco quello modificato, l'originale è semplicemente cupo.

P.S. Dot.mq4 - originale completo

Scusate per il lungo tempo, sono stato occupato con il lavoro.

Ecco a voi:

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

Capisco questa idea, è utile, ma non funziona per me in questo caso. Ho bisogno di cronometrare il Tester: pulsante di arresto premuto nell'indicatore

non è certo che dopo aver premuto il pulsante le stampe vengano scritte nel registro

quindi cercate di scrivere ogni nuova barra nel file tutte le funzioni di lavoro con l'ambiente - divieto di trading, test, terminazione del programma.....https://docs.mql4.com/ru/check

se nessun aiuto, allora non è possibile, quindi cercare qualcosa per mezzo di WinAPI

HH: fai un pulsante e cliccalo - premilo, fai tutte le azioni, e poi lascia che il visualizzatore finisca l'esecuzione in modo pigro, imho più veloce della ricerca

 
Igor Makanu:

non è certo che le stampe siano scritte nel registro dopo la pressione del pulsante

quindi cercate di scrivere nel file ogni nuova barra tutte le funzioni per lavorare con l'ambiente - vietando il trading, testando, terminando il programma.....

Se non aiuta, allora non è possibile, allora cercate qualcosa per mezzo di WinAPI

HH: Fai un pulsante e premilo - premilo, fai tutte le azioni, e poi lascia che il visualizzatore finisca l'esecuzione in modo pigro, imho più veloce che cercare

Pulsante di arresto della stampa nella rivista Tester: pulsante di arresto premuto

Ma non l'ho trovato nei documenti. Per l'Expert Advisor stop è chiamato da OnDynit, per l'indicatore solo la stampa nel giornale. L'indicatore ha smesso di testare e questo è tutto. C'è effettivamente una pausa. Ma non è stampato nel giornale.

Nota

In generale, non è difficile cancellare l'indicatore o chiudere la finestra manualmente. Ma la domanda è interessante. È come l'accesso al tempo reale attraverso una richiesta a un simbolo di terze parti) Si suppone che tracci in qualche modo la fine dei test con il pulsante di stop).

 
Valeriy Yastremskiy:

Stampa del pulsante di arresto nella rivista Tester: pulsante di arresto premuto

Ma non l'ho trovato nei documenti. Per l'Expert Advisor stop è chiamato da OnDeinit, per l'indicatore solo stampa nel giornale. L'indicatore smette di testare e questo è tutto. C'è effettivamente una pausa. Ma non è stampato nel giornale.

Nota

In generale, non è difficile cancellare l'indicatore o chiudere la finestra manualmente. Ma la domanda è interessante. È come l'accesso al tempo reale attraverso una richiesta a un simbolo di terze parti) Sembra che dovrebbe in qualche modo tracciare la fine del pulsante di prova stop).

non so

cerca nel forum IsTesting() - trovato discussioni simili

ZZY: Penso che il log stampi il terminale, ma ho bisogno del codice MQL per farlo

ZZZY: scrivere EA, imho, la visualizzazione dell'indicatore è noiosa ))))

 
Artyom Trishkin:

Mi dispiace che ci sia voluto così tanto tempo - sono stato occupato con il lavoro.

Ecco a voi:

I cambiamenti sono drastici, ma non è questo il punto.

Mi occuperò di iMAOnArray, questo era l'obiettivo

Grazie!

 
Vitaly Muzichenko:

I cambiamenti sono drammatici, ma non è questo il punto.

Mi occuperò di iMAOnArray, questo era l'obiettivo

Grazie!

È solo che qui tutto è esattamente uguale a lì. Ma in MQL5 è così facile.

 

Salve. Perché quando si cancella una costante non descritta inObjectCreate();

Per esempio, z_order o hidden? Causerà un errore dopo la compilazione? Non partecipano a tracciare la linea.

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

Salve. Perché quando si cancella una costante non descritta inObjectCreate();

Per esempio, z_order o hidden? Causerà un errore dopo la compilazione? Non partecipano a tracciare la linea.

Quando si cancella uno dei parametri della funzione di input, fare attenzione alle virgole e alle parentesi di chiusura.

 
Alexey Viktorov:

Quando si cancella uno dei parametri di ingresso di una funzione, fate attenzione alle virgole e alle parentesi di chiusura.

Alexey, grazie. Ho prestato attenzione alla punteggiatura, prima di tutto. Lo script ha ridotto al minimo, lasciato necessario per ObjectCreate()(punto di ancoraggio, symv, E TD). E si scopre che solo nell'intestazione quelle costanti nel codice ovunque non si verificano) su questo e la domanda è sorta, perché cancellare almeno un errore si verifica. E la domanda sorge spontanea, ci possono essere condizioni obbligatorie con una lista di costanti nell'intestazione. funzione intestazione))?
 
Dzmitry Zaitsau:
Alexey, grazie. Ho prestato attenzione alla punteggiatura, prima di tutto. Lo script è stato ridotto al minimo, ho lasciato il necessario per ObjectCreate()(punto di ancoraggio, symv, E TD). E si scopre che solo nell'intestazione quelle costanti nel codice ovunque non si verificano) su questo e la domanda è sorta, perché cancellare almeno un errore si verifica. E la domanda sorge spontanea, ci possono essere condizioni obbligatorie con una lista di costanti nell'intestazione. funzione intestazione))?

Se tu potessi scrivere quale errore appare, sarebbe più facile da capire, altrimenti viene fuori come telepatia - indovina che errore ho)