MQL4 - PROBLEMA - ObjectDelete();

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico

Moderatore: Dainesi

MQL4 - PROBLEMA - ObjectDelete();

Messaggioda corfurio » 06/01/2017, 12:12

Buongiorno a tutti!!
Una parte del mio lavoro si appoggia su MT4, e quindi per praticità, ogni tanto mi metto a creare degli indicatori.
Come ho scritto nel titolo, il mio problema riguarda esclusivamente la funzione ObjectDelete(), ma quando essa è applicata al ciclo FOR.
Nell' esempio che posto, l' indicatore mi crea la lista delle posizioni che apro, il mio problema che ho PER TUTTO QUELLO CHE CREO, è riuscire a far cancellare automaticamente, la riga del trade quando questo viene chiuso.
Credetemi, io sono "incompetente" ma le ho provate davvero tutte, chiedo quindi a voi, se potete darmi un consiglio riguardo a ciò che sto sbagliando.

ps: il problema io lo risolvo avendo creato un bottone [1] "posto in basso a destra" , ed ogni qual volta voglio aggiornare basta che lo clicco, e lui si aggiorna.

GRAZIE A TUTTI!!!
Allegati
TerminalTrades.rar
(1.38 KiB) Scaricato 3 volte
corfurio
 
Messaggi: 21
Iscritto il: 25/11/2015, 17:35

Pubblicità

Pubblicità
 

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda speedtrack » 06/01/2017, 13:32

non ho capito quale problema stai riscontrando con objectdelete con il for. prova questo ciclo e vedi se da errore:

Codice: Seleziona tutto
   
for(int o=ObjectsTotal(0,0);o>=0;o--){
      string name = ObjectName(0,o,0);
      int objType = ObjectType(name); 
      if((objType==OBJ_ARROW || objType==OBJ_TREND) && StringFind(name,"#",0)!=-1){
         ObjectDelete(0,name);
      }
}
speedtrack
 
Messaggi: 63
Iscritto il: 03/01/2017, 2:33

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda corfurio » 06/01/2017, 14:06

Ciao SPEEDTRACK, grazie innanzitutto di avermi risposto, non sai come è important per me sistemare questa cosa, è più di un anno che ci provo, "Non esagero", non ho mai capito come fare.

Ho preso la tua parte di codice, e l' ho provata nell' indicatore che ho allegato al primo post (TerminalTrades), anticipo che non sono sicuro di dove dovessi mettere questo for, ho fatto 2 prove:
1: Sotto il mio void che contiene il for che poi mi genera le etichette che riportano le informazioni delle operazioni, il ciclo funziona "a compilatore", ma quando poi apro e chiudo l' operazione mi trovo il medesimo problema, l' etichetta dell' operazione che CANCELLO, non viene cancellato
2: Ho creato un void deinit () d ho inserito il for, ma anche qui risultato come prima, con l' aggiunta che il mio cont+"nome etichetta", non lo rileva, quindi ho cancellato cont+, ma niente da fare.

Sicuramente sono io che sbaglio.
... ma non so dove!!!!
GRAZIE PER IL TUO AIUTO, spero mi aiuterai ancora ;)
Allegati
objectdelete.rar
(91.9 KiB) Scaricato 3 volte
corfurio
 
Messaggi: 21
Iscritto il: 25/11/2015, 17:35

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda speedtrack » 06/01/2017, 14:39

il codice che ti ho scritto serve per cancellare tutte le line di trend e le freccette che il tester di mt4 crea quando apre un ordine durante il test di una strategia. Dovresti innanzi tutto dare un nome univoco alle etichette che crei magari aggiungendo l'id dell'ordine relativo. Poi puoi usare un ciclo per controllare la corrispondenza biunivoca tra etichetta e ordine, che se falsa cancella l'oggetto. Tutte le funzioni di cui hai bisogno sono nel ciclo che ti ho scritto su; in più devi aggiungere un altro ciclo che ti serve per estrarre l'id dell ordine sia in fase di creazione dell'etichetta che in fase di eliminazione della stessa
speedtrack
 
Messaggi: 63
Iscritto il: 03/01/2017, 2:33

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda corfurio » 06/01/2017, 15:06

Ciao!
Nel ragionamento ti seguo, di meno sul replicarlo al mio indicatore, siccome ora ho davvero tante righe di codice, +di 3000, quindi ci vorrebbero settimane per sistemare tutto, cosa che farò successivamente, perchè avere una sola etichetta per tutto, mi piace molto come idea, ma devo ripartire da zero e fare delle prove, ho impostato il for dentro il void delle operazioni che apro.
Se riuscissi a capire come "tamponare" per il momento la cancellazione avrei poi più tempo per ripartire da zero su tutto.
Le "label" si creano bene, solo non capisco come sistemare questo maledetto delete, incollo la parte interessata così magari è più chiaro.


Codice: Seleziona tutto
void Operazioniincorso() {
int total=OrdersTotal();
int cont=-1;
for(int oi=total-1; oi>=0; oi--) 
{
if(OrderSelect(oi,SELECT_BY_POS))           
{
if(OrderSymbol()==ChartSymbol())
{
cont++;
int totals=OrderSymbol();
int giorniapertura=TimeDayOfYear(Time[0])-TimeDayOfYear(OrderOpenTime());
float pl=OrderProfit()+OrderCommission()+OrderSwap();
float swap=OrderSwap();
datetime dateap=OrderOpenTime()+3600;

string buysellorder;
if(OrderType()==OP_BUY )  {buysellorder="buy";}
if(OrderType()==OP_SELL) {buysellorder="sell";}
if(OrderType()==OP_BUYLIMIT ) {buysellorder="buL";}
if(OrderType()==OP_SELLLIMIT ){buysellorder="seL";}
if(OrderType()==OP_BUYSTOP )  {buysellorder="buS";}
if(OrderType()==OP_SELLSTOP ) {buysellorder="seS";}

SetLabel(cont+"oprz",OrderComment()+" >> "+buysellorder+" ["+OrderLots()+"] = "+DoubleToStr(pl,0),Gray,363,9*cont+10,3);

}}}
for(int o=ObjectsTotal (0,0);o>=0;o--){
string name = ObjectName(0,o,0);
int objType= ObjectType(name);
if(StringFind(name,cont+"oprz",0)!=-1){
ObjectDelete(0,name);
}
}
}



GRAZIE PER IL SUO SUPPORTO!!!
corfurio
 
Messaggi: 21
Iscritto il: 25/11/2015, 17:35

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda speedtrack » 06/01/2017, 15:39

Allora, prova ad aggiungere questo all'interno della funzion onStart()/onTick(), alla fine, in modo tale che viene eseguita su ogni tick, poi se riesci a piazzarla in un altro punto così da farla eseguire solo quando cancelli o chiudi un ordine è meglio.

Codice: Seleziona tutto
for(int o=ObjectsTotal(0,0);o>=0;o--){
     
   string objName = ObjectName(0,o,0);
   int objType = ObjectType(objName);
   
   if(objType==OBJ_LABEL){
      for(int i = 0; i<OrdersTotal(); i++){
         if(OrderSelect(i,SELECT_BY_POS)){
            if(StringFind(objName,IntegerToString(OrderTicket()),0)!=-1){
               ObjectDelete(0,objName);
            };
         };
      };
   };
 
};


non ti dimenticare, dove sta setLabel nel tuo codice, di aggiungere
Codice: Seleziona tutto
cont+"oprz "+(string)OrderTicket()

e rimuovi quello che hai aggiunto prima
speedtrack
 
Messaggi: 63
Iscritto il: 03/01/2017, 2:33

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda speedtrack » 06/01/2017, 15:51

scusa il codice da inserire in onStart() è questo:

Codice: Seleziona tutto
for(int o=ObjectsTotal(0,0);o>=0;o--){
     
   string objName = ObjectName(0,o,0);
   int objType = ObjectType(objName);
   bool check = false;
   
   if(objType==OBJ_LABEL){
      for(int i = 0; i<OrdersTotal(); i++){
         if(OrderSelect(i,SELECT_BY_POS)){
            if(StringFind(objName,IntegerToString(OrderTicket()),0)!=-1){
               check=true;
            };
         };
      };
   };
   
   if(!check){
      ObjectDelete(0,objName);
   };
   
};


per il resto è uguale
speedtrack
 
Messaggi: 63
Iscritto il: 03/01/2017, 2:33

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda corfurio » 06/01/2017, 15:59

CIAO!!
Grande!!! Ora funziona, nel senso che quando cancello un trade, avendo più operazioni aperte, queste scalano tutte di posto, a differenze di prima, però quella che chiudo non viene ancora cancellata, ho controllato il codice, l' ho messo nel mio in start(), e dove ho la label, ho aggiunto il codice che mi hai scritto, quindi in teoria è tutto giusto, forte tralascio qualcosa.
Ho spezzato il codice SOLO per questo pulsante, così è molto più breve, almeno avendo il codice integro, riusciamo a capire dove nasce il problema.
Io ho una void che mi rimuoveva le label (che non funzionava) magari era questa la problematica
Codice: Seleziona tutto
void RemoveObjectsOperazioniincorso(){
for(int i=ObjectsTotal()-1; i>-1; i--)
if(StringFind(ObjectName(i),"oprz")>=0) ObjectDelete(ObjectName(i));} 



Codice: Seleziona tutto
//+------------------------------------------------------------------+
//|                                               TerminalTrades.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

string button_Operazioniincorso="Operazioniincorso";

double MyPoint()
  {
   int digits=MarketInfo(Symbol(),MODE_DIGITS);string point=DoubleToStr(MarketInfo(Symbol(),MODE_POINT),digits);
   if(point=="0.00001")
     {
      return(0.0001);}else {if(point=="0.001"){return(0.001);}
      //else { if(point=="0.001"){return(0.0001);}
      return(Point);
     }
  }
 
 
  int init()
  { 
   ObjectCreate(0,button_Operazioniincorso,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_COLOR,clrBlue);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_BGCOLOR,clrGray);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_XDISTANCE,28);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_YDISTANCE,13);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_CORNER,3);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_XSIZE,14);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_YSIZE,13);
   ObjectSetString(0,button_Operazioniincorso,OBJPROP_FONT,"Calibri");
   ObjectSetString(0,button_Operazioniincorso,OBJPROP_TEXT,"1");
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,button_Operazioniincorso,OBJPROP_SELECTABLE,0);
   return(INIT_SUCCEEDED);
  }
 


int deinit (){


RemoveObjectsOperazioniincorso();

return(0);
}

void Operazioniincorso() {
int total=OrdersTotal();
int cont=-1;
for(int oi=total-1; oi>=0; oi--) 
{
if(OrderSelect(oi,SELECT_BY_POS))           
{
if(OrderSymbol()==ChartSymbol())
{
cont++;
int totals=OrderSymbol();
int giorniapertura=TimeDayOfYear(Time[0])-TimeDayOfYear(OrderOpenTime());
float pl=OrderProfit()+OrderCommission()+OrderSwap();
float swap=OrderSwap();
datetime dateap=OrderOpenTime()+3600;

string buysellorder;
if(OrderType()==OP_BUY )  {buysellorder="buy";}
if(OrderType()==OP_SELL) {buysellorder="sell";}
if(OrderType()==OP_BUYLIMIT ) {buysellorder="buL";}
if(OrderType()==OP_SELLLIMIT ){buysellorder="seL";}
if(OrderType()==OP_BUYSTOP )  {buysellorder="buS";}
if(OrderType()==OP_SELLSTOP ) {buysellorder="seS";}

SetLabel(cont+"oprz"+(string)OrderTicket(),OrderComment()+" >> "+buysellorder+" ["+OrderLots()+"] = "+DoubleToStr(pl,0),Gray,363,9*cont+10,3);

}}}

}


int start(){

for(int o=ObjectsTotal(0,0);o>=0;o--){
     
   string objName = ObjectName(0,o,0);
   int objType = ObjectType(objName);
   
   if(objType==OBJ_LABEL){
      for(int i = 0; i<OrdersTotal(); i++){
         if(OrderSelect(i,SELECT_BY_POS)){
            if(StringFind(objName,IntegerToString(OrderTicket()),0)!=-1){
               ObjectDelete(0,objName);
            };
         };
      };
   };
 
};

if(!ObjectGetInteger(0,button_Operazioniincorso,OBJPROP_STATE))
Operazioniincorso();
else RemoveObjectsOperazioniincorso();

return(0);}

void RemoveObjectsOperazioniincorso(){
for(int i=ObjectsTotal()-1; i>-1; i--)
if(StringFind(ObjectName(i),"oprz")>=0) ObjectDelete(ObjectName(i));}   



void OnChartEvent(const int id,
                     const long &lparam,
                     const double &dparam,
                     const string &sparam)
{
if(id==CHARTEVENT_OBJECT_CLICK)
{
if(sparam==button_Operazioniincorso)
if(ObjectGetInteger(0,button_Operazioniincorso,OBJPROP_STATE))
RemoveObjectsOperazioniincorso();

}
if(id==CHARTEVENT_OBJECT_DRAG)
WindowRedraw();
}

void SetLabel(string name,string text,color clr,int xdistance,int ydistance,int corner=1,int fontsize=8)
{
if(ObjectFind(name)==-1)
{
ObjectCreate(name,OBJ_LABEL,0,0,0);
ObjectSet(name,OBJPROP_XDISTANCE,xdistance);
ObjectSet(name,OBJPROP_YDISTANCE,ydistance);
ObjectSet(name,OBJPROP_CORNER,corner);
ObjectSet(name,OBJPROP_BACK,false);
ObjectSet(name,OBJPROP_SELECTABLE,false);
}
ObjectSetText(name,text,fontsize,"Calibri",clr);
}


GRAZIE ANCORA, TROPPO GENTILE ;)
corfurio
 
Messaggi: 21
Iscritto il: 25/11/2015, 17:35

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda speedtrack » 06/01/2017, 16:07

ho aggiornato il codice, il doppio ciclo for (aggiornato) va messo alla fine di onStart() e in più devi aggiungere il ticket dell'ordine nel nome della lable così
Codice: Seleziona tutto
cont+"oprz "+(string)OrderTicket()

cancella tutto quello che hai aggiunto dall'inizio della discussione
speedtrack
 
Messaggi: 63
Iscritto il: 03/01/2017, 2:33

Re: MQL4 - PROBLEMA - ObjectDelete();

Messaggioda corfurio » 06/01/2017, 17:26

Ciao!
Allora, ho aggiornato il doppio ciclo for alla fine di int start(), e messo uno spazio alla label come da te descritto, quindi "oprz " e non "oprz", preceduto da cont e seguito da string e OrderTicket. Il compilatore non da problemi, ma ora se chiudo la posizione, le etichette degli ordini aperti non slittano più, e il trade cancellato non si cancella dal grafico.

Codice: Seleziona tutto
int start(){

for(int o=ObjectsTotal(0,0);o>=0;o--){
     
   string objName = ObjectName(0,o,0);
   int objType = ObjectType(objName);
   bool check = false;
   
   if(objType==OBJ_LABEL){
      for(int i = 0; i<OrdersTotal(); i++){
         if(OrderSelect(i,SELECT_BY_POS)){
            if(StringFind(objName,IntegerToString(OrderTicket()),0)!=-1){
               check=true;
            };
         };
      };
   };
   
   if(!check){
      ObjectDelete(0,objName);
   };
   
};
return(0);}

seguito dalla label:
Codice: Seleziona tutto
SetLabel(cont+"oprz "+(string)OrderTicket(),OrderComment()+" >> "+buysellorder+" ["+OrderLots()+"] = "+DoubleToStr(pl,0),Gray,363,9*cont+10,3);

Non credo di sbagliare niente, anche perchè ho seguito alla lettere tutto, spero ;)
Grazie, a presto!!
Allegati
CROSSTRADES.rar
(5.75 KiB) Scaricato 4 volte
corfurio
 
Messaggi: 21
Iscritto il: 25/11/2015, 17:35

Prossimo

Torna a Metatrader - Expert Advisor - MQL

 


  • Discussioni correlate
    Risposte
    Visite
    Ultimo messaggio

Chi c’è in linea

Visitano il forum: Google [Bot] e 0 ospiti