Come codificare? - pagina 6

 

Codice di errore: 4109

Ciao a tutti:

Ho scritto uno script per chiudere tutti i trade compresi gli ordini pendenti, ma sono rimasto deluso dopo averlo testato. Le funzioni: OrderClose, e Orderdelete falliscono nel chiudere i trade. Chiamando la funzione GetLastError ottengo il codice di errore: 4109 che è definito nel file di intestazione degli errori come TRADE_NOT_ALLOWED.

Ho anche provato ad eseguire gli script forniti con la piattaforma ma senza successo.

Spero che qualcuno possa risolvere il problema.

Grazie,

File:
closeall2.mq4  2 kb
 

Ok, prova questo. Penso che le variabili Lots e Price dovrebbero essere doppie e non intere. Spero che questo aiuti

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

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

prova questo

FX5:
Ciao a tutti:

Ho scritto uno script per chiudere tutte le compravendite compresi gli ordini pendenti, ma sono rimasto deluso dopo averlo testato. Le funzioni: OrderClose e Orderdelete non riescono a chiudere le compravendite. Chiamando la funzione GetLastError ottengo il codice di errore: 4109 che è definito nel file di intestazione degli errori come TRADE_NOT_ALLOWED.

Ho anche provato ad eseguire gli script forniti con la piattaforma ma senza successo.

Spero che qualcuno possa risolvere il problema.

Grazie,

In Metatrader, andate in Strumenti -> Opzioni, cliccate sulla scheda Consulente esperto e selezionate Permetti trading live, cliccate su Permetti importazioni dll e deselezionate le chiamate di conferma. Ho scritto alcuni script e stavo avendo lo stesso problema.

 
firedave:
Ok, prova questo. Penso che le variabili Lots e Price dovrebbero essere doppie e non intere. Spero che questo aiuti
//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

Questo potrebbe essere sbagliato: per cancellare più ordini, dovete cominciare dall'ultimo, poiché i loro indici diminuiscono in seguito al processo di cancellazione.

Quindi, al posto di " for(int i=0;i=0;i--) "

 

Grazie firedave per la modifica del codice. Era un piccolo bug a cui non avevo prestato attenzione.

Crepuscular, grazie mille per il suggerimento. Avrei potuto passare un secolo prima di trovare la soluzione. Finalmente ho un codice funzionante.

 

Michel, è stata una nota molto intelligente, grazie mille.

 

ottenere la funzione max drawdown

Vorrei scrivere una funzione che ottenga il max drawdown da trade che sono stati chiusi. ho trovato due soluzioni.

1. calcolare il drawdown mentre il trade è ancora attivo. salvare il numero in una variabile globale e scrivere i dati su file in base al numero di ticket. MT4 dovrebbe essere sempre online.

2. ottenere il drawdown ottenendo il massimo più alto o il minimo più basso dal grafico a 1 minuto. il problema qui è che dobbiamo avere lo storico a 1 minuto per il trade. (userei questo metodo se potessi ottenere le barre da 1 min necessarie se non fossero già scaricate)

Vorrei trovare un modo più carino per ottenere il massimo drawdown.

Qualsiasi input è apprezzato.

 
harriss:
Vorrei scrivere una funzione che ottenga il massimo drawdown dai trade che sono stati chiusi. ho trovato due soluzioni.

1. calcolare il drawdown mentre il trade è ancora attivo. salvare il numero in una variabile globale e scrivere i dati su file in base al numero di ticket. MT4 dovrebbe essere sempre online.

2. ottenere il drawdown ottenendo il massimo più alto o il minimo più basso dal grafico a 1 minuto. il problema qui è che dobbiamo avere lo storico a 1 minuto per il trade. (userei questo metodo se potessi ottenere le barre da 1 min necessarie se non fossero già scaricate)

Vorrei trovare un modo più carino per ottenere il massimo drawdown.

Qualsiasi input è apprezzato.

Salam harriss,

Cosa intendevi per "drawdown"?

Intendi la massima perdita di uno dei trade chiusi?

 

drawdown

Quello che intendo per drawdown è il punto più basso del trade. Per esempio, se il trade ha colpito lo stoploss, allora lo stoploss sarebbe il drawdown. Ora, se l'operazione è finita sul lato positivo ed era -15 pips ad un certo punto, allora il drawdown sarebbe 15. Infine, se il trade chiude a -15 pip ma era a -30 ad un certo punto, allora il drawdown sarebbe di 30.

 

Come codificare avvisi/allarmi per gli indicatori?

Ciao, mi piacerebbe imparare di più su come codificare gli avvisi.

Non sono un programmatore, ma ho la testa sulle spalle e sono generalmente in grado di armeggiare con qualcosa, smontarlo e rimetterlo insieme più vicino al modo in cui lo voglio.

Ho esaminato alcuni degli indicatori con avvisi e ho copiato le funzioni generali di allarme che ho visto in altri indicatori che ho voluto avere avvisi. Ho avuto risultati misti.

Ho notato che le principali funzioni chiamate per gli avvisi sono la funzione Alert(), la funzione Comment() e la funzione Playsound(). Finora sono più familiare con la funzione Alert(). C'è una differenza significativa tra Alert() e Playsound() per esempio?

Il problema generale che ho è che non so come codificare gli avvisi abbastanza in modo che siano entrambi evidenti da un lato ma che non distraggano in modo ridicolo dall'altro. Per esempio, se uso la funzione Alert() per alcuni incroci e l'indicatore non ha stampato in modo definitivo sulla barra corrente, l'allarme potrebbe ripetersi ancora e ancora e ancora e ho problemi a spegnere l'allarme. Di solito devo cambiare il time frame del grafico.

Prima di tutto c'è un modo semplice per disabilitare/disattivare l'allarme solo per la barra corrente?

In secondo luogo, c'è un modo per codificare un allarme in modo che non sia un fastidioso fastidio senza fine, introducendo del codice che limiti il numero di iterazioni o dia all'allarme una durata fissa? Come lo codifichereste?

Una soluzione che vedo è quella di ritardare l'allarme fino alla prossima barra in modo che non cambi continuamente, ma questo ha lo svantaggio di non essere tempestivo.

Per evitare la seccatura degli allarmi folli sugli indicatori, ho usato gli allarmi di prezzo predeterminati che si possono impostare usando la finestra del terminale e aiuta, ma non è l'ideale.

Sono anche consapevole che gli Expert Advisors possono essere creati per dare allarmi e che c'è un pulsante che può attivare e disattivare facilmente i loro allarmi. Il problema che ho con gli EAs, tuttavia, è che ho notato che un altro importante programma che eseguo in concomitanza con MetaTrader sembra avere delle interferenze quando gli Expert Advisors sono attivati e funziona in modo lento.

Ci sono altre soluzioni a questo problema?

Se c'è qualche indicatore là fuori che ha un codice di allarme che evita le insidie che ho elencato e può servire come un buon esempio di come codificare e avvisare potrebbe per favore riferirmi ad esso e/o postarlo?

Grazie mille.