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

 

Potete dirmi come prescrivere quando la differenza di due EMA (cinque giorni/minimo e massimo) aumenta, di vendere lungo all'EMA massimo e riacquistare corto all'EMA minimo?

Uso"Rastvor" nell'intestazione della variabile globale come la differenza di due EMA .

Come posso scrivere questo codice nei criteri di trading?

 
Fox_RM:

CioèVol_Arr[] dovrebbe essere inizializzato come un array globale, come ho capito.


La domanda è ovviamente una domanda nulla, MA.

1. Perché i volumi sono visualizzati correttamente nell'indicatore?

2. Quando calcolo, accedo aAOBuffer3[] e non aVol_Arr[].

Grazie!


Quando si dichiara un array (non un buffer) si dovrebbe specificare esplicitamente la sua dimensione.... almeno.
 
Fox_RM:

CioèVol_Arr[] dovrebbe essere inizializzato come un array globale, come ho capito.


La domanda è ovviamente una domanda nulla, MA.

1. Perché i volumi sono visualizzati correttamente nell'indicatore?

2. Quando calcolo, accedo aAOBuffer3[] e non aVol_Arr[].

Grazie!

1.
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
Entrambi gli array che usate sono collegati a buffer di indicatori, cioè sono allocati in memoria (anche se implicitamente)
SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);

Non si alloca memoria per questo array(Vol_Arr[]) né staticamente né dinamicamente.

2. Per quanto vedo dal codice, la differenza dei volumi MA e non è calcolata nell'arrayAOBuffer3[]

   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}

I volumi sono contati inExtMapBuffer1.

Vol_Arr[] può essere inizializzato come globale o con un modificatore statico - potete scegliere il vostro, ma la memoria dovrebbe essere allocata in ogni caso o potete collegarlo al buffer dell'indicatore, così come i due array precedenti - certo, ci sono molte varianti.

 
VladislavVG:
1) Entrambi gli array che usi sono collegati con buffer di indicatori, cioè la memoria è allocata per loro (anche se implicitamente).

......

Vladislav, ho rivisto il codice. Una parte del codice conVol_Arr[]era rimasta dalla vecchia versione dell'indicatore, l'ho cancellata.

Penso che l'errore sia ancora in questa parte del codice, ma non capisco dove! Ho commentato questa parte del codice in modo più dettagliato.

 
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  --- Ищу самый высокий бар и определяю время этого бара // -- пока значение  tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}    --- Ищу самый низкий бар и определяю время этого бара // -- пока значение  tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение  colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение  VLUP = 47

Fig2

 
Fox_RM:

Vladislav, ho rivisto il codice. Una parte del codice conVol_Arr[]era rimasta dalla vecchia versione dell'indicatore, l'ho cancellata.

Penso che l'errore sia ancora in questa parte del codice, ma non capisco dove! Ho commentato questa parte del codice in modo più dettagliato.

OK, posta di nuovo il codice completo, che ora funziona - vediamo.
 

Ecco qui:

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Red
#property  indicator_color2  SteelBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

extern bool Show_AOLine_2=true;
extern int SlowEMA3=34;
extern int EMA=2;
extern bool Show_Volume=true;
extern double coaf=1.5;
extern bool Show_Vol_line=true;
//---- indicator buffers
double AOBuffer3[];
double ExtMapBuffer1[];

double VLUP;
   double prhgh_e=0, prhgh_s, prlw_e=0, prlw_s;
    datetime tmhgh, tmlw;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   
  string name_ind = "Awesome_super_volumes";
   IndicatorShortName("Awesome_super_volumes");
   
   
//---- AO_fan line 2 (basic)
   if(Show_AOLine_2 ==true){Show_AOLine_2=DRAW_LINE; }
   else 
    {Show_AOLine_2=DRAW_NONE; }
   SetIndexBuffer(0,AOBuffer3);
   SetIndexStyle(0,Show_AOLine_2);
   SetIndexLabel(0,"basic line");   

   SetIndexBuffer(1,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexLabel(1,"Volume");
   
    //---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;

//---- AO_fan line 2 (basic) buffer
   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
  }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);  //-- Здесь считаю общее количество баров от наименьшего до наибольшего значения // -- пока значение colbr = 0
  
  int shift=iBarShift(NULL,0,tmlw); // -- Это точка отсчета
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));} //-- Значению VLUP суммируем все объемы начиная от самого низкого бара до самого высокого бара // -- Значение VLUP = 47
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
  SetText2("Волна1",DoubleToStr(VLUP,0),980,10,Gray,10); 
  SetText2("Волна2",TimeToStr(tmlw,0),980,25,Gray,10); 
  SetText2("Волна3",TimeToStr(tmhgh,0),980,40,Gray,10);
  SetText2("Волна4",DoubleToStr(colbr,0),980,55,Gray,10);  
  
  
      
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
  
  void SetText2(string name, string text, int xdist, int ydist, color c, int size) 
 {                                                                                    
  ObjectCreate(name,OBJ_LABEL,0,0,0,0,0);     
  ObjectSet(name, OBJPROP_XDISTANCE, xdist);
  ObjectSet(name, OBJPROP_YDISTANCE, ydist);    
  ObjectSetText(name,text,7,"Arial Black",c);
 }

Grazie ancora!

 
Fox_RM:

Ecco qui:



A colpo d'occhio:

   for(int i=0; i<limit; i++)
   {
     
 //---- AO_fan basic line + Volumes
     
      AOBuffer3[i]=iMA(NULL,0,EMA,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,SlowEMA3,0,MODE_SMA,PRICE_MEDIAN,i);
if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
}
  } // здесь цикл закончился
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0) //Если Awesome больше нуля
  {
  prhgh_s = High[i];                                            // -----
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}  //--- Ищу самый высокий бар и определяю время этого бара // -- пока значение tmhgh = 0
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0) //Если Awesome меньше нуля
  {
  prlw_s = Low[i];                                          // -----
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}   // --- Ищу самый низкий бар и определяю время этого бара // -- пока значение tmlw = 0
  } 

Il frammento evidenziato è al di fuori del ciclo e usa il contatore del ciclo i - qualcosa è sbagliato o nella logica o nell'implementazione

 
hoz:

Perché avete bisogno delle cifre come file CSV?

Necessario per il test e il debug degli algoritmi di riconoscimento.

hoz:

Scriveteli voi stessi per capirli piuttosto che prendere quelli di qualcun altro.

Scrivere cosa esattamente? Vuoi dire, segnare tu stesso le forme sul grafico ed esportare i pezzi di storia appropriati? Questa soluzione è la prima in coda finora, ma spero ancora che qualcuno l'abbia già fatta. Dopo tutto, è solo un lavoro di routine.

hoz:

L'abbondanza non significa migliore!

Permettetemi di dissentire. Più grande è la suite di test, più statisticamente affidabile sarà il risultato del programma.


p.s. La domanda è ancora valida.(Vedi domanda in questo post)

 

Ciao a tutti!!!

Potreste dirmi quale codice è necessario per fare una chiusura lunga al massimo della MA corrente.

Di seguito sono riportati i criteri di trading attuali ed evidenziato in rosso ciò che non è chiaro.

Inoltre non è chiaro come dire al programma di uscire da una posizione,

dopo aver aumentato la differenza tra MA1 e MA2?

//--------------------------------------------------------------- 5 --
// Criteri di trading
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_HIGH,1); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_EMA,PRICE_LOW,1); // MA_2

if ( iHigh (Symbol(),Period(),0) >= MA_1_t) //
{
Opn_S=true;
}
if ( iLow (Symbol(),Period(),0) <= MA_2_t) //
{
Opn_B=true; // Aprire criterio di acquisto
}
if(quale codice è necessario per fare una chiusura lunga al massimo iMA di oggi?)
{
Cls_B=true;
}
//--------------------------------------------------------------- 6 --

 
VladislavVG:


Solo una rapida occhiata:

Il frammento evidenziato è al di fuori del ciclo e usa il contatore del ciclo i - qualcosa è sbagliato o nella logica o nell'implementazione


Grazie Vladislav, qualcosa ha cominciato a funzionare. Ma per qualche motivo solo come questo! :(

fig3

Un'altra domanda: perché le etichette di testo non vengono visualizzate nella finestra dell'indicatore?

// -- Процедура
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
 // if (ObjectFind(name)!=-1) ObjectDelete(name);
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 10, "Times New Roman", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }
// -- Обращение
SetText("Awesome_super_volumes", DoubleToStr(VLUP,0), tmhgh, dist, Black);