Domande da un "manichino" - pagina 262

 
agvozdezkiy:

Ho appena iniziato a imparare MQL, e così ho scritto un EA che disegna una iMA e traccia una tangente (molto vicina) al grafico nella iMA nel punto in cui il puntatore del mouse è sull'asse del tempo.

Primo problema. L'Expert Advisor è MOLTO lento. Significa che la tangente viene ridisegnata per molto tempo e non segue il movimento del mouse...

Guarda la mia versione:

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

Sul mio portatile - tutto vola!

 

Ottengo l'errore 5040 (parametro corrotto di tipo stringa) la prima volta che chiamo la funzione di creazione dell'oggetto

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

Se prima di una chiamata impostata

nTL="";

errore 4002 (parametro non valido quando si chiama la funzione terminale client internamente)

Se impostato prima della chiamata

nTL="a";

il primo oggetto si chiamerà a.

Io lo chiamo così

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

Potresti dirmi dove c'è un errore?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

Nella vecchia versione.

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

non ha mai avuto alcun guasto.

È un bug nel codice o nel terminale?

 
Silent:

Puoi dirmi dov'è l'errore?

Non so dove sia l'errore, ma la gestione dei nomi degli oggetti è a dir poco discutibile.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
Non è chiaro perché si dovrebbe volere un numero casuale nel nome dell'oggetto, questo può anche portare ad un errore.
 
Silent:

Ottengo l'errore 5040 (parametro corrotto di tipo stringa) la prima volta che chiamo la funzione di creazione dell'oggetto

Se prima di una chiamata impostata

errore 4002 (parametro non valido quando si chiama la funzione terminale client internamente)

Se impostato prima della chiamata

il primo oggetto si chiamerà a.

Io chiamo così

Puoi dirmi dov'è l'errore?

Siete preoccupati perché Get LastError stampa qualcosa di diverso da zero? Se è così, dovreste chiamare un errore solo se la funzione riporta un fallimento. E non dovreste chiedere un errore alla fine della trama, potreste ottenere un valore spazzatura. Questo è come è in MT4, forse qui è diverso.

Pseudocodice:

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

Ottengo l'errore 5040 (parametro corrotto di tipo stringa) la prima volta che chiamo la funzione di creazione dell'oggetto

Se prima di una chiamata impostata

errore 4002 (parametro non valido quando si chiama la funzione terminale client internamente)

Se impostato prima della chiamata

il primo oggetto si chiamerà a.

Io lo chiamo così

Potresti dirmi dov'è l'errore?

Prova a "incollare" le stringhe attraverso StringConcatenate()

 
TheXpert:
Non so dove sia l'errore, ma la gestione dei nomi degli oggetti è molto discutibile, per usare un eufemismo.
Mi scervellerò per un'altra settimana. Può descriverlo più dettagliatamente? (si può essere rozzi :))
zfs:
Non è chiaro perché avete bisogno di un numero casuale nel nome dell'oggetto, potrebbe portare ad un errore.

C'è un'altra opzione per un paio di centinaia di oggetti con nomi unici?

(Un gruppo di oggetti dovrebbe avere la stessa parte della stringa nel nome, per rimuovere il gruppo).

 
220Volt:

Sei preoccupato perché Get Last Errors stampa qualcosa di diverso da zero? Se è così, dovreste chiedere un errore solo se la funzione riporta un fallimento. E non dovreste chiedere un errore alla fine della trama, potreste ottenere un valore spazzatura. È così in MT4, forse qui è diverso.

No, perché la prima chiamata non crea un oggetto a causa di un errore. Duplico (per ora) la linea della prima chiamata, poi dalla seconda esecuzione si crea.
 
220Volt:

Sei preoccupato perché Get Last Errors stampa qualcosa di diverso da zero?

Beh, logicamente, se la funzione imposta l'ultimo errore, allora al completamento della funzione dovrebbe esserci un errore zero o il valore descritto nella documentazione. Non c'è altro modo.

Cioè, se la chiamata ha avuto successo e l'errore è non-zero, questo caso deve essere descritto nella documentazione.

Silenzioso:

Mi scervellerò in questo modo per un'altra settimana. Posso darvi qualche dettaglio in più? (Puoi essere rozzo :))

Beh, di solito i nomi degli oggetti dello stesso tipo sono formati da una parte comune, per una facile rimozione ("nTL_" nel vostro caso) e differenze. Uso anche l'identificatore di modulo, se ci può essere più di uno di questi stessi moduli contemporaneamente sul grafico.

La differenza può essere qualsiasi cosa, anche un contatore, che si aumenta ogni volta che si crea un oggetto. Ma è meglio fare delle distinzioni per logica - tempo dell'oggetto, coordinate dell'oggetto, l'obiettivo è di ottenere un'unicità garantita. L'effetto collaterale è che costruendo di nuovo un nome, si possono cambiare le proprietà di un oggetto già creato.

Il random non fornisce questa "unicità garantita".

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5