[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 324
Eu estudei MQL4 Expert Advisor durante um mês e decidi escrever um Expert Advisor. Eu não queria escrever um novo por falta de experiência e decidi usar o modelo tradingexpert.mq4 do livro.
A essência da estratégia é a seguinte: um sistema de três barras de "Larry Williams" para altos e baixos, traçar dois EMAs de três dias para altos e baixos, vender
para os altos e compra para os baixos.
No modelo, na seção de variáveis globais eu removi a linha externa dupla Rastvor =28,0; (na verdade não é necessário) e também a removi do critério comercial.
Mudou os valores de MA para 3 em variáveis globais:
extern int Período_MA_1= 3; // Período MA 1 extern int Período_MA_2= 3; // Período MA 2
if (PRICE_HIGH * Ponto >= MA_1_t * Ponto) { Opn_S=true; Cls_B=verdadeiro; }
if (PRICE_LOW * Ponto <= MA_2_t * Ponto) { Opn_B=true; //critério aberto. Comprar Cls_S=true; // Fechar Critério. Sell } //---------------------------------------------------------------
Agora o ponto crucial do problema: o sistema só abre ordens de venda, mas não quer comprar. Qual pode ser o erro?
É bem possível que eu tenha erros em outro lugar. Por favor, não julgue, mas me ajude com conselhos).
O que é isto? PRICE_LOW e PRICE_HIGH. São constantes inteiras que têm valor 0 ou 1, até 6.
Você deve usar iHigh(Símbolo(),Period(),i) para obter o valor BID máximo na barra i, e iLow(Símbolo(),Period(),i) para obter o valor BID mínimo na barra i.
Se cair sobre a barra atual então: se ( iHigh(Symbol(),Period(),0) >= MA_1_t) E não há necessidade de multiplicar MA por Ponto.
Eu anexei um indicador de volume (Volume) ao indicador padrão Awesome.
Quero organizar o cálculo do volume total de ondas (contado do preço baixo para o alto e corresponde ao valor mínimo e máximo do Awesome). Veja fig. 1.
Qual é o erro, os valores não são contados.
Abaixo está o próprio código.
#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);
}
O que é isto? PRICE_LOW e PRICE_HIGH. Elas são constantes inteiras com valor 0 ou 1, até 6.
Você deve usar iHigh(Symbol(),Period(),i) para obter o valor BID máximo na barra i, e iLow(Symbol(),Period(),i) para obter o valor BID mínimo na barra i.
Se cair sobre a barra atual, então: se ( iHigh(Symbol(),Period(),0) >= MA_1_t) E não há necessidade de multiplicar MA por Ponto.
Rapazes, alguém me diga o que há de errado com o código 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
}
Você pode me dizer se é possível encontrar em algum lugar o fatiamento de formas de TA como arquivos CSV? Posso usar txt, xls ou qualquer outro formato que possa ser processado de forma programática.
Há exemplos de figuras de AT em vários artigos de AT, livros didáticos, mas é claro, como imagens comuns. Alguém tem mais ou menos grandes conjuntos de símbolos TA salvos como uma fatia da história de algum par de moedas nos períodos H1-H4, digamos?
Eu pesquisei no Google, não encontrei nenhum. Naturalmente, podemos percorrer manualmente a história, marcar as formas, exportar este pedaço de história como .csv; repetir o número necessário de vezes, coletar a base das formas no final. Mas se alguém já fez isso, gostaria de economizar tempo.
Obrigado antecipadamente :)
Por que você precisa das formas como arquivos CSV? Escreva uma biblioteca de formas... Escreva-os você mesmo, para que possa compreendê-los, não peça emprestado o de outra pessoa. Muito não significa melhor!
Eu não entendo bem. Mas não há problema com a exibição de volumes. Há um problema com a contagem de volume. Em algum lugar por aqui.
1. A matriz precisa ser colocada - ou seja, a memória alocada. Caso contrário, simplesmente não há lugar para armazenar os valores ;).
2. Quando você receber um novo tick, sua matriz colocada mesmo será reposicionada/reinicializada. Isto tem a ver com o escopo. A matriz deve ser do tipo "estática" para evitar que isso aconteça.
Leia algo sobre os fundamentos da programação.
HZ O problema com a contagem é onde eu apontei os erros de uso da matriz para vocês.
1. Uma matriz deve ser localizada, em outras palavras, a memória deve ser alocada. Caso contrário, não há lugar para armazenar valores ;).
2. Quando você receber um novo tick, sua matriz colocada mesmo será reposicionada/reinicializada. Isto tem a ver com o escopo. A matriz deve ser do tipo "estática" para evitar que isso aconteça.
Leia algo sobre os fundamentos da programação.
HZ O problema com a contagem é onde eu tenho apontado erros no uso da matriz para vocês.
Isto é, oVol_Arr[] deve ser inicializado como uma matriz global, como eu o entendo.
A questão é, naturalmente, uma questão nula, MAS.
1. Por que então os volumes são exibidos corretamente no indicador.
2. Ao fazer o cálculo, eu acessoAOBuffer3[] e nãoVol_Arr[].
Olá a todos!
Eu estudei MQL4 Expert Advisor durante um mês e decidi escrever um Expert Advisor. Eu não queria escrever um novo por falta de experiência e decidi usar o modelo tradingexpert.mq4 do livro.
A essência da estratégia é a seguinte: um sistema de três barras de "Larry Williams" para altos e baixos, traçar dois EMAs de três dias para altos e baixos, vender
para os altos e compra para os baixos.
No modelo, na seção de variáveis globais eu removi a linha externa dupla Rastvor =28,0; (na verdade não é necessário) e também a removi do critério comercial.
Mudou os valores de MA para 3 em variáveis globais:
extern int Período_MA_1= 3; // Período MA 1
extern int Período_MA_2= 3; // Período MA 2
Na seção de critérios comerciais, foi:
//--------------------------------------------------------------- 5 --
// Critérios comerciais
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
if (PRICE_HIGH * Ponto >= MA_1_t * Ponto)
{
Opn_S=true;
Cls_B=verdadeiro;
}
if (PRICE_LOW * Ponto <= MA_2_t * Ponto)
{
Opn_B=true; //critério aberto. Comprar
Cls_S=true; // Fechar Critério. Sell
}
//---------------------------------------------------------------
Agora o ponto crucial do problema: o sistema só abre ordens de venda, mas não quer comprar. Qual pode ser o erro?
É bem possível que haja erros em algum outro lugar, por favor não julgue severamente, mas ajude com conselhos)
//--------------------------------------------------------------- 5 --
// Critérios comerciais
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
if (PRICE_HIGH * Ponto >= MA_1_t * Ponto)
{
Opn_S=true;
Cls_B=verdadeiro;
}
if (PRICE_LOW * Ponto <= MA_2_t * Ponto)
{
Opn_B=true; //critério aberto. Comprar
Cls_S=true; // Fechar Critério. Sell
}
//---------------------------------------------------------------
Agora o ponto crucial do problema: o sistema só abre ordens de venda, mas não quer comprar. Qual pode ser o erro?
É bem possível que eu tenha erros em outro lugar. Por favor, não julgue, mas me ajude com conselhos).
O que é isto? PRICE_LOW e PRICE_HIGH. São constantes inteiras que têm valor 0 ou 1, até 6.
Você deve usar iHigh(Símbolo(),Period(),i) para obter o valor BID máximo na barra i, e iLow(Símbolo(),Period(),i) para obter o valor BID mínimo na barra i.
Se cair sobre a barra atual então: se ( iHigh(Symbol(),Period(),0) >= MA_1_t) E não há necessidade de multiplicar MA por Ponto.
Boa tarde a todos!
Por favor, diga-me qual é o problema.
Eu anexei um indicador de volume (Volume) ao indicador padrão Awesome.
Quero organizar o cálculo do volume total de ondas (contado do preço baixo para o alto e corresponde ao valor mínimo e máximo do Awesome). Veja fig. 1.
Qual é o erro, os valores não são contados.
Abaixo está o próprio código.
O que é isto? PRICE_LOW e PRICE_HIGH. Elas são constantes inteiras com valor 0 ou 1, até 6.
Você deve usar iHigh(Symbol(),Period(),i) para obter o valor BID máximo na barra i, e iLow(Symbol(),Period(),i) para obter o valor BID mínimo na barra i.
Se cair sobre a barra atual, então: se ( iHigh(Symbol(),Period(),0) >= MA_1_t) E não há necessidade de multiplicar MA por Ponto.
Rapazes, alguém me diga o que há de errado com o código plz!
Rapazes, alguém me diga o que há de errado com o código plz!
Eu não entendo bem. Mas não há problemas com a exibição do volume. Há problemas com o cálculo de volumes. Em algum lugar por aqui.
Boa tarde!
Minha pergunta será um pouco fora de tópico.
Você pode me dizer se é possível encontrar em algum lugar o fatiamento de formas de TA como arquivos CSV? Posso usar txt, xls ou qualquer outro formato que possa ser processado de forma programática.
Há exemplos de figuras de AT em vários artigos de AT, livros didáticos, mas é claro, como imagens comuns. Alguém tem mais ou menos grandes conjuntos de símbolos TA salvos como uma fatia da história de algum par de moedas nos períodos H1-H4, digamos?
Eu pesquisei no Google, não encontrei nenhum. Naturalmente, podemos percorrer manualmente a história, marcar as formas, exportar este pedaço de história como .csv; repetir o número necessário de vezes, coletar a base das formas no final. Mas se alguém já fez isso, gostaria de economizar tempo.
Obrigado antecipadamente :)
Por que você precisa das formas como arquivos CSV? Escreva uma biblioteca de formas... Escreva-os você mesmo, para que possa compreendê-los, não peça emprestado o de outra pessoa. Muito não significa melhor!
Eu não entendo bem. Mas não há problema com a exibição de volumes. Há um problema com a contagem de volume. Em algum lugar por aqui.
1. A matriz precisa ser colocada - ou seja, a memória alocada. Caso contrário, simplesmente não há lugar para armazenar os valores ;).
2. Quando você receber um novo tick, sua matriz colocada mesmo será reposicionada/reinicializada. Isto tem a ver com o escopo. A matriz deve ser do tipo "estática" para evitar que isso aconteça.
Leia algo sobre os fundamentos da programação.
HZ O problema com a contagem é onde eu apontei os erros de uso da matriz para vocês.
1. Uma matriz deve ser localizada, em outras palavras, a memória deve ser alocada. Caso contrário, não há lugar para armazenar valores ;).
2. Quando você receber um novo tick, sua matriz colocada mesmo será reposicionada/reinicializada. Isto tem a ver com o escopo. A matriz deve ser do tipo "estática" para evitar que isso aconteça.
Leia algo sobre os fundamentos da programação.
HZ O problema com a contagem é onde eu tenho apontado erros no uso da matriz para vocês.
Isto é, oVol_Arr[] deve ser inicializado como uma matriz global, como eu o entendo.
A questão é, naturalmente, uma questão nula, MAS.
1. Por que então os volumes são exibidos corretamente no indicador.
2. Ao fazer o cálculo, eu acessoAOBuffer3[] e nãoVol_Arr[].
Obrigado!