Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 271

 
soroko:
portanto apenas o primeiro valor é preenchido com o índice [0].
//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"

double Pr[5];                 // обявление 5-мерного статического массива
double PriceOld;              // переменная для сравнения цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double temp_prace=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   if(NormalizeDouble(PriceOld-temp_prace,5)!=0)
     {
      Pr[4]=Pr[3];
      Pr[3]=Pr[2];
      Pr[2]=Pr[1];
      Pr[1]=Pr[0];
      Pr[0]=temp_prace;
      PriceOld=Pr[0];
     }
  }
//+------------------------------------------------------------------+
 
soroko:

obrigado. poupou-me um fim-de-semana sem dormir).

vicmos obrigado.
 
barabashkakvn:
vicmos obrigado.
preenche tudo com um valor, como a função ArrayFill(...)/ ArrayFill
 
soroko:
preenche tudo com um valor, como a função ArrayFill(...)/ ArrayFill
Desculpe, há apenas um número menor de dígitos! muito obrigado!
 

Bom dia a todos! Tal problema - o compilador dá um aviso. Não quero ignorá-lo, pode ajudar-me a encontrar uma saída?

   double aHigh[ 12 ], aLow[ 12 ];
   double dVolatility = 0.0;
   
   CopyHigh(sSymbol, PERIOD_MN1, 0, 12, aHigh);
   CopyLow(sSymbol, PERIOD_MN1, 0, 12, aLow);
   
   dVolatility = ArrayMaximum(aHigh) - ArrayMinimum(aLow);
   dVolatility = NormalizeDouble(dVolatility, SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));

Está a praguejar especificamente na última linha, diz:"possível perda de dados devido à conversão do tipo". Como normalizar correctamente o tipo real neste caso?

 
jommerbot:

Bom dia a todos! Tal problema - o compilador dá um aviso. Não quero ignorá-lo, pode ajudar-me a encontrar uma saída?

Está a praguejar especificamente na última linha, diz:"possível perda de dados devido à conversão do tipo". Como normalizar correctamente o tipo real neste caso?

   dVolatility = NormalizeDouble(dVolatility, (int)SymbolInfoInteger(sSymbol, SYMBOL_DIGITS));
 
barabashkakvn:
Obrigado
 
jommerbot:

Bom dia a todos! Tal problema - o compilador dá um aviso. Não quero ignorá-lo, pode ajudar-me a encontrar uma saída?

Está a praguejar especificamente na última linha, diz:"possível perda de dados devido à conversão do tipo". Como normalizar correctamente o tipo real neste caso?

E mais uma coisa: ArrayMaximum e ArrayMinimum retorna o índice do elemento encontrado. Portanto, a forma correcta é esta:

   dVolatility = aHigh[ArrayMaximum(aHigh)] - aLow[ArrayMinimum(aLow)];
 
MigVRN:

Também: ArrayMaximum e ArrayMinimum retorna o índice do elemento encontrado. Assim, a forma correcta é a seguinte:

Muito obrigado. Descobriu a mesma coisa quando depurou o código.
 

Não calcula correctamente o nível de lucro com base no montante das perdas das encomendas encerradas. Acontece que a 1ª ordem = 1; 2ª ordem = 2; 3ª ordem = 3; 4ª ordem = 4. Precisamos de calcular o número de pips para cobrir a perda em todas as encomendas anteriores e ganhar 10% da perda total.

Na verdade, o Consultor Especialista apenas considera o montante de cada ordem fechada como sendo igual à ordem supostamente pendente, ou seja, os seus cálculos mostram que se a 5ª ordem pendente for igual a 5 lotes, todas as ordens perdidas anteriormente foram iguais a 5 lotes e, portanto, a perda é calculada com o correspondente nível de lucro errado. Isto é, se o volume total de 4 encomendas equivaler realmente a 10 lotes, então o Consultor Especialista irá simplesmente multiplicar 4 encomendas pelo volume da 5ª encomenda pendente e obter um volume total de 20 lotes......O que devemos corrigir no código?

// Função que calcula o Take Level com base no Nível de Perda de negócios fechados

//=================================================================================================

duplo TakeProfitCalculate(lote duplo,tipo int)

{

int n,i;

duplo prf,ttp;


prf=MathAbs(BuyLevel-SellLevel)/Point*LOT*MarketInfo(Symbol(),MODE_TICKVALUE);//

if(No!=0) for(i=OrdersHistoryTotal()-1;i>=0;i--)

{

if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continua;

if(OrderSymbol()!=Symbol() || OrderMagicNumber()<MAGIC || OrderMagicNumber()>MAGIC+200 || OrderType()>OP_SELLL) continua;

n=OrderMagicNumber()-MAGIC;

prf+=(OrderProfit()+OrderSwap()+OrderComission()));

if(n==0) quebra;

}

prf=MathAbs(prf*(100+ProfitPercent)/100));

ttp=prf*Point/(LOT*MarketInfo(Symbol(),MODE_TICKVALUE))

if(type==OP_BUY) return(NRu(BuyLevel+ttp)); else return(NRd(SellLevel-ttp))

}

Razão: