Opinión - EA muy exitoso - cuenta de $3000 a $6300 en dos semanas (podría haber sido $9000) - página 5

 

1 cosa rápida antes de ir a trabajar, hay variables booleanas que pueden ser verdaderas o falsas. no tienes que usar una cadena para eso.

Difícilmente se puede creer que estás siguiendo el libro

 
zzuegg:

1 cosa rápida antes de ir a trabajar, hay variables booleanas que pueden ser verdaderas o falsas. no tienes que usar una cadena para eso.

Es difícil creer que estás siguiendo el libro

Lo estoy intentando. Estoy aprendiendo a operar + programar + MQL al mismo tiempo.

¿Aprendes a conducir un coche sólo leyendo el libro?

pero gracias

 
MickGlancy:

Estoy recibiendo el error de que la función OpenBuyOrder y OpenSellOrder no devuelve ningún resultado

¿Qué estoy haciendo mal?

este error se debe a que las funciones OpenBuyOrder() y OpenSellOrder() no devuelven ningún resultado. las has definido como void, lo que significa que no devuelven ningún argumento, pero estás intentando devolver un entero (0).

aquí está el código con algunos comentarios:

void OpenBuyOrder( double StopLoss, double TakeProfit )
{
         int Ticket;			
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Ask-StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL>(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Ask+TakeProfit*Point;}
         else {TP=0;}
         
         Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,EAName,Magic,0,Blue);	//-- this stores the value for Ticket, but it never gets used.. 
                                                                                        //-- you can simply call OrderSend() without storing the result 

   return;    //--- void means the function returns no argument.. thus, no parentheses for return
}

void OpenSellOrder( double StopLoss, double TakeProfit)
{
         int Ticket;
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Bid+StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL<(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Bid-TakeProfit*Point;}
         else {TP=0;/*TPP=0;*/}
         
         Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,EAName,Magic,0,Red);
         
    return; 
}

Basado en tu función GetSignal, parece que quieres usar OpenBuy/SellOrder() para abrir una orden, en lugar de devolver algún argumento... He limpiado un poco tu función GetSignal() con algunos comentarios

void GetSignal(int MaxBuyOrders, double StopLoss, double TakeProfit) 		//--- Why make this function a bool??
{
   int Op_Buy,Op_Sell,Op_BuyStop,Op_SellStop,Op_BuyLimit,Op_SellLimit;
        
   int total = OrdersTotal();
  
   for(int x=total-1; x>=0; x--)
   {
      OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
      int type   = OrderType();
      bool result = false;    //-- not used anywhere??
      
      if (type==OP_BUY)       Op_Buy++;
      if (type==OP_SELL)      Op_Sell++;
      if (type==OP_BUYSTOP)   Op_BuyStop++;
      if (type==OP_SELLSTOP)  Op_SellStop++;         
   }
  
   int limit=1;		        //--- why define limit to 1 
   for(int i=1;i<=limit;i++)    //--- your for-loop will always run once, in which case why even have a for-loop?
   {
      double MA1=iMA(NULL,0,100,0,1,0,0);
      double MA2=iMA(NULL,0,100,0,1,0,1);
      double MA3=iMA(NULL,0,40,0,1,0,0);
      double MA4=iMA(NULL,0,40,0,1,0,1);
      
      bool BUY=false;   //-- as one guy mentioned better to go with booleans here
      bool SELL=false;

      if(MA1 < MA3 && MA2 > MA4) BUY=true;  
      if(MA1 > MA3 && MA2 < MA4) SELL=true;
      // missed out  && total == 0 for now
      bool SignalBUY=false;
      bool SignalSELL=false;
      
      if(BUY) //-- dont need to write == for bool's ..BUY is same as BUY==true, !BUY same as BUY==false
      if(ReverseSystem) SignalSELL=true;
      else SignalBUY=true;
      
      if(SELL)
      if(ReverseSystem) SignalBUY=true;
      else SignalSELL=true;
      
      if (SignalBUY && Op_Buy < MaxBuyOrders )   OpenBuyOrder(StopLoss,TakeProfit); 	//--- no need to return the return of OpenBuyOrder().. simply calling it will run the code
      if (SignalSELL && Op_Sell < MaxSellOrders) OpenSellOrder(StopLoss,TakeProfit);	//-- same
   }
   return;
}
 
supertrade:

este error se debe a que las funciones OpenBuyOrder() y OpenSellOrder() no devuelven ningún resultado. las has definido como void, lo que significa que no devuelven ningún argumento, pero estás intentando devolver un entero (0).

aquí está el código con algunos comentarios:

Basado en tu función GetSignal, parece que quieres usar OpenBuy/SellOrder() para abrir una orden, en lugar de devolver algún argumento... He limpiado un poco tu función GetSignal() con algunos comentarios

Eso explica toneladas, muchas gracias, lo estoy probando ahora

mi propio código está un poco desordenado porque básicamente estoy copiando de otros EAs y tratando de hacerlo funcionar.

 
no hay problema... no dudes en preguntar si te encuentras con otros problemas
 
void MoveTrailingStop()
{
   int cnt,total=OrdersTotal();
   for(cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL  &&  OrderSymbol()==Symbol() ) //&&  OrderMagicNumber()==Magic
      {
         if(OrderType()==OP_BUY)
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*(TrailingStop+TrailingStep),Digits)) || (OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
                  return(0);
               }
            }
         }
         else 
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+Point*(TrailingStop+TrailingStep),Digits)))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red);
                  return(0);
               }
            }
         }
      }
   }
}
supertrade
:

no hay problema... siéntase libre de preguntar si se encuentra con otros problemas

He recopilado muchos ejemplos de trailing stops, pero necesito uno que comience a recorrer inmediatamente los valores de -ve a 0, y luego se detenga como un break even.

Si se toma el precio de entrada al mercado y el stop loss es 100, cuando el precio se mueve a +25, el trailing stop se mueve a -75, y luego una vez que el precio llega a 100, el trailing stop se detiene en 0 y no se mueve más.

¿alguien podría ayudarme con esto? Me he pasado todo el día intentando que funcione y no puedo.

El precio de la compra de un producto es el mismo que el de la compra de un producto.

 

Pseudocódigo:

OrderSelect()

if (Buyorder and stoploss < openrice) : we need to trail
if (Sellorder and stoploss > openprice): we need to trail
if (we need to trail):
Modify Stoploss to Currentprice (+ or -) original stoploss
 

zzuegg

si(Buyorder y stoploss < openrice) : tenemos que hacer un seguimiento

¿no sería el stop loss siempre inferior al openprice, y viceversa?

Tengo la intención de utilizar eventualmente una función MaxLoss, por lo que no pondré un stop loss con el OrderSend.

si Op_Buy

si bid <= OpenOrderPrice()+(Trailing stop value) : trail -- una vez que bid > TSV no debería seguir moviéndose ?

y

si Op_Sell

si ask >= OpenOrderPrice()-(Trailing stop value): trail ?

Entonces, a un valor superior al Trailingstop, el Breakeven puede terminar el trabajo ?

 OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }
BTW thanks zzuegg, thats another order management milestone achieved. What can happen with a little help. I am gratefull.
 
MickGlancy:

zzuegg

si(Buyorder y stoploss < openrice) : tenemos que hacer un seguimiento

¿el stop loss no sería siempre inferior al openprice, y viceversa? No, sólo antes del punto de equilibrio

No creo que tu código funcione, parece que intentas hacer lo contrario...
 
zzuegg:
No creo que tu código funcione, parece que intentas hacer lo contrario...

no, funciona perfectamente. Permítanme comprobar que es el mismo ahora que en esa respuesta.

Es lo más cerca que puedo llegar a un compromiso de cerrar la brecha de pérdida detrás de un comercio en movimiento, pero todavía dándole espacio para respirar. Antes de esto, el comercio tuvo que llegar a 60 puntos antes de BE ocurrió así que hubo una gran cantidad de máximos parados a cabo los oficios, lo que causó mi drawdown a ser alta. espero que esto va a cambiar eso.

OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }