[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 129

 
borilunad:


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 ;)

 
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);
    }
  }
}
 
Ho dimenticato di dire che questo EA funziona tramite un foglio di calcolo Excel - il file Orders.csv salvato nel file
 
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)
 

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

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+")");
 
sergeev:

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!

 
MK07:


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.

 
sergeev:

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);
              }