[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 324

 

Ciao a tutti!

Ho studiato MQL4 Expert Advisor durante un mese e ho deciso di scrivere un Expert Advisor. Non volevo scriverne uno nuovo a causa della mancanza di esperienza e ho deciso di usare il modello tradingexpert.mq4 dal libro.

L'essenza della strategia è la seguente: un sistema a tre barre di massimi e minimi "Larry Williams", tracciare due EMA a tre giorni per i massimi e i minimi, vendere

agli alti e compra ai bassi.

Nel template, nella sezione delle variabili globali ho rimosso la linea extern double Rastvor =28.0; (in realtà non è necessaria) e l'ho rimossa anche dai criteri di trading.

Cambiati i valori MA a 3 nelle variabili globali:

extern int Period_MA_1= 3; // Periodo MA 1
extern int Period_MA_2= 3; // Periodo MA 2

Nella sezione dei criteri di trading era:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
   MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_1
   MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // МА_2
 
   if (MA_1_t > MA_2_t + Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
   if (MA_1_t < MA_2_t - Rastvor*Point)         // Если разница между
     {                                          // ..МА 1 и 2 большая
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 
è diventato:

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

se (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}

se (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //criterio di apertura. Compra
Cls_S=true; // Criterio di chiusura. Sell
}
//---------------------------------------------------------------

Ora il nocciolo del problema: il sistema apre solo ordini di vendita, ma non vuole comprare. Quale può essere l'errore?

È molto probabile che ci siano errori da qualche altra parte, per favore non giudicate severamente ma aiutate con consigli)

 
Forexman77:


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

se (PRICE_HIGH * Point >= MA_1_t * Point)
{
Opn_S=true;
Cls_B=true;
}

se (PRICE_LOW * Point <= MA_2_t * Point)
{
Opn_B=true; //criterio di apertura. Compra
Cls_S=true; // Criterio di chiusura. Sell
}
//---------------------------------------------------------------

Ora il nocciolo del problema: il sistema apre solo ordini di vendita, ma non vuole comprare. Quale può essere l'errore?

È molto probabile che io abbia degli errori da qualche altra parte, per favore non giudicate, ma aiutatemi con dei consigli).



Cos'è questo: PRICE_LOW e PRICE_HIGH. Sono costanti intere che hanno valore 0 o 1, fino a 6.

Devi usare iHigh(Symbol(),Period(),i) per ottenere il valore massimo del BID sulla barra i, e iLow(Symbol(),Period(),i) per ottenere il valore minimo del BID sulla barra i.

Se il burattino sulla barra corrente allora: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) E non c'è bisogno di moltiplicare MA per Point.

 

Buon pomeriggio a tutti!

Per favore, ditemi qual è il problema.

Ho allegato un indicatore di volume (Volume) a Awesome standard indicator.

Voglio organizzare il calcolo del volume totale dell'onda (contato dal prezzo Low al prezzo High e corrisponde al valore Min e Max di Awesome). Vedi Fig. 1.

fig1

Qual è l'errore, i valori non vengono contati.

Qui sotto c'è il codice stesso.

#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;
}
if (Show_Vol_line==true)
{
double Vol_Arr[];


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
  //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];}
  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);     
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
//-- Эти значения должны отображаться в окне Awesome
  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); 
  }
  
//--Ввeл дополнительную процедуру для отображения значений на чарте. Ее не должно быть.
  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);
 }
 
Sepulca:


Cos'è questo: PRICE_LOW e PRICE_HIGH. Sono costanti intere con valore 0 o 1, fino a 6.

Dovresti usare iHigh(Symbol(),Period(),i) per ottenere il valore massimo del BID sulla barra i, e iLow(Symbol(),Period(),i) per ottenere il valore minimo del BID sulla barra i.

Se il burattino sulla barra corrente, allora: if ( iHigh(Symbol(),Period(),0) >= MA_1_t) E non c'è bisogno di moltiplicare MA per Point.

Grazie mille!!! Funziona!!!
 

Ragazzi, qualcuno mi dice cosa c'è di sbagliato nel codice plz!

 
Fox_RM:

Ragazzi, qualcuno mi dice cosa c'è di sbagliato nel codice plz!


if (Show_Vol_line==true)
{
double Vol_Arr[]; // ошибки: 1. Размещение  2. Область видимости


  if (AOBuffer3[i]<=0)Vol_Arr[i]=Volume[i]*Point*coaf;
  if (AOBuffer3[i]>0)Vol_Arr[i] = -Volume[i]*Point*coaf;}
//---- dispatch values between 2 buffers
   }
   
 
VladislavVG:


Non ho capito bene. Ma non ci sono problemi con la visualizzazione del volume. Ci sono problemi con il calcolo dei volumi. Da qualche parte qui dentro.

 //-- Поиск High & Time  
  if (AOBuffer3[i]>=0)
  {
  prhgh_s = High[i];
  if (prhgh_s >= prhgh_e) {prhgh_e = prhgh_s; tmhgh = Time[i];} // -- tmhgh - выводил это значение оно = 0;

  }   
   
  //-- Поиск Low & Time  
  if (AOBuffer3[i]<=0)
  {
  prlw_s = Low[i];
  if (prlw_s > prlw_e) {prlw_e = prlw_s; tmlw = Time[i];}
  } 
  
  // -- Пересчет баров от High до Low
  int colbr = iBarShift(NULL,0,tmhgh)-iBarShift(NULL,0,tmlw);    tmlw - тоже = 0; Почему?
  
  int shift=iBarShift(NULL,0,tmlw);
  
 for (i=0; i<=colbr; i++)
{VLUP += MathAbs(iVolume(NULL,0, shift+i));}
       
  SetText("Awesome_super_volumes"+Time[i], DoubleToStr(VLUP,0), tmhgh, 0.0010, Black);     
 
asdfgh001:

Buon pomeriggio!

La mia domanda sarà un po' fuori tema.

Potete dirmi se è possibile trovare da qualche parte l'affettamento delle forme TA come file CSV? Posso usare txt, xls o qualsiasi altro formato che possa essere elaborato programmaticamente.

Ci sono esempi di figure di AT in vari articoli di AT, libri di testo, ma naturalmente come immagini ordinarie. Qualcuno ha una serie più o meno grande di simboli TA salvati come una fetta di storia di qualche coppia di valute sui periodi H1-H4, diciamo?

Ho cercato su Google e non ne ho trovati. Naturalmente, possiamo passare manualmente attraverso la storia, marcare le forme, esportare questo pezzo di storia come .csv; ripetere il numero necessario di volte, raccogliere la base delle forme alla fine. Ma se qualcuno l'ha già fatto, vorrei risparmiare tempo.

Grazie in anticipo :)


Perché avete bisogno delle forme come file CSV? Scrivere una libreria di forme... Scriveteli voi stessi, in modo da poterli capire, non prendete in prestito quelli di qualcun altro. Molto non significa meglio!
 
Fox_RM:


Non ho capito bene. Ma non c'è nessun problema con la visualizzazione dei volumi. C'è un problema con il conteggio del volume. Da qualche parte qui dentro.


1. L'array ha bisogno di essere posizionato, cioè di allocare la memoria. Altrimenti non c'è semplicemente nessun posto dove memorizzare i valori ;).

2. Quando ricevi un nuovo segno di spunta, il tuo array pari sarà riposizionato/riinizializzato. Questo ha a che fare con la portata. L'array deve essere di tipo "statico" per evitare che questo accada.

Leggete qualcosa sui fondamenti della programmazione.

HZ Il problema del conteggio è dove ti ho indicato gli errori di utilizzo dell'array.

 
VladislavVG:


1. Un array deve essere localizzato, in altre parole, la memoria deve essere allocata. Altrimenti, non c'è proprio posto per memorizzare i valori ;).

2. Quando ricevi un nuovo segno di spunta, il tuo array pari sarà riposizionato/riinizializzato. Questo ha a che fare con la portata. L'array deve essere di tipo "statico" per evitare che questo accada.

Leggete qualcosa sui fondamenti della programmazione.

HZ Il problema del conteggio è dove ti ho fatto notare gli errori nell'uso degli array.

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


La domanda è ovviamente una domanda nulla, MA.

1. Perché allora i volumi vengono visualizzati correttamente nell'indicatore.

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

Grazie!