[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 402

 
belck:

É disso que se trata a minha idéia:


Você tem que ir ao Serviço de Trabalho com uma idéia, e aqui é costume lidar com situações específicas com um código específico.
 

Boa tarde! Quero criar um indicador que exiba um canal em indicadores como MASD, AO e similares. Este indicador é sobreposto à janela dos indicadores básicos (MASD, AO e similares) e é desenhado como linhas paralelas acima e abaixo de 0. Estas linhas são definidas como uma média de picos máximos (acima de 0) e mínimos (abaixo de 0) para o período especificado.
Estou tentando usar o indicador AO como um exemplo, mas ele não funciona.
Algoritmo:
escrevemos as leituras dos indicadores em um array,
corremos através deste array em busca de picos / troughs,
escrevemos em certos arrays,
encontramos o valor médio dos picos, depois troughs,
atribuímos o valor obtido ao buffer do indicador.
Nesta etapa, não é o canal (aderindo a 0) no indicador que é definido no código, mas o valor médio dos picos máximos e o valor médio das calhas mínimas.
A definição de picos e canais pode ser removida do código e executada como uma função, mas por enquanto eu a deixei dessa maneira - não muda a questão.
Problemas:
1. O terminal fica pendurado (consideravelmente)
2. As linhas não são exibidas como uma média; elas aparecem como max/min durante um período.
Demorei muito tempo para descobrir isso, mas não consigo descobrir a causa dos problemas. Você pode me ajudar a corrigir meu código ou me dar um link para o código fonte de questões similares e eu tentarei corrigi-lo ainda mais. Obrigado de antemão.

int start(){
    int limit=Bars-IndicatorCounted();
    for(int i=limit;i>=0;i--){
//     if (IsNewBar()){
       int j=0;
       for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 
             AO[j]=AO(d);                            // Запишем данные инд. в цикле в массив
             Print("АО-",AO[j],"-",d,"-",i);
             j++;
       }             
       int k_up=0,k_dw=0; double SDw=0,SUp=0,P1=0,P2=0;      
       //собираем экстремумы выше 0
       for (int p=4;p<=period-1; p++){          
         if (AO[p]>AO[p+1] && AO[p]>AO[p-1] 
            && AO[p+1]>AO[p+2]
            && AO[p+2]>AO[p+3]
            && AO[p+3]>0
            && AO[p-1]>AO[p-2]
            && AO[p-2]>AO[p-3]
            && AO[p-3]>0){                           // Нашли макс
            ArrayResize(Up, k_up+1);                 // Размер массива донышек под кол-во найденных донышек
            Up[k_up]=AO(p);                          // Заносим значение пика в массив                 
            Print("значение пика-",Up[k_up],"-",p);           
            SUp=SUp+Up[k_up];
            P1=SUp/(k_up+1);            
            k_up++;                                  // Увеличиваем индекс массива донышек                                 
         }
         //собираем впадины ниже 0
         if (AO[p]<AO[p+1] && AO[p]<AO[p-1] 
            && AO[p+1]<AO[p+2]
            && AO[p+2]<AO[p+3]
            && AO[p+3]<0
            && AO[p-1]<AO[p-2]
            && AO[p-2]<AO[p-3]
            && AO[p-3]<0){                           // Нашли мин
            ArrayResize(Dw, k_dw+1);                 // Размер массива донышек под кол-во найденных донышек
            Dw[k_dw]=AO[p];                          // Заносим значение пика в массив                                            
            Print("значение донышка-",Dw[k_dw],"-",p);                                           
            SDw=SDw+Dw[k_dw];
            P2=SDw/(k_dw+1);           
            k_dw++;// Увеличиваем индекс массива донышек   
         }         
       }
       level1[i]=P1;
       level2[i]=P2;
    }
    return(0);
}
//+------------------------------------------------------------------+
double AO(int a){double AO=iAO( NULL, 0, a);
     return(AO);
}
 
muito obrigado! muito útil!
 
LOA:

Boa tarde!
Problemas:

1. terminal está pendurado (significativamente)

for (int d=2;d<=period-1;d++){         
             ArrayResize(AO,j+1); 


Aumentar o tamanho de uma matriz em um loop é cruel, é por isso que ela fica pendurada. Aumentar o tamanho de uma vez por vez. Ou usar séries de tempo de uma só vez


P.S. ver mensagens pessoais

 

Como faço um loop através de uma variável do tipo string?

Exemplo

   double A[3];
   A[0]=iClose("EURUSD",0,0);
   A[1]=iClose("GBPUSD",0,0);
   A[2]=iClose("AUDUSD",0,0);
Como substituir esta construção por um loop?
 
Boa tarde, você poderia me dizer como escrever uma condição pela qual, se o lucro de uma ordem aberta for um pungente, então feche essa ordem?
 
first_may:
Boa tarde, você poderia me dizer como escrever uma condição pela qual, se o lucro de uma ordem aberta for um pungente, então feche essa ordem?

Usando a função.

https://www.mql5.com/ru/forum/131859/page3#434225

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
 
Rorschach:

Como faço um loop através de uma variável do tipo string?

Exemplo

Como substituir esta construção por um loop?

   string asSymbols[3] = {"EURUSD", "GBPUSD", "AUDUSD"};
   double A[3] = {0};
   for (int i = 0; i < ArraySize( sSymbols) && i < ArraySize( A); i++) A[i]= iClose(asSymbols[i], 0, 0);
 
Zhunko:



Obrigado
 
É possível que o terminal fique pendurado devido ao manuseio incorreto de objetos, onde os objetos são criados e deletados a cada tick?