Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 217

 
alex_xss:

Mmm, forse.

Sei il primo che non l'ha ancora avuto))

Ma non importa, può spuntare in chiunque - quindi devi sistemarlo, purtroppo.

Ne ho molti, dipende dalla versione di MT4 (ne ho una di Alpari).

Ne ho molti di versioni diverse, sto programmando per loro :-) ma il software è sempre lo stesso, differiscono solo per il piccolo branding e piccoli chip negli indicatori/consigli.

I trucchi di PS/colore possono derivare da un'impostazione errata dei DPI del monitor, dalla presenza di "utility di correzione della temperatura del colore", da "estensioni di gioco della scheda video". E così via.

PPS/tra l'altro nessun DC ha superato (più probabilmente a causa di avidità, denaro) i propri indicatori/consiglieri/scripts/tools pacchetto. Al massimo un cruscotto scadente nei colori aziendali. Il che suggerisce in un certo senso

 

Ciao!
Puoi dirmi perché OBJPROP_XSIZE dà 0?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string mnth=(string)TimeMonth(TimeCurrent())+".";
   string dy=(string)TimeDay(TimeCurrent())+" ";
   string hr=(string)TimeHour(TimeCurrent())+":00 ";

   string TimeSig1=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   string Label1=" TEST "+Symbol()+"   "+TimeSig1+" Test:  "+mnth+dy+hr+" 1 2 3 4 5 6 7 8 9 10 11";
//string Label1="123456789"+"1"+"123456789"+"2"+"123456789"+"3"+"123456789"+"4"+"123456789"+" 5 "+"123456789";
   obj_create("Sym",Label1,50,clrWhite,15);

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void obj_create(string name,string object,int Y_distance,color Color,int size)
  {
   if(ObjectFind(name)==-1)
     {
      ObjectCreate(0,name,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,size);
      ObjectSetString(0,name,OBJPROP_FONT,"Rockwell");
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT);
      ObjectSetInteger(0,name,OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,name,OBJPROP_YDISTANCE,Y_distance);
      ObjectSetInteger(0,name,OBJPROP_COLOR,Color);
     }
   ObjectSetString(0,name,OBJPROP_TEXT,object);

//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
   
Print(" _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ obj_create  text_sizeX: ",text_sizeX);   
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Ciao!
Puoi dirmi perché OBJPROP_XSIZE dà 0?

OBJ_LABEL è un oggetto molto specifico - dopo il posizionamento e prima del primo aggiornamento del grafico, la larghezza (X_SIZE) non è definita.

Dipende dal carattere, dai dpi dello schermo. Finché le funzioni di rendering non sono completamente abilitate, non è possibile dire nulla sulla larghezza reale.

 
Maxim Kuznetsov:

OBJ_LABEL è un oggetto molto specifico - dopo il posizionamento e prima del primo aggiornamento del grafico, la larghezza (X_SIZE) è indefinita.

Dipende dal carattere, dai dpi dello schermo in generale. Finché il rendering non funziona completamente, non possiamo dire nulla sulla larghezza reale.

Prova a ridisegnarlo e poi controlla

   ObjectSetString(0,name,OBJPROP_TEXT,object);
   ChartRedraw();
//text size
   int text_sizeX=int(ObjectGetInteger(0,name,OBJPROP_XSIZE));
 
Vitaly Muzichenko:

Prova a ridisegnare e poi controlla dopo

Grazie, farò una prova!

Non ha funzionato.
 
Maxim Kuznetsov:

OBJ_LABEL è un oggetto molto specifico - dopo il posizionamento e prima del primo aggiornamento del grafico, la larghezza (X_SIZE) è indefinita.

Dipende dal carattere, dai dpi dello schermo in generale. Finché le funzioni di rendering non funzionano completamente, non posso dire nulla sulla larghezza reale.


Grazie, l'idea è chiara, sperimenterò qualcosa.

 
Nauris Zukas:


Grazie, ho capito l'idea, la sperimenterò.

ChartRedraw non ridisegna direttamente, mette solo un segno di spunta da qualche parte nella profondità del terminale "il grafico dovrebbe essere ridisegnato il prima possibile".

Per scoprire quale larghezza il marchio di testo (dovrebbe) ottenere, puoi provare TextSetFont, TextGetSize - una differenza significativa può apparire solo a HiDPI. O forse no :-) Non l'ho provato

o ottenere la larghezza di OBJ_LABEL reale già al prossimo tick/chart_event, cioè esattamente dopo il repaint

 
Maxim Kuznetsov:

ChartRedraw non ridisegna direttamente, mette solo un segno di spunta da qualche parte nella profondità del terminale "il grafico dovrebbe essere ridisegnato alla prima occasione".

Per scoprire quale larghezza un segno di testo (dovrebbe) ottenere, puoi provare TextSetFont, TextGetSize - una differenza significativa può apparire solo a HiDPI. O forse no :-) Non l'ho provato

o ottenere la larghezza di OBJ_LABEL reale già al prossimo tick/chart_event, cioè esattamente dopo aver ricaricato

L'ho già fatto funzionare, grazie! Aggiunto OnDeinit(), messo un ritardo lì, e poi OBJPROP_XSIZE.
P.S. Non riuscivo a pensare a niente di meglio da fare con il ritardo della sceneggiatura:

for(int i=100000000; i>0; i--) {} 
 
Nauris Zukas:

Grazie, ha funzionato tutto! Ho aggiunto OnDeinit(), ho messo un ritardo e poi OBJPROP_XSIZE.
P.S. Non riuscivo a pensare a niente di meglio da fare con il ritardo della sceneggiatura:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

 
Maxim Kuznetsov:

// задержка 500 милисекунд, годная для тестера

ulong timestamp=GetTickCount64();

do {

   Sleep(500/4);  // в тестере не сработает, зато спасёт GetTickCount

} while(GetTickCount64()-timestamp<500);

Grazie, ha funzionato!

   do{}
   while(GetTickCount()-Time11<1000);