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

 
TarasBY:

Em relação a esta linha:

Recentemente, os DTs freqüentemente acrescentam prefixos diferentes ao nome do símbolo (EURUSDm - por exemplo) - estes devem ser levados em conta ao se referir ao ambiente de mercado do símbolo.

P.S. ...E para o padrão "EURUSD" StringSubstr ("EURUSD", 6) não será zero, mas "".

Muito obrigado, Igor! Eu não sabia sobre os DTs e a carta. Pode ser uma mini-conta para o "m".

Você sabe onde o JPY tem o coeficiente 82 ? para outras moedas foi 0,625 para GBP, 0,7751937984 para EUR

A idéia é que quando você converte moedas, o coeficiente seria flutuante à medida que as taxas mudam. Por que então tomar constantes?
 
Chiripaha:

Nikolai, é muito bom que você esteja aprendendo a programar e criar programas. Mas a questão é que você não pediu exatamente ajuda com um caso particular obscuro no programa, mas na verdade você esboçou o TOR para escrever o programa.

O que você mostrou, em minha opinião, é metaforicamente falando em relação aos robôs, uma pilha de peças de reposição heterogêneas. Não está certo de forma alguma.

Portanto, não se pode apontar um erro específico aqui, pois tudo precisa ser refeito de uma maneira completamente diferente. - IMHO, eu não finjo ser mais do que isso.

Mas isso não é motivo para ficar chateado. Continue aprendendo a escrever. Lá, como dizem, ao invés de você, é claro, pode "comer" (para fazer o trabalho), mas você mesmo não está ficando bem alimentado com isso (ou seja, não aprenda). Portanto, vá em frente. Se um percorre o caminho do outro.

Tente escrever novamente com uma abordagem diferente para o problema. - Funcionou para mim.


Obrigado pela crítica. Diga-me, é realista implementar?
 
NICK_R:
Obrigado pela crítica. É realista fazer isso de todo?

É claro que é. Mas não é exatamente uma tarefa simples. Não é muito difícil, mas também não é fácil. - É o ideal para estudar.
 
Chiripaha:

Muito obrigado, Igor! Eu não sabia sobre o CD e a carta. Deve ser uma mini-conta - para a letra "m".

Você sabe onde o JPY tem o coeficiente de 82 ? as outras moedas tinham GBP - 0,625, EUR - 0,7751937984

A idéia é que quando você converte moedas, o coeficiente estaria flutuando à medida que as taxas mudam. Por que então tomar constantes?

Sergey, esses números não significam nada para mim, portanto não tenho uma resposta para essa pergunta.

E os prefixos na escrita de símbolos podem ou não fazer qualquer sentido.

 
TarasBY:

Sergey, estes números não significam nada para mim, portanto, não tenho resposta para esta pergunta.

E os prefixos na escrita do símbolo podem ou não fazer qualquer sentido.

OK. Obrigado!
 

Boa tarde colegas!

Você pode me dizer como se afastar do loop (destacado em vermelho no código)? O indicador está desacelerando terrivelmente.

#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  DarkGray
#property  indicator_color2  PowderBlue
#property  indicator_width1  2

//---- basic fan indicator parameters

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

    double  price_up_start, price_up_end, AO_up;
    double  price_dn_start, price_dn_end, AO_dn;
    datetime time_up, time_dn, AO_time_up, AO_time_dn;
    double Vol_AO_up, Vol_AO_dn;
    int shift_up, shift_dn, dn_koaf, up_koaf, dn_koaf_round, up_koaf_round;
    
//+------------------------------------------------------------------+
//| 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;

   for(int i=0; i<limit; i++)   // -------------------------------------------- Основной цикл
   {
     
 //---- Awesom + 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;
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;
}

//----------------------------- Блок поиска значений -----------------------------------------//
 
 //-- Поиск Low & Time & Min_AO 
  if (AOBuffer3[i] < 0)
  {
 price_up_end = 0; AO_up = 0;  
 price_dn_start = Low[i]; if (price_dn_end == 0) price_dn_end = Low[i]; 
 if (price_dn_start <= price_dn_end) {price_dn_end = price_dn_start; time_dn = Time[i]; shift_dn = iBarShift(NULL, 0, time_dn);}
 if (AOBuffer3[i] <= AO_dn) {AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_dn = Time[i];}
 dn_koaf=dn_koaf_round;
 up_koaf_round++;
  }   
  
  //-- Поиск High & Time & Max_AO  
  if (AOBuffer3[i] > 0)
   {
  price_dn_end = 0; AO_dn = 0;  
  price_up_start = High[i];
  if (price_up_start >= price_up_end) {price_up_end = price_up_start; time_up = Time[i]; shift_up = iBarShift(NULL, 0, time_up);}
  if (AOBuffer3[i] >= AO_up) {AO_up = AOBuffer3[i]*0.2+AOBuffer3[i]; AO_time_up = Time[i];}
  up_koaf=up_koaf_round;
  dn_koaf_round++;
   }   
 //--------------------------------- Выставляем значения --------------------------------------------//
    
   Vol_AO_up = 0; Vol_AO_dn = 0;
  if (shift_up > shift_dn)
    {
 for (int dn_br = shift_dn; dn_br <= shift_up; dn_br++)            //-------------- Перебор значений внутри основного цикла
          {
    Vol_AO_up += Volume[dn_br]; 
    SetText("Awesome_super_volumes"+up_koaf, DoubleToStr(Vol_AO_up,0), AO_time_dn, AO_dn, Blue);
          }   
  }
 
 if (shift_dn > shift_up)
    {
 for (int up_br = shift_up; up_br <= shift_dn; up_br++)            //-------------- Еще один перебор значений внутри основного цикла
          {
    Vol_AO_dn += Volume[up_br]; 
    SetText("Awesome_super_volumes"+dn_koaf, DoubleToStr(Vol_AO_dn,0), AO_time_up, AO_up, Red);
          }   
    }
 } 
           
//---- done

   return(0);
  }
//+------------------------------------------------------------------+
void SetText(string name, string Vl, datetime t1, double p1, color c)
 {
  ObjectCreate(name,OBJ_TEXT,WindowFind("Awesome_super_volumes"),0,0,0,0);
  ObjectSetText(name, Vl, 6, "Arial Black", c);
  ObjectSet(name, OBJPROP_TIME1 , t1);
  ObjectSet(name, OBJPROP_PRICE1, p1);
  ObjectSet(name, OBJPROP_COLOR, c); 
  }

Obrigado!


 
Fox_RM:

Boa tarde colegas!

Você pode me dizer como se afastar do loop (destacado em vermelho no código)? O indicador está desacelerando terrivelmente.

Obrigado!

Ainda assim, vou lhe dar esta idéia, talvez uma bobagem. Mas talvez eu arranje um mais sensato.

No que diz respeito à tarefa você precisa para a busca final dos dados em algumas barras, então na primeira busca escreva os valores dos dados em algum array (ou buffer - não sou muito bom nisso).

E depois de concluída a primeira busca, pegue os valores necessários desta matriz (buffer) para obter dados para a segunda busca.

Só não estou particularmente seguro se isso ajudaria na velocidade. Mas eu também não sei muito sobre as causas de frenagem. É difícil para mim dizer algo mais qualificado a este respeito.

Quais poderiam ser os prós e os contras. O menos é que neste caso você estima a situação na barra não on-line, mas após o fato, quando os dados já são meio inúteis. Mas... isto é compensado pelo fato de que, de fato, quando você recalcula os dados antigos, você não precisa mais deles online. E quando os dados atuais reais chegarem, eles serão imediatamente processados até a 2ª enumeração. Portanto, não deve haver perda de relevância neste caso. E mais - vai resolver sua tarefa: livrar-se do excesso de tiro no excesso de tiro. : ))

Talvez eu tenha esquecido algo. Leve minha idéia de forma crítica. Bem, e a melhor crítica é a prática. Basta escrever e verificar novamente o que e como funcionará. Eu acho que sim.

 

Não há praticamente nenhuma diferença, apenas um processo ligeiramente diferente de obter os pontos de controle A e B. Já tentei com arrays.

Então, entre A e B, eu também teria que passar pelas barras. Não vejo outra maneira, é por isso que estou perguntando.

Talvez alguém possa me dar uma dica. Talvez haja algo errado com a lógica da escrita de códigos?

 
Fox_RM:

Não há praticamente nenhuma diferença, apenas um processo ligeiramente diferente de obter os pontos de controle A e B. Já tentei com arrays.

Então, entre A e B, eu também teria que passar pelas barras. Não vejo outra maneira, é por isso que estou perguntando.

Talvez alguém possa me dar uma dica. Talvez haja algo errado com a lógica da escrita de códigos?

Sim, exatamente - teremos que fazer um loop com o transbordo de qualquer maneira. Portanto, não há maneira de evitá-lo. E muito provavelmente a questão deve ser colocada de maneira diferente - O que causa a frenagem e como se livrar dela?
 
Fox_RM:

Boa tarde colegas!

Você pode me dizer como se afastar do loop (destacado em vermelho no código)? O indicador está desacelerando terrivelmente.

Obrigado!

Você pode agrupar o indicador neste local - será uma pequena otimização do indicador:

if (Show_Volume==true)
{
double nSum = Volume[i]*Point*coaf;
   if (AOBuffer3[i]<=0)ExtMapBuffer1[i] = nSum;
   if (AOBuffer3[i]>0)ExtMapBuffer1[i] = -nSum;
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;
}

assim:

if (Show_Volume==true)
{
 double nSum = Volume[i]*Point*coaf; double Vol_Arr[];  // Не знаю в этом случае можно через запятую переменные прописывать? - double nSum = Volume[i]*Point*coaf, Vol_Arr[];

 if (AOBuffer3[i]<=0) {ExtMapBuffer1[i] =  nSum; Vol_Arr[i] =  Volume[i]*Point*coaf;}
 if (AOBuffer3[i]>0)  {ExtMapBuffer1[i] = -nSum; Vol_Arr[i] = -Volume[i]*Point*coaf;}
}

Aqui está:

AO_dn = AOBuffer3[i]*0.2+AOBuffer3[i];
// и тут
AO_up = AOBuffer3[i]*0.2+AOBuffer3[i];

Você pode mudá-lo para:

AO_dn = AOBuffer3[i]*1.2;
     // и
AO_up = AOBuffer3[i]*1.2;

Depois, você tem "Textos" empilhados no indicador. Antes de colocar um novo texto, você tem que apagar os antigos. Isto pode realmente retardar o indicador - talvez seja essa a razão. Uma vez que você recebe tantos destes textos quanto há carrapatos nos parâmetros selecionados.

Se alguém me disser como melhor implementar isto no código - porque eu mesmo estou pedindo uma ajuda de codificação semelhante.

Razão: