Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 588

 
lil_lil:

Estou fechando 4 posições ao mesmo tempo, como posso contá-las como uma em uma fila na função de contagem de perdas?

Eles podem fechar, por causa do deslizamento, não pelo mesmo preço e o tempo pode ser diferente

Julgamento:

Se o corretor permitir o fechamento do contador, devemos abrir uma ordem de contador com um volume igual ao volume de ordens cumulativamente fechadas para fixar o preço de fechamento. Então, o preço de fechamento é fixo e você pode executar sem pressa 4 operações para fechar as ordens opostas.

 

Você pode me dizer como determinar como a margem é calculada?

Alguns corretores cobram margem em cada posição. E alguns corretores, apenas sobre a diferença de volumes na compra e venda. (isto é, se a conta estiver totalmente bloqueada, então a margem é zero)


Como posso determinar programticamente o método de cálculo de margem?

 

Olá. Estou procurando por um fractal acima do MA.

Procurando um fractal acima do MA, memorizo uma barra, depois procuro um fractal desta barra e se for menos do que o primeiro que encontro, então é verdade

Constantemente falso nos comentários

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

Olá. Estou procurando por um fractal acima do MA.

Procurando um fractal acima do MA, memorizo uma barra, depois procuro um fractal desta barra e se for menos do que o primeiro que encontro, então é verdade

Constantemente falso nos comentários

O problema está nesta linha

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


Se for encontrado um fractal e ele estiver acima do MA, devemos interromper o ciclo em vez de continuar com ele. Após o primeiro fractal ser encontrado, haverá outro e um terceiro e assim por diante até ...

 
Alexey Viktorov:

O problema está nesta linha


Se for encontrado um fractal e ele estiver acima do MA, devemos interromper o ciclo em vez de continuar. Após o primeiro fractal ser encontrado, haverá outro e um terceiro e assim por diante até ...

Obrigado. Substituído por break;Agora é sempre verdade. mas a condiçãose(fr2<fr1) não for cumprida.
 
Ghabo:
Obrigado. Substituído por break;Agora é sempre verdade. mas a condiçãose(fr2<fr1) não for cumprida.

Portanto, temos que acrescentar esta condição antes de exibir o resultado da função. O que há de tão difícil nisso?

 
Alexey Viktorov:

Portanto, é preciso acrescentar esta condição antes que a função produza o resultado. O que há de tão difícil nisso?

A função não deveria retornar falsa se a condição não for cumprida?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

A função não deveria retornar falsa se a condição não for cumprida?

Verifique se o iFractals retorna zero ou um valor vazio.

 
Alexey Viktorov:

Verifique se o iFractals retorna zero ou um valor vazio.

Há um valor vazio na janela de dados. Substituídoif(f!=0) por if(f!=EMPTY_VALUE), sem alteração no resultado.
 
Ghabo:
Há um valor vazio na janela de dados. Substituídoif(f!=0) por if(f!=EMPTY_VALUE), o resultado é inalterado.

1. Eu disse verificar, não substituir. iFractals retorna 0 se não houver fractal. Não o uso regularmente e, naturalmente, não entupo os restos de memória não secos com tais trivialidades.

2. A função, embora terrivelmente escrita, ainda funciona bem.

3. O último valor é exibido em Comentário. Substitui-la por

     Print("************ ", f_ma(Symbol(), 0, 0));
E veja quantas vezes ele imprime
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true
Razão: