Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 66

 
Roger:

Lo que llamaste Trailing en realidad no lo es, se calcula de una manera diferente y su comportamiento puede ser ilógico.


Aunque nuestros conceptos de los términos no coinciden, pero me entiendes, ¿no?

Resuelto el problema, estaba aquí:

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

Esta función no tenía en cuenta todas las operaciones abiertas, por lo que tuve que cambiar las condiciones del bucle. Ahora se ve así:

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

Esta función calcula la suma de los beneficios de todas las operaciones abiertas al nivel de precios que se le indique. Sin embargo, hay una opinión citada que dice que no tiene en cuenta el diferencial, y estoy de acuerdo con ella. El autor de este dictamen sugirió esta solución:

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

Pero confieso que, para ser sincero, no le entiendo como escribe:

El diferencial no se contabiliza. Esto puede corregirse contando el resultado a partir del precio actual.
No entiendo el algoritmo que ha sugerido, ¿cómo se tiene en cuenta la dispersión? ¿Puede alguien explicarlo?
 
Mepkypuu:

Pero, para ser sincero, no le entiendo como escribe:

Me parece que no entiendo su algoritmo; ¿cómo se considera allí el diferencial? ¿Alguien puede explicarlo?

OrderProfit() cuenta para las posiciones cortas en el Ask actual, aquí se tiene en cuenta el valor del spread actual. Si el spread no cambia, cuando el precio cambia de la Oferta actual a la nuevaSL el beneficio de un lote de la posición (ya sea de Compra o de Venta, con un signo apropiado) cambiará por el valor de delta, que se escribe en el operador:

delta = ( newSL - Bid ) * TickValue;

En resumen, OrderProfit() cuenta todo incluyendo los spreads. Fijamos el resultado para un momento determinado ( el precio actual) usando OrderProfit(). A partir de aquí, lo único que hay que hacer es vigilar la evolución de los precios.

 
Mislaid:

OrderProfit() se cuenta para las posiciones cortas en el Ask actual, aquí es donde se tienen en cuenta los valores del spread actual. Si el spread no cambia, cuando el precio cambia de la Oferta actual a la nuevaSL el beneficio de un lote de la posición (ya sea de Compra o de Venta, con el signo correspondiente) cambiará por el valor de delta, que se escribe en el enunciado:

delta = ( newSL - Bid ) * TickValue;

En resumen, OrderProfit() cuenta todo incluyendo los spreads. Fijamos el resultado para un momento determinado ( el precio actual) usando OrderProfit(). A partir de aquí, lo único que hay que hacer es vigilar la evolución de los precios.

Creo que empiezo a entenderlo, pero quizás sea más correcto:

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

El OrderProfit de las posiciones cortas se calcula a partir del precio Ask, ¿no es así?

Por cierto, MarketInfo( SymbolName, MODE_TICKVALUE) devuelve 329,02 para el par de divisas EURUSD, por eso esta función no me funciona correctamente.

 

Hasta ahora me he decidido por un truco, es decir, MarketInfo(SymbolName, MODE_TICKVALUE) para contar de forma diferente:

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

Hasta ahora me he decidido por un truco, es decir, MarketInfo(SymbolName, MODE_TICKVALUE) para contar de forma diferente:

La forma en que se escribió es correcta. Por cuánto se desplaza la Oferta, por cuánto se desplaza la Demanda, sin que se modifique el diferencial.
 
Mislaid:
La forma en que se escribió es correcta. Tanto como el Bid se mueve, tanto como el Ask se mueve, si el spread no cambia.

Por experiencia personal, el diferencial no suele cambiar y es bastante fuerte). Durante los movimientos bruscos he visto aumentar el diferencial de 8 a 80 puntos en un diferencial de cinco dígitos.
 
¿Es posible codificar (de forma fiable) un doble techo?
 
001:
¿Se puede codificar (de forma fiable) una tapa doble?
Es posible.
 

Al probar un Asesor Experto en el diario aparece un error

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Error 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Intentando abrir una orden de compra. Esperando una respuesta.

En consecuencia, los pedidos no se abren. ¿Cómo eliminar el error? ¿Cuáles son las razones?

Estaré encantado de ayudar.

 
alexey1979621:

Al probar un EA, aparece un error en el registro

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Error 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Intentando abrir una orden de compra. Esperando una respuesta.

En consecuencia, los pedidos no se abren. ¿Cómo eliminar el error? ¿Cuáles son las razones?

Estaré encantado de ayudar.

No se aclarará mucho sólo con los mensajes de la terminal, no te ayudará mucho si no publicas el código del EA. En alguna parte de tu matriz estás escribiendo un lote de datos inexistente, como uno de los supuestos, pero adivinar no es mi perfil.