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

 

Hola a todos. Ayuda para entender esta situación.

por qué en un caso, testF2, cuando tomo Buf0[i]=iCCI(NULL,0,8,PRECIO_ABIERTO,i-1)-iCCI(NULL,0,8,PRECIO_ABIERTO,i); todo sucede genial como debería,

pero en otro caso, testF1, con las mismas acciones Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i); la última barra se colapsa... ¿por qué no ocurre con iCCI pero sí con iMA colapsado bar??????

¿Hay alguna forma de arreglarlo?

Archivos adjuntos:
testf1.mq4  1 kb
testf2.mq4  1 kb
 

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i);

para un yem en el infinito será lanzado al calcular -1 bar cuando i=0

es mejor así:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i+1);

y si necesitas un desplazamiento como en la variante que citaste de 1-n barra a la derecha, mejor impleméntalo explícitamente en el init mediante SetIndexShift(0,1);

 
ALXIMIKS:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i-1)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i);

para que el yem sea infinito se lanzará al calcular -1 bar cuando i=0

es mejor así:

Buf0[i]=iMA(NULL,0,8,0,MODE_EMA,PRICE_OPEN,i)-iMA(NULL,0,8,1,MODE_SMA,PRICE_OPEN,i+1);

y si necesitas un desplazamiento como en la variante que citaste de 1-n barra a la derecha, mejor impleméntalo explícitamente en el init mediante SetIndexShift(0,1);



Muchas gracias, pero lo entiendo todo perfectamente, pero ¿por qué está bien con iCCI y no con iMA?
 
       if ((NormalizeDouble(priceopen+start*Point,Digits)<=Bid)&&(NormalizeDouble(Bid-sl*Point,Digits)>NormalizeDouble(dist*Point,Digits)))
         {   
                sl=NormalizeDouble(Bid-dist*Point,Digits); 
Ekburg
:


esta no es la condición correcta. Se calcula la distancia desde el precio hasta el precio de la orden, y se necesita desde el precio hasta el stop actual)

Si un corto está en pie, entonces se dirige al primer bloque, si un largo está en pie, entonces se dirige al segundo bloque, y luego los trailing stops.

Si los cortos son buenos, entonces van al primer bloque, si son largos, entonces al segundo, después los cálculos, las comprobaciones y los trailing stops.


Todavía no puedo hacerlo... Sólo estoy probando largo, he probado tantas cosas que no recuerdo lo que he hecho))
 
clubsmi:


Muchas gracias, pero lo entiendo todo perfectamente, pero ¿por qué funciona con iCCI y no con iMA?


Hubo errores allí y allá, sólo que con iCCI no es obvio, debido a las peculiaridades de los cálculos,

y la aplicación de MAs, en particular EMAs, creo que conduce a su visibilidad.

 
vadynik:

todavía no sale nada... Sólo estoy probando largo, he probado tantas cosas, no recuerdo lo que he hecho))

poner OrderStopLoss() en lugar de sl
 
Vinin:

¿Vas a vivir de las propinas?
Hasta que sea un experto en esto.
Ahora no necesitas consejos, ¿verdad? :)
 

Hay un programa que abre dos órdenes de compra o venta, digamos para EURAUD y AUDUSD. El programa sólo funciona si no hay órdenes abiertas en el terminal para estos u otros pares. Si hay al menos una orden en el terminal, las operaciones no se abrirán. Mi pregunta es, ¿cómo programar la apertura de órdenes tanto si hay órdenes abiertas en el terminal como si no? Le agradezco de antemano su respuesta.

extern double lotAU=1.3;
extern double lotEA=1.0;
extern double Profit=30;
extern int Operation=0;
extern string Сomment           = "KVAZ";
extern int Magic                = 1111;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

double prof;
double bidEA = MarketInfo("EURAUD",MODE_BID);
double askEA = MarketInfo("EURAUD",MODE_ASK);
double bidAU = MarketInfo("AUDUSD",MODE_BID);
double askAU = MarketInfo("AUDUSD",MODE_ASK);

string symEA = "EURAUD";
string symAU = "AUDUSD";

for(int i=OrdersTotal()-1; i>=0; i--)
{
 OrderSelect(i,SELECT_BY_POS);
 prof=prof+OrderProfit();
 Print("Profit="+prof);
}
if(prof>=Profit)
{
 for(i=OrdersTotal()-1; i>=0; i--)
 {
  OrderSelect(i,SELECT_BY_POS);
  {
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,0);
  }
 }
}
if(OrdersTotal()==0)
{
 if(Operation==0)
 {
  OrderSend(symEA,OP_BUY,lotEA,askEA,3,0,0,"KVAZ",Magic,0,Blue);
  OrderSend(symAU,OP_BUY,lotAU,askAU,3,0,0,"KVAZ",Magic,0,Blue); 
 }
 if(Operation==1)
 {
  OrderSend(symEA,OP_SELL,lotEA,bidEA,3,0,0,"KVAZ",Magic,0,Red);
  OrderSend(symAU,OP_SELL,lotAU,bidAU,3,0,0,"KVAZ",Magic,0,Red);
 }
}  
   return(0);
  }
 
alexey1979621:

Hay un programa que abre dos órdenes de compra o venta, digamos para el EURAUD y el AUDUSD. El programa sólo funciona si no hay órdenes abiertas en el terminal para estos u otros pares. Si hay al menos una orden en el terminal, las operaciones no se abrirán. Mi pregunta es, ¿cómo programar la apertura de órdenes tanto si hay órdenes abiertas en el terminal como si no? Le agradezco de antemano su respuesta.


Retirar el cheque
if(OrdersTotal()==0)
 
evillive:

Retire el cheque
Sí, ahora lo hace, pero abre un montón de operaciones, mientras que yo sólo necesito dos operaciones para abrir en los pares especificados, digamos para EURAUD y AUDUSD.