[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

 

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 --
   // Торговые критерии
   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
     }
//--------------------------------------------------------------- 
tornou-se:

//--------------------------------------------------------------- 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)

 
Forexman77:


//--------------------------------------------------------------- 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.

fig1

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 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:


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.

Muito obrigado!!! Funciona!!!
 

Rapazes, alguém me diga o que há de errado com o código plz!

 
Fox_RM:

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
   }
   
 
VladislavVG:


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.

 //-- Поиск 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:

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!
 
Fox_RM:


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.

 
VladislavVG:


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!

Razão: