Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 271

 
soroko:
por lo que sólo se rellena el primer valor con el í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:

gracias. me ha ahorrado un fin de semana de insomnio).

vicmos gracias.
 
barabashkakvn:
vicmos gracias.
rellena todo con un valor, como la función ArrayFill(...)/
 
soroko:
rellena todo con un valor, como la función ArrayFill(...)/
¡lo siento hay un número menor de dígitos! ¡muchas gracias!
 

Buenos días a todos! Este problema - el compilador da una advertencia. No quiero ignorarlo, ¿puede ayudarme a encontrar una salida?

   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));

Maldice específicamente en la última línea, dice:"posible pérdida de datos debido a la conversión de tipo". ¿Cómo normalizar correctamente el tipo real en este caso?

 
jommerbot:

Buenos días a todos! Este problema - el compilador da una advertencia. No quiero ignorarlo, ¿puede ayudarme a encontrar una salida?

Maldice específicamente en la última línea, dice:"posible pérdida de datos debido a la conversión de tipo". ¿Cómo normalizar correctamente el tipo real en este caso?

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

Buenos días a todos! Este problema - el compilador da una advertencia. No quiero ignorarlo, ¿puede ayudarme a encontrar una salida?

Maldice específicamente en la última línea, dice:"posible pérdida de datos debido a la conversión de tipo". ¿Cómo normalizar correctamente el tipo real en este caso?

Y una cosa más: ArrayMaximum y ArrayMinimum devuelven el índice del elemento encontrado. Así que la forma correcta es esta:

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

Además: ArrayMaximum y ArrayMinimum devuelve el índice del elemento encontrado. Así que la forma correcta es así:

Muchas gracias. Descubrí lo mismo al depurar el código.
 

No calcula correctamente el nivel de take profit en función del importe de las pérdidas de las órdenes cerradas. Resulta que el 1º orden = 1; el 2º orden = 2; el 3º orden = 3; el 4º orden = 4. Tenemos que calcular el número de pips para cubrir la pérdida de todas las órdenes anteriores y ganar el 10% de la pérdida total.

En realidad, el Asesor Experto sólo considera que el importe de cada orden cerrada es igual a la orden supuestamente pendiente, es decir, sus cálculos muestran que si la 5ª orden pendiente es igual a 5 lotes, todas las órdenes perdedoras anteriores eran iguales a 5 lotes y, por lo tanto, la pérdida se calcula con el correspondiente nivel de beneficio erróneo. En otras palabras, si el volumen total de 4 órdenes es igual a 10 lotes, entonces el Asesor Experto simplemente multiplicará 4 órdenes por el volumen de la quinta orden pendiente y obtendrá un volumen total de 20 lotes......¿Qué debemos corregir en el código?

// Función que calcula el Nivel de Toma basado en el Nivel de Pérdida de las operaciones cerradas

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

double TakeProfitCalculate(double lot,int type)

{

int n,i;

doble prf,ttp;


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

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

{

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

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

n=NúmeroMágico()-MAGIC;

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

if(n==0) break;

}

prf=MathAbs(prf*(100+Porcentaje de beneficio)/100);

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

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

}

Razón de la queja: