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

 
artmedia70:
Dove leggete in questa funzione lo StopLoss dell'ultimo chiuso? Non c'è niente lì.

È proprio qui. Direttamente a punta.
OrderSelect(1,SELECT_BY_POS,MODE_HISTORY);
      take=OrderTakeProfit();
       ts=take;
 
borilunad:
Andate a dormire, tutti quanti! È sempre meglio al mattino! È l'una di notte! Buona notte! E Artyom ha già dormito!

Sono cinque giorni che faccio quello che stai facendo tu, e ho già iniziato a pensare di notte. Buona notte.
 
Nel registro appare l'errore 130. Queste sono le fermate sbagliate, vero? MA il nuovo stop loss è 1,3282. Lo stop loss al momento attuale è 1,3275 (questo è anche il prezzo di apertura dell'ordine) e la quotazione attuale è 1,3297. Dov'è l'errore?
 

Salve. Perché nella variabile predefinita "Point", gli zeri non sono definiti nel log di strategy tester, alla fine, numeri tondi?

Пример:

static double lBUY;

lBUY=100*Point; //Так-же можно написать 10,20,180 или 520.

if(lBUY==0.01)

{

Alert("НУЛИ НЕ ПИШУТСЯ В КОНЦЕ Point ",lBUY);

}

 
artmedia70:
Sono un siberiano, sì. Vicino a Krasnoyarsk.


Sibiryak, così, quasi, zamlYak)).
 
webip:

Ma ho fatto quello che stai facendo tu per cinque giorni e ho già iniziato a pensare di notte.

È più facile dire chi non pensa di notte, se è il contrario. Ho la stessa situazione. Inoltre, nessuno mi disturba affatto di notte. A proposito, una volta ho letto che il cervello pensa meglio di notte. È come se gli scienziati avessero scoperto...
 
semiromid:

Salve. Perché nella variabile predefinita "Point", gli zeri non sono definiti nel log di strategy tester, alla fine, numeri tondi?

Пример:

static double lBUY;

lBUY=100*Point; //Так-же можно написать 10,20,180 или 520.

if(lBUY==0.01)

{

Alert("НУЛИ НЕ ПИШУТСЯ В КОНЦЕ Point ",lBUY);

}



E cosa produce effettivamente Alert?
 
artmedia70:
DoubleToStr(number,digit) è per voi


Grazie mille! Mi serviva per confrontare le caratteristiche delle candele (più, meno, ecc.) L'ho avvitato e funziona. Solo non riesco a capire come si confronta il tipo di dati stringa? O double to string non traduce il numero in stringa? :-D


PS. Non funziona in indicatore - solo in script... Quando chiamo High[i] - ottengo solo 4 cifre decimali.

Sto scrivendo:

Alert ("doubletostr High = ", DoubleToStr(High[1],5));
se (DoubleToStr(High[2],5)>(DoubleToStr(High[3],5))
{
Alert ("More");
}
se (DoubleToStr(High[2],5)<(DoubleToStr(High[3],5))
{
Avviso ("Più piccolo");

}

Funziona, scrive il risultato con cinque cifre, conta over/under. Il problema è che nell'indicatore l'array di stringhe non appare sul grafico. Pertanto...

...scrivere:

Alert ("Normalized Double High = ", NormalizeDouble(High[1],5));

Non funziona - il risultato è > 1,1234

Non capisco gli sviluppatori - perché hanno dovuto complicare così tanto le cose? Perché, se mostra così tante cifre sul grafico, non gratta la funzione chiamata con cinque cifre? Forse c'è una soluzione semplice?

 

Sto lottando con una funzione che dovrebbe restituire True se l'ultima posizione di mercato è stata chiusa in profitto, e False se non è stata chiusa in perdita. Se questa funzione restituisce True, allora tutte le posizioni (sia quelle pendenti che quelle a mercato) sono chiuse.

Ecco cosa è venuto fuori:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   
   for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() > 1) continue;               // Все удалённые отложки нас не интересуют..
  
      if (lastOrderCloseTime < OrderCloseTime())   // Находим время закрытия..
      {
         lastOrderCloseTime = OrderCloseTime();   // ..последней закрытой позиции в истории
         int j = i;
      }
   }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
     // Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }
  
   for(int h=OrdersTotal()-1; h>=0; h--)
   {
      if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderMagicNumber() != i_magic)   continue;
         if (OrderSymbol() != Symbol())       continue;
         if (OrderType() > 1)                 continue;
         if (lastOOTHist < OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
      }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
   }
   
   return (true);
}

Artyom sopra ha suggerito dove ho avuto un bug. L'ho riscritto per me. Non è ancora la variante finale, ma... è già abbastanza chiaro. Dopo aver eseguito l'Expert Advisor, ho notato subito che le posizioni rimanenti non sono state chiuse e non lo sono affatto. Ho iniziato a scavare per capire quale fosse la ragione. Ho raccomandato un paio di funzioni e mi sono reso conto che si trova in questo blocco:

 if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
      Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }

Il commento è innescato tutto il tempo esattamente:

Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");

L'ho commentato e sono andato avanti. Ho notato che questo commento:

Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);

Non si innesca mai, anche quando c'è una posizione chiusa per ultima. Cosa può esserci di sbagliato?

I miei pensieri, anche se potrei sbagliarmi... Forse devi mettere questo blocco

 if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
   {
      if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
      if (MathAbs(OrderProfit() - OrderClosePrice()) > delta * pt) return (false);
      else
      {
         lastOOTHist = OrderOpenTime();
         Comment("FUNC isCloseByTakeLastOpenPos : lastOOTHist = ", lastOOTHist);
      }
   }
   else
   {
     // Comment("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");
      return(false);
   }

metterlo anche nel ciclo for? Altrimenti, chissà in quale direzione andrà l'overflow. La variabile j conterrà il numero di indice della posizione e non è esplicitamente specificato in quale direzione andrà la ricerca.

 
hoz:

Sto lottando con una funzione che dovrebbe restituire True se l'ultima posizione di mercato è stata chiusa in profitto, e False se non è stata chiusa in perdita. Se questa funzione restituisce True, allora tutte le posizioni (sia quelle pendenti che quelle a mercato) sono chiuse.

Ecco cosa è venuto fuori:

Artyom sopra ha suggerito dove ho avuto un bug. L'ho riscritto per me. Non è ancora la variante finale, ma... è già abbastanza chiaro. Dopo aver eseguito l'Expert Advisor, ho notato subito che le posizioni rimanenti non erano chiuse e non lo erano affatto. Ho iniziato a scavare per capire quale fosse la ragione. Ho raccomandato un paio di funzioni e mi sono reso conto che è in questo blocco:

Il commento è innescato tutto il tempo esattamente:

L'ho commentato e sono andato avanti. Ho notato che questo commento:

Non si innesca mai, anche quando c'è una posizione chiusa per ultima. Cosa può esserci di sbagliato?

I miei pensieri, anche se potrei sbagliarmi... Forse devi mettere questo blocco

metterlo anche nel ciclo for? Altrimenti, chissà in quale direzione andrà l'overflow. La variabile j conterrà il numero di indice della posizione e non è esplicitamente specificato in quale direzione andrà la ricerca.

La variabile j deve essere inizializzata esplicitamente all'inizio della funzione con un valore negativo. Provate. Non ho ancora guardato oltre.
Motivazione: