Chiedete! - pagina 21

 
billworld2:
C'è un modo per cancellare gli oggetti in base a una stringa di testo selezionata all'interno del nome dell'oggetto?

Ecco l'esempio:

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<OggettiTotali();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return(true);

 
billworld2:
Uno dei miei progetti di apprendimento sta andando a personalizzare il tester.tpl che regola l'opzione di visualizzazione del grafico per lo Strateg Tester. Trovo lo stile grafico di default molto difficile da visualizzare. Così, ho creato un nuovo modello e poi ho costruito uno script per sostituire tutte le frecce con delle frecce più attraenti.

Tuttavia, vorrei anche prendere le informazioni nei nomi delle frecce e visualizzarle come testo sul grafico. I nomi delle frecce includono cose come "#62 buy" o "73 sell close". In questo modo si può guardare il grafico e vedere esattamente quando un particolare trade # è entrato/uscito. Non so perché questo non è incluso di default in Strategy Tester come lo è in altre piattaforme (per esempio TradeStation).

Comunque, vorrei prendere il testo in questione e inserire nuovi oggetti di testo proprio sotto le frecce esistenti sul grafico. Ma non riesco a capire come realizzare questo.

Come posso fare?

Grazie

Bill

Beh, puoi scrivere uno script o una funzione che legga le informazioni sulla freccia e crei un'etichetta di testo sotto di essa. Poi eseguire lo script ogni volta che viene disegnata una nuova freccia. O semplicemente mettere la funzione alla fine della funzione principale dell'ea. Non so perché queste informazioni non sono standard in Metatrader, ma è semplice codificare questo tipo di funzionalità.

 
Kalenzo:
Dovresti leggere le funzioni Data e Ora, e usare la funzione iBarShift per ottenere lo spostamento della prima barra dal mese specificato dal timeframe specificato.

So che deve essere banale per voi. Solo che non lo sto ancora capendo seguendo la limitata documentazione (non ci sono molti esempi forniti). Potresti gentilmente fornire un esempio di come farlo?

Grazie

Bill

 
Kalenzo:
Beh, puoi scrivere uno script o una funzione che legga le informazioni sulla freccia e crei un'etichetta di testo sotto di essa. Poi eseguire lo script ogni volta che una nuova freccia è disegnata. O semplicemente mettere la funzione alla fine della funzione principale dell'ea. Non so perché queste informazioni non sono standard in Metatrader, ma è semplice codificare questo tipo di funzionalità.

Grazie, ma sono bloccato in particolare su come codificare lo script. Se hai tempo di fornire un breve esempio, sarebbe molto apprezzato.

Grazie ancora.

Bill

 

Non sono sicuro di seguire. Per essere chiari, sto cercando un modo per fare una corrispondenza di sottostringhe basata sul nome di un oggetto. Diciamo per esempio che ho un gruppo di oggetti con la stringa "-206" in essi (insieme ad altro testo). Voglio individuare ed eliminare tutti gli oggetti che contengono "-206" nel loro nome.

Quello che mi confonde nell'esempio seguente è l'associazione con OBJPROP_TIME1, OBJPROP_TIME2 e OBJPROP_TIME3. So che gli oggetti possono avere fino a tre coordinate temporali. Non sto seguendo come questo si adatta a ciò che sto cercando di fare.

Kalenzo:
Ecco l'esempio:

datetime currentDay = StrToTime(Year()+". "+Month()+". "+Day()+" 00.00");

for(int i=0;i<OggettiTotali();i++)

{

string name = ObjectName(i);

if( ObjectGet(name,OBJPROP_TIME1) < currentDay && ObjectGet(name,OBJPROP_TIME2) < currentDay && ObjectGet(name,OBJPROP_TIME3) < currentDay)

{

ObjectDelete(ObjectName(i));

return (false);

}

}

return(true);
 
billworld2:
Non sono sicuro di seguire. Per essere chiari, sto cercando un modo per fare una corrispondenza di sottostringhe basata sul nome di un oggetto. Diciamo per esempio che ho un gruppo di oggetti con la stringa "-206" in essi (insieme ad altro testo). Voglio individuare ed eliminare tutti gli oggetti che contengono "-206" nel loro nome. Quello che mi confonde nell'esempio qui sotto è l'associazione con OBJPROP_TIME1, OBJPROP_TIME2 e OBJPROP_TIME3. So che gli oggetti possono avere fino a tre coordinate temporali. Non sto seguendo come questo si adatti a ciò che sto cercando di fare.

Ok, provate questo:

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if(StringSubstr( nome, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Se le prime 3 lettere del nome dell'oggetto saranno 206 allora l'oggetto sarà cancellato

 
billworld2:
Grazie, ma sono bloccato in particolare su come codificare lo script. Se hai tempo di fornire un breve esempio, sarebbe molto apprezzato.

Grazie ancora.

Bill

prima dichiarare variabile globale (globale per lo script) int objectCount;

poi alla fine del processo ea tutti gli oggetti (puoi per esempio cercarli per nome)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//allora se l'etichetta dell'oggetto non esiste disegnala, diciamo che prenderemo il

//nome della freccia esistente e aggiungiamo l'etichetta L ad essa, per identificarla

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point));

// e questo è tutto

}

}

Questo è solo un esempio, non ho il tempo di controllarlo per possibili bug ma questo dovrebbe funzionare, e ora sapete il modo giusto.

 

Ok, ho capito. Ho capito. In realtà avevo bisogno di usare StringFind(). Grazie per le indicazioni!

#proprietà show_inputs

extern string stringname="blah";

//+------------------------------------------------------------------+

//| funzione di avvio del programma script |

//+------------------------------------------------------------------+

int start()

{

//----

for(int i=0;i<ObjectsTotal();i++)

if(StringFind(ObjectName(i),stringname,0)>0)

{

ObjectDelete(ObjectName(i));

}

Kalenzo:
Ok, prova questo:

for(int i=0;i<ObjectsTotal();i++)

{

string name = ObjectName(i);

if(StringSubstr( nome, 0, 3)==206)

{

ObjectDelete(ObjectName(i));

}

}

Se le prime 3 lettere del nome dell'oggetto saranno 206 allora l'oggetto sarà cancellato
 

Grazie, ma questo non funziona. Prima, ho cambiato "i>=ObjectsTotal" in "i<=ObjectsTotal" (refuso). Poi, ho notato che stai creando un altro oggetto freccia dove vogliamo creare un nuovo oggetto testo che include il nome dell'oggetto freccia. Comunque, il codice qui sotto sta creando un mucchio di frecce (circa 50) tutte sovrapposte sulle stesse coordinate.

Mi sono ancora perso su questo. Se hai la possibilità di dare un'altra occhiata, sarebbe molto apprezzato. Per essere chiari, sto cercando di creare un nuovo oggetto testo che viene posizionato sotto ogni oggetto freccia esistente dove la descrizione del testo dell'oggetto testo è uguale al nome dell'oggetto freccia.

Bill

Kalenzo:
prima dichiarare variabile globale (globale per lo script) int objectCount;

poi alla fine del processo ea tutti gli oggetti (puoi per esempio cercarli per nome)

for(int i=0;i>=ObjectsTotal(OBJ_ARROW) ;i++)

{

//allora se l'etichetta dell'oggetto non esiste disegnala, diciamo che prenderemo il

//nome della freccia esistente e aggiungiamo l'etichetta L ad essa, per identificarla

if(ObjectFind(ObjectName(i)+"L")== -1)

{

ObjectCreate(ObjectName(i)+"L",OBJ_ARROW,0,ObjectGet(ObjectName(i), OBJPROP_TIME1),ObjectGet(ObjectName(i),(OBJPROP_PRICE1+3*Point));

// e questo è tutto

}

}

Questo è solo un esempio, non ho il tempo di controllarlo per eventuali bug ma questo dovrebbe funzionare, e ora sapete il modo giusto.
 

cancellazione dell'oggetto basata sul contenuto

C'è un modo per cancellare gli oggetti basati su una stringa di testo selezionata all'interno del nome dell'oggetto?

Modifica: l'ho capito con il puntatore di Kalenzo. La risposta è nel post #212.

Motivazione: