Explicação detalhada do iCustom - página 4

 
honest_knave: Eu nunca soube que se chamava "caixa de camelo". Obrigado!
Parece que o Moderador apagou meu post anterior porque tinha um link WikiPedia, então basta fazer uma pesquisa na WikiPedia (ou Google) por alguma história e detalhes sobre "Caso de Camelo".
 
Fernando Carreiro:
Parece que o Moderador apagou meu post anterior porque tinha um link WikiPedia, então basta fazer uma pesquisa na WikiPedia (ou Google) por alguma história e detalhes sobre o "Caso Camelo".
Seu post foi removido, pois era um duplo. O mesmo link já está postado.
 
Continuando a partir do nº 23 e encapsulando em uma função nº 26, agora mostro uma estrutura que funciona tanto no MT4 quanto no MT5. (Para pós-construção 600, mudei os pontos inválidos(#29) em nomes de variáveis, e aprovo os pontos para enumerações padrão).
Não compilado, não testado.
struct SFX{                            // SFX indicator at #1
   #define  SFX_NAME_PATH   "SFX"       // Indicator filename without extension,
                                       // including blanks if any.
   enum SFXbuffer{SFX_STD, SFX_STDMA};
   string                  PairName;
   ENUM_TIMEFRAMES         tf;
   int                     StdDev_MA_Period;
   int                     StdDev_MA_Shift;
   ENUM_MA_METHOD          StdDev_MA_Method;
   ENUM_APPLIED_PRICE      StdDev_MA_Price;
   int                     MA_Fast_Period;
   ENUM_MA_METHOD          MA_Fast_Method;
   int                     MA_Fast_Shift;
   #define  CheckOncePerBar true;
   void SFX()      : PairName(_Symbol),            tf(PERIOD_CURRENT),
                     StdDev_MA_Period(12),         StdDev_MA_Shift(0),
                     StdDev_MA_Method(MODE_SMA),   StdDev_MA_Price(PRICE_CLOSE),
                     MA_Fast_Period(3),            MA_Fast_Method(MODE_SMMA),
#ifndef __MQL5__
                     MA_Fast_Shift(0){}
   double get(SFXbuffer buf, int iBar = 0){
      return iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar,
                     buf, iBar);
   }  // get
#else // MQL5
                     MA_Fast_Shift(0),             Handle(INVALID_HANDLE){}
   void ~SFX(){   if(Handle != INVALID_HANDLE) IndicatorRelease(Handle);   }
   double get(SFXbuffer buf, int iBar = 0){
      if(Handle == INVALID_HANDLE){
         Handle = iCustom(PairName, tf, SFX_NAME_PATH,
                     StdDev_MA_Period,             StdDev_MA_Shift,
                     StdDev_MA_Method,             StdDev_MA_Price,
                     MA_Fast_Period,               MA_Fast_Method,
                     MA_Fast_Shift,                CheckOncePerBar);
         if(Handle == INVALID_HANDLE){
            PrintFormat("%s: iCustom(%s) Failed: %i",
                        __FUNCTION__, SFX_NAME_PATH, _LastError);
            return 0;
         }
      }
      double  value[1]; CopyBuffer(Handle, buf, iBar, 1, value);
      return  value[0];
   }  // get
 Private:
   int                  Handle;     // MT5 only
#endif   // __MQL5__
}; // SFX
///////////////////////////////////////////////////////////////////////////////
SFX   SFXindicator;
// SFXindicator.StdDev_MA_Period = ...;   // modification of default parameters.
:
double     STDBuffer = SFXindicator.get(SFX_STD,   0);   // example calls
double     stddevma  = SFXindicator.get(SFX_STDMA, 0);
Não compilado, não testado.
 

Olá, tenho uma pergunta rápida (e indolor, espero) sobre o iCustom: digamos que tenho 3 indicadores chamados Ind_A, Ind_B e Ind_C, e tenho um Conselheiro Especialista chamado EA.

a EA chama todos os 3 indicadores usando o icustom, passando seus argumentos e obtendo os resultados através da indexação de seus amortecedores respctivos.

anexei meu indicador 3 no EURUSDchart e executei minha EA; vamos nos concentrar no indicador Ind_A, ele está rodando como indicador, mas ao mesmo tempo é executado pela EA: a situação é a mesma ou temos duas instâncias de ind_A rodando? (quero dizer, uma instância funciona por conta própria e a outra instância vive dentro da EA).

em caso afirmativo, cada instância tem seu próprio buffer? ou o buffer é compartilhado entre todas as instâncias do indicador?

Muito obrigado!

 

Desculpe por acordar este fio novamente. Mas achei que minha pergunta pertencia a este tópico.

Tento acessar 2 tampas a partir de um indicador personalizado de tendência-alvo, o indicador tem uma entrada = 60, e duas tampas Band UP e Band LO

usando

double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



double Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,0,1);double Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,0,1,0);



Comment("iCustom returned v1= "+Value1+ " and value2= ",Value2);

é a maneira como eu estabeleço os parâmetros para este iCustom correto? porque parece que não consigo obter os valores de Band Up e Band LO não exatos para os tampões no painel de datawatch pls verificar a imagem anexada. Somente os 2 ou 3 primeiros dígitos decimais ou 3e à direita, mas para uma cotação FX todos os 4 dígitos devem estar corretos, está correto?

Espero que o codificador e os usuários experientes da MQL5 possam me ajudar a corrigir rapidamente este problema? Obrigado de antemão


Apropos que é seu indicador tem 5 entradas e 4 buffers,

double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);

double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);

double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);

double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);


Como este acima?

 
ntk2017: Desculpe por acordar este fio novamente. Mas

Por favor, edite seu post (original) e use o botão CODEbutton (Alt-S)! (Para grandes quantidades de código, anexe-o.)
Regras gerais e melhores práticas do Fórum. -Geral - Fórum de programação MQL5
MensagensEditor

 
ntk2017: Aproximadamente o que é seu indicador tem 5 entradas e 4 buffers,
double Value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0);
double Value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,2,0,0);
double Value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,3,0);
double Value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,4);

Como este acima?

Absolutamente não.

iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,BufferIndex,BarIndex);
 
William Roeder:

Absolutamente não.

Eu deveria usar assim
double value1 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,1,0,0,0,0); //with BarIndex=0, when only check on close or 1= when check on every tick;
 double value2 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,1,0,0,0);
double value3 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,1,0,0);
double value4 = iCustom(Symbol(),0,"indicator",a1,a2,a3,a4,a5,0,0,0,1,0);

Obrigado por sua correção Acabo de encontrar um exemplo "Combined Use of Programs"(https://book.mql4.com/samples/shared) inmql5 Acho que esse exemplo no codig é o que eu preciso. Estudarei essa parte, se tiver dúvidas em minha programação, espero que você me ajude a torná-la mais estável e mais lucrativa.

Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
Combined Use of Programs - Simple Programs in MQL4 - MQL4 Tutorial
  • book.mql4.com
It was said earlier that according to MQL4 rules trade functions cannot be used in custom indicators, that is why for automated trading Expert Advisors or scripts should be used. However, the resource-saving technology used for calculations in indicators (see Creation of Custom Indicators) is widely used when creating trading programs. In most...
 
William Roeder:

Absolutamente não.

Eu tenho o código desta forma agora eu vejo os buffers 1, 2 do TrendTarget (Mas ainda não todos os 4 dígitos corretos!!!), eu defino o valor do BarsIndex em cada pau para 1 porque eu gosto de checar novamente o TrendTarget

   double shortSma, longSma, ShortSL, ShortTP, LongSL, LongTP,Band_UP,Band_LO;

   double Value1,Value2 ;





   Value1 = iCustom(Symbol(),0,"TrendTarget.ex4",60,1,1);

   Value2 = iCustom(Symbol(),0,"TrendTarget.ex4",60,2,1);

   Band_UP = Value1;

   Band_LO = Value2;

   Comment(" !!!!!!! ICUSTOM returned Value1= "+Value1+ " and value2= ",Value2+"\n");

Mas eu ainda tenho problemas. Eu uso o TrendTarget como um filtro
if(tik <= 5 && Ask>Band_UP) ///////////////ONLY can open SELL////////////////
        {
         ////////////////////// TP1 SL1 ///////////////////////////////////
         openOrder(Symbol(), OP_SELLSTOP,LotSize,sellPrice,sellPrice+SL1*point(), sellPrice-TP1*point(),"_Sell_1",MagicNumber,exp,Crimson);
        }

      if(tik <= 5 && Bid<Band_LO)   ///////////////ONLY can open BUY////////////////

        {
         ////////////////////// TP1 SL1 ///////////////////////////////
         openOrder(Symbol(), OP_BUYSTOP,LotSize,buyPrice,buyPrice-SL1*point(), buyPrice+TP1*point(),"_Buy_1",MagicNumber,exp,Navy);
        }
mas após sua execução, anexei o indicador TrendTarget e vejo que a EA ainda abriu muitas negociações entre o canal!!!!!

Na foto, adiciono o TrendTarget depois que ele começa. Quando eu crio um modelo de teste com incluir o TrendTarget(parâmetro TF=60) o canal só mostra para as primeiras X barras, então eu só posso ver a curva de preço, por que é?
Como posso simplesmente adicionar o indicador Trend Target para verificação visual onde os pedidos são abertos?

Eu gosto de usar no código o valor_UP no passado, similare o uso de fechar: antes de ontem Fechar[2], ontem Fechar[1], corrente fechar Fechar[0]? É possível?
Arquivos anexados:
 
O problema que ainda tenho com o teste scap test EA é o seguinte:

1rstproblem:
Ican see the buffers 1, 2 of the TrendTarget (But still not all 4 digits correct!!!!), is it important? para a cotação EURUSD 1.0907 pensei que quando o valor do preço deveria ser comparado com o canal superior ou inferior do TrendTarget, esses valores do TrendTarget deveriam ser exatamente corretos pelo menos 4 dígitos decimais.
É necessário ajustar o valor do BarsIndex em cada pau para 1 porque gosto de checar novamente o TrendTarget

2º problema:
Mas eu ainda tenho problemas. Eu uso o TrendTarget como um filtro.

após sua execução, eu anexei o indicador TrendTarget e depois vejo que a EA ainda abriu muitas negociações entre o canal!!!!!

Terceiro problema:
Na imagem anexada tenho que adicionar o TrendTarget depois que ele começa. Quando eu crio um modelo de teste com incluir o TrendTarget (parâmetroTF=60) o canal TrendTarget é mostrado apenas para as primeiras X barras, talvez 100, então eu só posso ver a curva de preço, por que é isso?

4rthproblem:
Como posso simplesmente adicionar o indicador Trend Target para verificação visual do tempo de execução onde os pedidos são abertos?

5ºproblema:
Gosto de usar no código o valor_UP no passado, semelhante ao uso de fechamento: antes de ontem Fechar[2], ontem Fechar[1], fechamento atualFechar[0]? É possível? Como pode haver uma quebra de barras mais longa do que poucas, nesse caso gosto de mudar a estratégia de breakouttrading, em vez disso, apenas uma teoria que ainda não sei como fazer na codificação

6o problema:
Quando a condição é tocada, por exemplo, gosto de abrir apenas 1 ordem, aqui porque o preço permanece muitas barras acima do canal superior, então a condição é sempre correta, ela abre até que minha conta se esgote! Como fazer para enviar apenas um pedido, depois esperar que a condição mude...

7°problema:
Será que alguém sabe qual é o alvo da tendência, parece-me que uma linha de tendência ou MA(x) de preço com +/- 1xATR(14) adicionado a cada lado está correto? Será que alguém sabe o código para isso?