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

 
Roger:

Quello che hai chiamato Trailing in realtà non lo è, è calcolato in un modo diverso e il suo comportamento può essere illogico.


Anche se i nostri concetti dei termini non coincidono, ma lei mi capisce, vero?

Risolto il problema, era qui:

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

Questa funzione non teneva conto di tutti i trade aperti, quindi ho dovuto cambiare le condizioni del ciclo. Ora appare così:

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

Questa funzione calcola la somma dei profitti di tutte le operazioni aperte al livello di prezzo specificato. Tuttavia, c'è un'opinione citata che non tiene conto dello spread, e sono d'accordo. L'autore di questo parere ha suggerito questa soluzione:

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Ma confesso di essere onesto, non lo capisco come scrive:

Lo spread non è contabilizzato. Questo può essere corretto contando il risultato dal prezzo corrente.
Non capisco l'algoritmo che ha suggerito, come viene preso in considerazione lo spread? Qualcuno può spiegare per favore?
 
Mepkypuu:

Ma, ad essere onesti, non lo capisco come scrive:

Non mi sembra di capire il suo algoritmo; come viene considerato lo spread? Qualcuno può spiegare?

OrderProfit() conta per le posizioni corte all'attuale Ask, questo è dove il valore dello spread corrente è preso in considerazione. Se lo spread non cambia, quando il prezzo cambia dall'attuale Bid a newSL il profitto della posizione (qualsiasi, Buy o Sell, con un segno appropriato) in un lotto cambierà del valore del delta, che è scritto nell'operatore:

delta = ( newSL - Bid ) * TickValue;

In breve, OrderProfit() conta tutto, compresi gli spreads. Fissiamo il risultato per un certo momento ( il prezzo attuale) usando OrderProfit(). Da qui in poi, tutto quello che dobbiamo fare è monitorare le variazioni di prezzo.

 
Mislaid:

OrderProfit() viene contato per le posizioni corte all'attuale Ask, è qui che vengono presi in considerazione i valori attuali dello spread. Se lo spread non cambia, quando il prezzo cambia dall'attuale Bid alla newSL il profitto di un lotto della posizione (sia Buy che Sell, con il segno corrispondente) cambierà del valore del delta, che è scritto nella dichiarazione:

delta = ( newSL - Bid ) * TickValue;

In breve, OrderProfit() conta tutto, compresi gli spreads. Fissiamo il risultato per un certo momento (il prezzo attuale) usando OrderProfit(). Da qui in poi, tutto quello che dobbiamo fare è monitorare il cambiamento del prezzo.

Credo di cominciare a capire, ma forse è più corretto:

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

OrderProfit per le posizioni corte è calcolato dal prezzo Ask, vero?

A proposito, MarketInfo( SymbolName, MODE_TICKVALUE) restituisce 329,02 per la coppia di valute EURUSD, ecco perché questa funzione non funziona correttamente per me.

 

Finora ho deciso di usare un trucco, cioè MarketInfo(SymbolName, MODE_TICKVALUE) per contare diversamente:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

Finora ho deciso di usare un trucco, cioè MarketInfo(SymbolName, MODE_TICKVALUE) per contare diversamente:

Il modo in cui è stato scritto è corretto. Di quanto è spostata la Bid, di quanto è spostata la Ask, con lo spread invariato.
 
Mislaid:
Il modo in cui è stato scritto è corretto. Tanto quanto si muove il Bid, tanto quanto si muove l'Ask, se lo spread è invariato.

Per esperienza personale, la diffusione è di solito invariata e abbastanza forte). Durante i movimenti bruschi ho visto lo spread aumentare da 8 a 80 pips su un cinque cifre.
 
È possibile codificare (in modo affidabile) una doppia cima?
 
001:
Un doppio top può essere codificato (in modo affidabile)?
È possibile.
 

Quando si testa un Expert Advisor nel diario appare un errore

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Errore 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Tentativo di aprire un ordine di acquisto. In attesa di una risposta.

Di conseguenza, gli ordini non sono aperti. Come eliminare l'errore? Quali sono le ragioni?

Sarei felice di aiutare.

 
alexey1979621:

Quando si testa un EA, nel log appare un errore

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Errore 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Tentativo di aprire un ordine di acquisto. In attesa di una risposta.

Di conseguenza, gli ordini non sono aperti. Come eliminare l'errore? Quali sono le ragioni?

Sarei felice di aiutare.

Non molto sarà chiaro dai soli messaggi del terminale, non molto ti aiuterà se non posti il codice EA. Da qualche parte nel tuo array stai scrivendo un lotto di dati inesistente, come uno dei presupposti, ma indovinare non è il mio profilo.
Motivazione: