[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
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
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.
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.
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 parametersexternbool Show_AOLine_2=true;
externint SlowEMA3=34;
externint EMA=2;
externbool Show_Volume=true;
externdouble coaf=1.5;
externbool Show_Vol_line=true;
//---- indicator buffersdouble 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 settingsstring 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 donereturn(0);
}
//+------------------------------------------------------------------+//| Awesome Oscillator |//+------------------------------------------------------------------+int start()
{
int limit;
int counted_bars=IndicatorCounted();
double prev,current;
//---- last counted bar will be recountedif(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
//---- AO_fan line 2 (basic) bufferfor(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 до Lowint 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);
//---- donereturn(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);
}
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.
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
}
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 до Lowint 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);
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!
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.
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.
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 --
// 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)
//--------------------------------------------------------------- 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.
Qual è l'errore, i valori non vengono contati.
Qui sotto c'è il codice stesso.
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.
Ragazzi, qualcuno mi dice cosa c'è di sbagliato nel codice plz!
Ragazzi, qualcuno mi dice cosa c'è di sbagliato nel codice plz!
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.
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!
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.
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!