Puoi dirmi dov'è l'errore - non riesco a trovarlo. Ho già riscritto il codice di modifica dell'ordine e l'errore rimane. Sottolineo che l'errore non viene dal log - non c'è un solo errore nel log. Ho trovato l'errore nei risultati durante l'esecuzione di un test. Esempio: Ho aperto una posizione di acquisto (ordine numero 1) con prezzo 1.4654 poi in Risultati dice modifica (ordine numero 1) prezzo 1.4654 e TakeProfit 1.4752 poi in Risultati dice chiudi (ordine numero 1) prezzo 1.4704 e TakeProfit 1.4752 Profitto = 50.00
Esempio posizione in perdita anche se dovrei chiudere solo al TakeProfit perché non ho impostato Stop Loss. Ho aperto una posizione di acquisto (ordine numero 271) a 1.4820 e nei risultati si dice modifica (ordine numero 271) prezzo 1.4820 e TakeProfit 1.4918 e nei risultati si dice chiudere (ordine numero 1) prezzo 1.4737 e TakeProfit 1.4918 Profitto = - 83.46
Ho messo un TakeProfit di 100 ovunque.
Non ho impostato StopLoss.
Non so come risolvere il problema.
Quando si compila questo codice EA = 0 errori e 0 avvertimenti.
Ho usato questo codice per modificare gli ordini:
//| Описание : Модификация ордера. Версия функции для тестов на истории. |//+----------------------------------------------------------------------------+//| Параметры: |//| pp - цена открытия позиции, установки ордера |//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//| ex - дата истечения |//+----------------------------------------------------------------------------+void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
double op=NormalizeDouble(OrderOpenPrice() , dg);
double os=NormalizeDouble(OrderStopLoss() , dg);
double ot=NormalizeDouble(OrderTakeProfit(), dg);
color cl;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
if (pp!=op || sl!=os || tp!=ot) {
if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
er=GetLastError();
Print("Error(",er,") modifying order: ",Error(error_code));
Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
}
}
}
alex12: Puoi dirmi dov'è l'errore - non riesco a trovarlo. Ho già riscritto il codice di modifica dell'ordine e l'errore rimane. Sottolineo che l'errore non proviene dal log - non c'è un solo errore nel log. Ho trovato l'errore nei risultati durante il test. Esempio: Ho aperto una posizione di acquisto (ordine numero 1) a 1,4654 Poi, nei risultati si dice comprare (ordine numero 1) prezzo 1.4654 e TakeProfit 1.4752. Poi, nei risultati si dice close (ordine numero 1) prezzo 1.4704 e TakeProfit 1.4752 Profitto = 50.00
Un esempio di posizione perdente anche se dovrei chiudere solo al Take Profit perché non ho impostato lo Stop Loss. Ho aperto una posizione di acquisto (ordine numero 271) a 1,4820 Poi, nei risultati si dice modifica (ordine numero 271) prezzo 1.4820 e TakeProfit 1.4918 poi dice close (ordine numero 1) prezzo 1.4737 e TakeProfit 1.4918 nei risultati Profitto = - 83.46
Ho impostato il TakeProfit a 100 ovunque.
Non ho impostato StopLoss.
Non so come risolvere il problema.
Quando si compila questo codice EA = 0 errori e 0 avvertimenti.
Ho usato questo codice per modificare gli ordini:
Quando la chiusura dei trade nel tester è scritta come mostrato qui, è molto probabilmente il risultato della funzione orderclose (TP e SL non hanno nulla a che fare con esso)
1Volatilità massima giornaliera (massimo giornaliero meno minimo) negli ultimi X=5 giorni .
2 Volatilità media giornaliera negliultimi X=130 giorni
3 E come si possono scrivere questi valori nella condizione se la Volatilitàmassima giornaliera si trova nell'intervallo A=75 a B=150- Volatilità media giornaliera
double Dmax= 0.0;
double DAvg= 0.0;
int a = 0;
int d =d+1;
while(a < 5)
{
Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d);
a++;
}
//Comment( "T ("+Dmax+")");while(a < 130)
{
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130;
a++;
}
Comment( "T ("+DAvg+")");
Ma come "catturare" l'ultimo max e min sulla barra precedente?
Basta memorizzare il massimo e il minimo raggiunti sulla barra corrente, e quando una nuova barra appare e diventa la barra precedente, si prenderà il massimo e il minimo dalle variabili memorizzate.
Hai solo bisogno di ricordare il massimo e il minimo raggiunti sulla barra corrente, e quando appare una nuova barra e diventa la barra precedente, prenderai il massimo e il minimo dalle variabili ricordate.
Ma come? Supponiamo di assegnare un valore massimo alla variabile Z e che appaia una nuova barra (che potrebbe essere controllata) e a Z viene immediatamente assegnato un nuovo valore, mentre il valore (Z-1) viene "perso". Probabilmente, ci dovrebbe essere qualche controllo quando si assegna un nuovo valore a Z (potrebbe essere apparsa una nuova barra), mi affido alla vostra professionalità e pazienza! Grazie per i vostri sforzi.
dichiarare la variabile zet come statica, o dichiararla nella zona globale.
Prima di assegnare un nuovo valore, controlla la presenza di una nuova barra, e verifica la differenza tra il suo valore e il valore corrente, e poi assegna un nuovo valore ad essa.
smshev: Quando la chiusura dei trade nel tester è scritta come hai elencato, è molto probabilmente il risultato della funzione orderclose (TP e SL non c'entrano)
Grazie, ma sembra che non ci siano errori nel codice:
int CloseOrder(int ticket, double lots)
{
int err,i1;
double price;
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
while(i1<10)
{
RefreshRates();
if (OrderType()==0)price=Bid;
if (OrderType()==1)price=Ask;
if (OrderType()>1){OrderDelete(ticket);return(0);}
OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
err = GetLastError();
if (err == 0) break;
Print(WindowExpertName(),Symbol(),Error(err)," при закрытии ордера");
Sleep(100);
i1++;
}
return(0);
}
Com'è semplice! M5 è aperto e la sua parte superiore un po' salata e M1 sotto di esso mostra i commenti che vuoi.
Come si dice, è sempre meglio al mattino! Buongiorno!
È qui che si fanno domande e si danno risposte sull'implementazione del software.
E puoi leggere i commenti su un foglio di carta ;)
Ho già riscritto il codice di modifica dell'ordine e l'errore rimane.
Sottolineo che l'errore non viene dal log - non c'è un solo errore nel log.
Ho trovato l'errore nei risultati durante l'esecuzione di un test.
Esempio:
Ho aperto una posizione di acquisto (ordine numero 1) con prezzo 1.4654
poi in Risultati dice modifica (ordine numero 1) prezzo 1.4654 e TakeProfit 1.4752
poi in Risultati dice chiudi (ordine numero 1) prezzo 1.4704 e TakeProfit 1.4752
Profitto = 50.00
Esempio posizione in perdita anche se dovrei chiudere solo al TakeProfit perché non ho impostato Stop Loss.
Ho aperto una posizione di acquisto (ordine numero 271) a 1.4820
e nei risultati si dice modifica (ordine numero 271) prezzo 1.4820 e TakeProfit 1.4918
e nei risultati si dice chiudere (ordine numero 1) prezzo 1.4737 e TakeProfit 1.4918
Profitto = - 83.46
Ho messo un TakeProfit di 100 ovunque.
Non ho impostato StopLoss.
Non so come risolvere il problema.
Quando si compila questo codice EA = 0 errori e 0 avvertimenti.
Ho usato questo codice per modificare gli ordini:
Puoi dirmi dov'è l'errore - non riesco a trovarlo.
Ho già riscritto il codice di modifica dell'ordine e l'errore rimane.
Sottolineo che l'errore non proviene dal log - non c'è un solo errore nel log.
Ho trovato l'errore nei risultati durante il test.
Esempio:
Ho aperto una posizione di acquisto (ordine numero 1) a 1,4654
Poi, nei risultati si dice comprare (ordine numero 1) prezzo 1.4654 e TakeProfit 1.4752.
Poi, nei risultati si dice close (ordine numero 1) prezzo 1.4704 e TakeProfit 1.4752
Profitto = 50.00
Un esempio di posizione perdente anche se dovrei chiudere solo al Take Profit perché non ho impostato lo Stop Loss.
Ho aperto una posizione di acquisto (ordine numero 271) a 1,4820
Poi, nei risultati si dice modifica (ordine numero 271) prezzo 1.4820 e TakeProfit 1.4918
poi dice close (ordine numero 1) prezzo 1.4737 e TakeProfit 1.4918 nei risultati
Profitto = - 83.46
Ho impostato il TakeProfit a 100 ovunque.
Non ho impostato StopLoss.
Non so come risolvere il problema.
Quando si compila questo codice EA = 0 errori e 0 avvertimenti.
Ho usato questo codice per modificare gli ordini:
Per favore, aiutatemi a trovare i valori di
1 Volatilità massima giornaliera (massimo giornaliero meno minimo) negli ultimi X=5 giorni .
2 Volatilità media giornaliera negliultimi X=130 giorni
3 E come si possono scrivere questi valori nella condizione se la Volatilità massima giornaliera si trova nell'intervallo A=75 a B=150- Volatilità media giornaliera
1. Per prima cosa scoprite di quante barre avete bisogno nella finestra https://docs.mql4.com/ru/windows/WindowBarsPerChart.
2. Poi otterrete la data della prima barra https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.
3. Conoscendo questa barra iniziale e il numero di barre - passare attraverso queste barre e determinare il massimo e il minimo tra di esse
4. profitto
Variante 2
https://docs.mql4.com/ru/windows/WindowPriceMaxтво
https://docs.mql4.com/ru/windows/WindowPriceMinВторой variante
Ero incline alla prima opzione, ma non sapevo come calcolare il numero di barre nella finestra. La seconda opzione è più laconica.
Ma come "catturare" l'ultimo max e min della barra precedente? Grazie in anticipo!
Ma come "catturare" l'ultimo max e min sulla barra precedente?
Basta memorizzare il massimo e il minimo raggiunti sulla barra corrente, e quando una nuova barra appare e diventa la barra precedente, si prenderà il massimo e il minimo dalle variabili memorizzate.
Hai solo bisogno di ricordare il massimo e il minimo raggiunti sulla barra corrente, e quando appare una nuova barra e diventa la barra precedente, prenderai il massimo e il minimo dalle variabili ricordate.
dichiarare la variabile zet come statica, o dichiararla nella zona globale.
Prima di assegnare un nuovo valore, controlla la presenza di una nuova barra, e verifica la differenza tra il suo valore e il valore corrente, e poi assegna un nuovo valore ad essa.
Quando la chiusura dei trade nel tester è scritta come hai elencato, è molto probabilmente il risultato della funzione orderclose (TP e SL non c'entrano)
Grazie, ma sembra che non ci siano errori nel codice: