¿Quién puede ayudar con el robot, por qué no funciona? - página 3

 
Para GIM
Si sólo quiere abrir órdenes, entonces especifique 0 en lugar de SL / TP. Si el SL o el TP es 0, tendrá que introducir 0 en su solicitud, y si introduce un valor, tendrá que calcular el precio al que se cerrará la orden.
 
Dmitriy Gizlyk:
Para GIM
Si sólo quiere abrir órdenes, entonces especifique 0 en lugar de SL / TP. Y para el futuro, tiene que comprobar: si el SL o el TP es 0, entonces tiene que especificar 0 en la solicitud. Y si especifica un valor, entonces calcula el precio de cierre de la orden.
Me gustaría que el Asesor Experto abriera y cerrara las órdenes según el beneficio total para todas las operaciones....
 
AdikAmir:

extern double Lots=0.1;
extern intnal double FastMAPeriod=5;
extern int FastMAMethod=0; // 0-SMA, 1-EMA, 2-SMMA, 4-LWMA
extern int FastMAPrice=0; // 0-Cerrado, 1-Abierto, 2-Alto, 3-Bajo, 4-Media, 5-Típico, 6-Ponderado
extern int SlowMAPeriod=75;
extern intn SlowMAMethod=3; // 0-SMA, 1-EMA, 2-SMMA, 4-LWMA
extern int SlowMAPrice=3; // 0-Cerrado, 1-Abierto, 2-Alto, 3-Bajo, 4-Media, 5-Típico, 6-Ponderado
extern int TP=500; //sin ánimo de lucro
extern int SL=250; //parar la pérdida
doble ticet;

int inicio(){

double fast_ma1=iMA(NULL,0,FastMAPeriod,0,FastMAMethod,FastMAPrice,1);
double slow_ma1=iMA(NULL,0,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,1);
double fast_ma2=iMA(NULL,0,FastMAPeriod,0,FastMAMethod,FastMAPrice,2);
double slow_ma2=iMA(NULL,0,SlowMAPeriod,0,SlowMAMethod,SlowMAPrice,2);

if (OrdersTotal()==0)
{
if (fast_ma1>slow_ma1 && (fast_ma2<slow_ma2))
{ ticet = OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Ask-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE);
if (ticet==0) Print("ERROR");
}
if (slow_ma1>fast_ma1 && (slow_ma2<fast_ma2))
{
ticet = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Bid+TP*Point,NULL,0,0,CLR_NONE);
if (ticet==0) Print("ERROR");
}

}

return(0);
}




Lee el registro. Tal vez haya mensajes sobre errores que no se detectaron durante la compilación.

Hay un error aquí OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Bid+TP*Point,NULL,0,0,CLR_NONE);

tiene que hacer lo siguiente OrderSend(Symbol(),OP_SELL,Lots,Bid,Bid,3,Ask+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE);

Cuando vendes, el stop loss debe ser más alto que el precio actual y tomar uno más bajo. En tu caso, por el contrario, pones el stop por debajo del precio y tomas uno más alto.

 
GIM:
Me gustaría que el Asesor Experto abriera y cerrara las órdenes por ganancia total para todas las operaciones....

En este caso, al abrir una posición, ponga SL=0, TP=0.

Para cerrar una posición, necesitamos comparar el beneficio obtenido con el valor establecido en cada tick. Y cuando el beneficio alcanza el valor especificado, necesitamos cerrar todas las órdenes en el bucle a través de OrderClose(....).

En cuanto a la determinación del beneficio actual, puede haber variaciones en función de la tarea planteada. Si se mira el beneficio de la cuenta, se puede tomar simplemente AccountProfit(), pero la forma más laboriosa es probablemente a través de un bucle (entonces podemos calcular el beneficio sólo para las órdenes necesarias).

   double profit=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()== /* Ваш магик */)
        {
         profit+=OrderProfit()+OrderSwap()+OrderCommission();
        }
     }
 
Dmitriy Gizlyk:

En este caso, al abrir una posición, ponga SL=0, TP=0.

Para cerrar una posición, necesitamos comparar el beneficio obtenido con el valor establecido en cada tick. Y cuando el beneficio alcanza el valor especificado, necesitamos cerrar todas las órdenes en el bucle a través de OrderClose(....).

En cuanto a la determinación del beneficio actual, puede haber variaciones en función de la tarea planteada. Si se mira el beneficio de la cuenta, se puede tomar simplemente AccountProfit(), pero la manera más laboriosa es probablemente a través de un ciclo (entonces se puede calcular el beneficio de sólo las órdenes necesarias).

extern double  lots       = 0.01;
extern int  stop_loss      = 0;  
extern int take_profit    = 0;

int            last_bar       = 0;

int start(){
   if (last_bar == Bars) return(0);
   last_bar = Bars;
   if (OrdersTotal() == 0){
          OrderSend(Symbol(), OP_BUY, lots ,Ask, 50, Bid - stop_loss * Point, Ask + take_profit * Point,  "", 1, 0, clrBlue);
          OrderSend(Symbol(), OP_SELL, lots ,Bid, 50, Ask+ stop_loss * Point, Bid - take_profit * Point,  "", 1, 0, clrRed);      
}
   return(0); 
}
 double profit=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()== /* Ваш магик */)
        {
         profit+=OrderProfit()+OrderSwap()+OrderCommission();
        }
     }
 
GIM:
Si el stoploss y el take profit están en la moneda del depósito
extern double  lots       = 0.01;
extern int  stop_loss      = 10;  /* Указываем в валюте депозита */
extern int take_profit    = 20;   /* Указываем в валюте депозита */
extern int Magic          = 1;

int            last_bar       = 0;

int start(){
   if (last_bar == Bars) return(0);
   last_bar = Bars;
   if (OrdersTotal() == 0){
          OrderSend(Symbol(), OP_BUY, lots ,Ask, 50, 0, 0,  "", Magic, 0, clrBlue);
          OrderSend(Symbol(), OP_SELL, lots ,Bid, 50, 0, 0,  "", Magic, 0, clrRed);      
}
 double profit=0;
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()== Magic)
        {
         profit+=OrderProfit()+OrderSwap()+OrderCommission();
        }
     }
 int requot=0;
 if(profit>=take_profit || (-profit)>=stop_loss)
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()== Magic)
        {
         if(OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),50,clrRed))
               requot=0;
            else
              {
               requot++;
              }
         if(requot>10)
              {
               i++;
               requot=0;
              }
            i--;
        }
     }
   return(0); 
}
 
Dmitriy Gizlyk:
Si el stoploss y el take profit se especifican en la moneda del depósito

for(int i=0;i<TotalPedidos();i++)

Error: "i"

 
¿Quién sabe?
extern int Magic          = 1;


что означает??
 
GIM:
¿Quién sabe?

El identificador de las órdenes del Asesor Experto, para que sólo funcione con sus propias órdenes.

 
Vladimir Zubov:

El identificador de las órdenes del Asesor Experto, para que sólo funcione con sus propias órdenes.

¿Cómo que sólo con sus propias órdenes? ....