Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 989

 
Aleksey Vyazmikin:

Come posso trovare il motivo di questo messaggio?

Profiler

 
Artyom Trishkin:

Non sai come controllare il valore di ritorno per lo zero? E non sapete come uscire da OnCalculate() con un ritorno di zero? Non avete mai provato a cercare informazioni sul sito web?

  1. Ottenere il valore richiesto dalla funzione
  2. Controlla se è zero
    1. Se è zero, allora ritorna 0;
    2. Se non è zero, allora al passo 3
  3. Lavorare con questo valore
Non avrei mai pensato che avrei raccontato le basi della logica su questa risorsa a un uomo con un rating superiore a 13 mila...

Questo non è un indicatore.

Ho intenzionalmente specificato se devo fare controlli ad ogni chiamata o uno all'inizio di OnTick è sufficiente...

I ritorni non sono accettabili per me ... e per loop l'attesa nel tester è impossibile, e nel reale dovrebbe funzionare (o no?).

Il mio voto non è per la programmazione, non sono un programmatore, e sto imparando questo business complicato solo grazie a persone come te, apprezzo molto il feedback di persone competenti.

Grazie per la vostra comprensione.

 
Artyom Trishkin:

Profiler

E se succede una volta al giorno o meno?

 
Salve. Per qualche motivo Handel trasmette solo quando è impostato su tutti i periodi, ma ho impostato su un periodo specifico e non c'è nulla. Non so quale sia il problema. Ho provato a digitare direttamente in handel non da variabili globali, il risultato è lo stesso. Cosa c'è che non va? Ho bisogno che il valore sia di un periodo.
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

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

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
Salve. Non riesco a trovare nulla, per qualche motivo l'handel si trasferisce solo quando è impostato su tutti i periodi, ma l'ho impostato su un certo periodo e non succede nulla. Non so quale sia il problema. Ho provato a inserire dati non da variabili globali direttamente in handel, il risultato è lo stesso. Cosa c'è che non va?
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
     {
      PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
      return(0.0);
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

Studia l'errore, Artem ha ragione nel dire che dovresti controllare tutto 10 volte...

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

ERRARE_INVALIDO_ARRAY

4006

Array di tipo inadeguato, dimensione inadeguata o oggetto dinamico di array corrotto


ERRATO_INDICATORE_DATI_NON_TROVATO

4806

Dati richiesti non trovati


 
kopeyka2:
Salve. Ho notato che l'handel si trasferisce solo quando è impostato per tutti i periodi, ma quando lo imposto per un certo periodo, non succede niente. Non capisco quale sia il problema. Ho provato a digitare direttamente in handel non da variabili globali, il risultato è lo stesso. Cosa c'è che non va? Ho bisogno che il valore sia dello stesso periodo.

Prendete esempi dal CodeBase degli indicatori di Scriptor, vero? Giusto? Poi cercate nel suo codice (pubblicato di recente) esempi che hanno MTF nel loro nome, ma senza MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Cioè, se volete ottenere dati sul simbolo corrente, ma da un altro timeframe rispetto al periodo del grafico, allora avete bisogno di un esempio di indicatore multi-timeframe. In MCP non dovreste ancora essere coinvolti - lì sull'OOP con l'uso delle classi standard. Vi confonderete.

Per esempio, questo calcolo:

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

È solo per il MA che lavora sul periodo e sul simbolo corrente. Per lavorare su un periodo diverso, il calcolo sarà diverso. Cerca - tutto è vicino, e la direzione che ti ho dato.

 
Artyom Trishkin:

Prendete esempi dal CodeBase degli indicatori di Scriptor, vero? Giusto? Poi cercate nel suo codice (pubblicato di recente) esempi che hanno MTF nel loro nome, ma senza MCP.

MTF = MultiTimeFrame, MCP = MultiCurrencyPair. Cioè, se volete ottenere dati sul simbolo corrente, ma da un altro timeframe rispetto al periodo del grafico, allora avete bisogno di un esempio di indicatore multi-timeframe. In MCP non dovreste ancora essere coinvolti - lì sull'OOP con l'uso delle classi standard. Vi confonderete.

Per esempio, questo calcolo:

è solo per MA che lavora sul periodo corrente e sul simbolo. Per il lavoro su un periodo diverso, il calcolo sarà diverso. Cerca - tutto è vicino, e ti ho dato la direzione.

Grazie...
 
Aleksey Vyazmikin:

Studia l'errore, Artem ha ragione nel dire che dovresti controllare tutto 10 volte...

ERRARE_INVALIDO_ARRAY

4006

Array di tipo inadeguato, dimensione inadeguata o oggetto dinamico di array corrotto

Grazie
 
kopeyka2:
Grazie

Per favore, ma ho copiato l'errore sbagliato, dovrebbe essere

ERRARE_INDICATORE_DATI_NON_TROVATO

4806

I dati richiesti non sono stati trovati

Il punto è che il numero di barre è diverso per i diversi TF e questo dovrebbe essere preso in considerazione.

 
Aleksey Vyazmikin:

Per favore, ma ho copiato l'errore sbagliato, dovrebbe essere

ERRATO_INDICATORE_DATI_NON_TROVATO

4806

I dati richiesti non sono stati trovati

Il punto è che il numero di barre è diverso per i diversi TF e questo dovrebbe essere preso in considerazione.

Stavo solo controllando. Ma il PROBLEMA è che avendo impostato handel su un periodo costante, in

CopyBuffer il valore su altri timeframe NON è PERMANENTE. Sul periodo di maniglia impostato il valore era, ma sui timeframe più piccoli 0,0 (zero). Si è mosso alla ricerca del buffer... zero. Perché non viene passato aCopyBuffer?