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

 
Trendy:

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))
{
Alert ("Smaller");

}

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?


Diventa ancora più interessante:

tradurre

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Scrive: 1,32169 - OK.

Convertire di nuovo in un valore numerico usando StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Risultato: 1,3217

Ci dovrebbe essere un meme con Jackie Chan dove lui non capisce il chip).

 
hoz:

E cosa produce effettivamente Alert?

Dice 0,01 ma in realtà è 0...0100.
 
Trendy:

Diventa ancora più interessante:

tradurre

Alert ("iFractals doubletostr= ", DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Scrive: 1,32169 - OK.

Convertire di nuovo in un valore numerico usando StrToDouble:

Alert ("iFractals StrToDoubledoubletostr= ", StrToDouble(DoubleToStr(iFractals(0,0,MODE_UPPER,2),Digits));

Risultato: 1,3217

Ci dovrebbe essere un meme con Jackie Chan dove lui fraintende il chip).


DoubleToStr() è usato per emettere messaggi con la precisione desiderata. Standard Print(), Alert(), ecc., stampano in 4 cifre.

Quando volete vedere un numero con la precisione che volete, usate DoubleToStr() allora, non nei calcoli.

Non c'è bisogno di tradurre nulla avanti e indietro ... ;)

 
semiromid:

Dice 0,01 ma il valore reale è 0...0100.


Uscita quindi 100 * punto = 100 * 0.00001 = 0.001pp (se per cinque cifre)

Il valore di lBUY è stato cambiato sopra. Quindi, per come la vedo io, la condizione:

if(lBUY==0.01)

Non sarà soddisfatta. E quindi il valore di lBUY rimarrà lo stesso.

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


Finora la stessa cosa. Qui abbiamo:

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos(int delta)
{
   datetime lastOrderCloseTime = 0,               // Время закрытия последнего открытого ордера
            lastOOTHist = -1;                     // Время открытия последнего открытого ордера из истории
   int j = -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();   // ..последней закрытой позиции в истории
         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);
}
 
artmedia70:

DoubleToStr() è usato per emettere messaggi con la precisione desiderata. I metodi standard Print(), Alert(), ecc. stampano 4 cifre.

Quando volete vedere un numero con la precisione che volete, è quando usate DoubleToStr(), non nei calcoli.

Non c'è bisogno di tradurre nulla avanti e indietro ... ;)


È comprensibile... ora...) Ma il punto è che ho bisogno di scavare in qualche modo una quinta cifra per i calcoli (

Se DoubleToStr() non va bene, allora questo linguaggio non ha tale caratteristica? Gli sviluppatori non l'avevano previsto?

 
hoz:


Finora tutto bene. Eccoci qui:

Non dovrebbe essere lo stesso? ;)
 
Trendy:

È comprensibile... ora...) Ma il punto è che ho bisogno di scavare in qualche modo una quinta cifra per i calcoli (

Se DoubleToStr() non va bene, allora questo linguaggio non ha tale caratteristica? Gli sviluppatori non l'avevano previsto?


I calcoli utilizzano ancora più cifre di quanto si pensi. Se volete vedere con la precisione che volete, usate DoubleToStr(). Non lo vedrete in nessun altro modo.
 

Signori programmatori! Per favore consigliate come combinare un EA con un indicatore?

Per esempio, ho preso un semplice bot mo_bidir.mq4 che fa trading usando il suo algoritmo e voglio che continui ad aprire trade usando il suo algoritmo ma dopo il segnale di 3 МА.

Per esempio su un segnale - Tre medie mobili:

FastEMA>MediumEMA>SlowEMA (tendenza up) - bot compra

FastEMA<MediumEMA<SlowEMA (tendenza giù) - bot vende

Inp_Signal_ThreeEMA_FastPeriod = 8;

Inp_Signal_ThreeEMA_MediumPeriod = 38;

Inp_Signal_ThreeEMA_SlowPeriod = 48;

Ciò di cui ho bisogno è che l'Expert Advisor continui a fare trading su 5 minuti e che l'indicatore dia segnali dal timeframe giornaliero o 4 ore, e voglio essere in grado di cambiare i timeframe nelle impostazioni del bot.

 
Buona giornata a tutti i commercianti. Forse questa domanda è già stata discussa, ma alcuni EA dal codebase non si compilano nelle nuove build, il compilatore giura che è una versione decompilata. Ma sembra un'assurdità, le versioni non sono mai state decompilate