[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 645

 
artmedia70:

Non c'è quasi nessuna logica - il semplice output di linee in ordine uno dopo l'altro...




Userei delle funzioni per renderlo facile da capire

//--------------------------------------------------------------- 1 --
// Функция вывода на экран графических сообщений.
//--------------------------------------------------------------- 2 --
  int Informations()
  {
   int   Win_ind;                     // Номер окна индикатора
   int   x,y;
   
   trH4     =Trend_PSAR(NULL,240);  // Четырёхчасовой тренд
   trH1     =Trend_PSAR(NULL,60);   // Часовой тренд
   trM30    =Trend_PSAR(NULL,30);   // Получасовой тренд
   trM15    =Trend_PSAR(NULL,15);   // 15-ти минутный тренд

//--------------------------------------------------------------- 3 --
   Win_ind= WindowFind("Info");        // Ищем номер окна индикатора
   if (Win_ind<0)return;               // Если такого окна нет, уходим
//--------------------------------------------------------------- 4 --
   x =10; y =17;
   MyObject("Equ",         x,    y,   "Свободные средства",                   9, "Tahoma", Gold);
   MyObject("EquVal",      x*23, y,   DoubleToStr(Equ_NEW,2),                 9, "Tahoma", Yellow);

//.................................
   WindowRedraw();                      // Перерисовываем все объекты
   return;
  }


void MyObject(string Name, int X, int Y, string Text, int Size, string Srift, color CL){
   if (ObjectFind(Name)==-1)
      ObjectCreate(Name,OBJ_LABEL,1,0,0,0,0);
   ObjectSet(Name,OBJPROP_XDISTANCE,X);
   ObjectSet(Name,OBJPROP_YDISTANCE,Y);
   ObjectSetText(Name, Text, Size, Srift, CL);
}
 
ToLik_SRGV:

Mi sono anche interrogato su questo, ma non ho trovato nulla di utile. Per quanto riguarda l'ottimizzazione, conosci già il grande freno di iCustom :), negli indicatori c'è una restrizione sul numero di barre, che può essere calcolato (attraverso IndicatorCounted() o strettamente dal numero di barre). Nel codice, non ha senso preoccuparsi del numero e della complessità dei diversi costrutti come if, while, ecc. Non guadagnerete molto, ma con il tempo e l'esperienza, il codice diventerà più "bello". Beh, in modalità di visualizzazione, quando ogni "rimbalzo" è modellato, sarà lento quasi in ogni caso (a seconda della complessità del sistema, naturalmente). Da qualche parte ho letto che se i calcoli complessi in una dll, sarà più veloce, ma non ho controllato. Con dll, anche abbastanza sfumature.

Ricordo che comandi come TimeCurrent() rallentavano molto (quando ce ne sono diversi nel codice).

- È molto meglio usarlo una volta sola - metterlo in una variabile, e poi accedere alla variabile.

 
Vinin:


Userei le funzioni per una facile percezione

Sì, certo, Victor, è molto più leggibile. Ma sto già cercando, dove possibile, di scrivere "di testa" - è molto lento, e dove possibile, sto cercando di risparmiare un millisecondo...
 
chief2000:

Ricordo che comandi come TimeCurrent() erano molto lenti (quando ce ne sono diversi nel codice)

- È molto meglio usarlo una volta sola - metterlo in una variabile, e poi accedere alla variabile.

Grande! Vale la pena dare un'occhiata al codice e rifarlo...
 
chief2000:

Ricordo che comandi come TimeCurrent() erano molto lenti (quando ce ne sono diversi nel codice)

- È molto meglio usarlo una volta, cioè memorizzarlo in una variabile e accedere alla variabile in seguito.

Come posso impostare correttamente una tale variabile in modo che possa essere chiamata in seguito?

Lo dichiaro prima nelle variabili globali

datetime CurTime;

E poi in start()

Gli assegno un valore:

CurTime=TimeCurrent();

e ottengo un errore: 'CurTime' - variabile attesa.

Come farlo correttamente?

E un'altra domanda: se assegno valori ad alcune variabili non in start() ma in init(), funzioneranno correttamente?

Bene, voglio dire che alcune funzioni, per esempio TimeCurrent(), saranno ancora chiamate ad ogni tick, se una variabile è assegnata a questa funzione all'inizio di start()

 
Che sfiga! CurTime dà un errore, CurrTime no... Qual è il problema?
 
artmedia70:
Che sfiga! CurTime dà un errore e CurrTime non... Qual è il punto?
Il punto è che CurTime è il nome obsoleto della funzione TimeCurrent, quindi il compilatore si lamenta sempre quando il nome di una variabile coincide con il nome di una funzione...
 
keekkenen:
Il punto è che CurTime è il nome obsoleto della funzione TimeCurrent, quindi quando il nome di una variabile corrisponde al nome di una funzione, il compilatore si lamenta sempre...
Bene! Grazie, lo saprò in futuro.
 

Amici, il mio blocco logico personale è un po' in crisi. Non posso decidere come essere in questa situazione:

Lavoriamo in due direzioni, cioè Buy e Sell hanno le loro unità di controllo separate. Le posizioni possono essere aperte in modo contro-direzionale, tutto dipende da come si muove il mercato in ogni TF.

Supponiamo la situazione in cui Sell e Buy sono aperti (su M5 e M15) e improvvisamente il mercato gira nella direzione opposta, opposta al Sell aperto su M5 e M15 (beh, qualunque sia la situazione nel mondo...). In questo caso, tutte le Vendite aperte cominciano ad aumentare notevolmente il drawdown, e dato che abbiamo anche dei Buy aperti, è possibile chiudere alcune posizioni sia in Buy che in Sell, per chiudere le vendite in perdita con perdite minime a spese dei Buy chiusi.

Quindi, non posso decidere sulla logica di questa situazione. Cosa dovrebbe essere?

Per sicurezza, ecco un esempio:


 

Brava gente, tornando all'argomento di ieri:

   double c1b[];
   for(i=1;i<=PeriodB;i++)
   {
   c1b[i]=iCCI(NULL,0,PeriodB,PRICE_TYPICAL,i);
   }
   double c1b_1=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,1);
   double c1b_2=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,2);
   double c1b_3=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,3);
   
   double c1s[];
   for(i=1;i<=PeriodS;i++)
   {
   c1s[i]=iCCI(NULL,0,PeriodS,PRICE_TYPICAL,i);
   }
   double c1s_1=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,1);
   double c1s_2=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,2);
   double c1s_3=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,3);

if (NormalizeDouble(c1s_1,4)>NormalizeDouble(c1s_2,4)&&NormalizeDouble(c1s_2,4)<NormalizeDouble(c1s_3,4))
//if (c1s_1>c1s_2&&c1s_2<c1s_3)
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(c1b_1,4)<NormalizeDouble(c1b_2,4)&&NormalizeDouble(c1b_2,4)>NormalizeDouble(c1b_3,4))
//if (c1b_1<c1b_2&&c1b_2>c1b_3)
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }

per favore ditemi cosa significa il messaggio del diario di bordo:

2010.06.24 17:28:26 TestGenerator: errore dati non abbinati (limite di volume 5357 al 2010.01.06 08:00 superato)