Abrir la orden contraria - página 3

 
RaptorUK:

Puede ser si tiene un Número Mágico diferente alMagicNumber o es para un símbolo diferente al que está ejecutando el EA o si es un OP_SELLLIMIT u OP_BUYLIMIT . . también, necesita comprobar los valores de retorno de sus llamadas a OrderDelete() .

¿Por qué necesita llamar a RefreshRates()? No me refiero a deshacerse de ellos, pero ¿puede explicar por qué está llamando a RefreshRates() donde lo hace?


¿Qué son los valores de retorno de las funciones? ¿Cómo los utilizo?


Hola RaptorUK.

Por lo que entiendo el MagicNumber es el mismo y son OP_SELLSTOP y OP_BUYSTOP.

Las llamadas a OrderDelete() , me temo que no entiendo lo que quieres decir....

RefreshRates() lo acabo de poner después del problema con el cierre.

Ahora estoy en Lisboa (Portugal).

Luis

 
luisneves:


Hola RaptorUK.

Por lo que entiendo el MagicNumber es el mismo y son OP_SELLSTOP y OP_BUYSTOP.

Las llamadas a OrderDelete() , me temo que no entiendo lo que quieres decir....

Cuando llamas a OrderDelete() (usando la función OrderDelete()) devuelve un valor, devuelve un valor bool, si el valor es verdadero el OrderDelete() funcionó, si es falso el OrderDelete() falló . . así que compruebe el valor de retorno y si es falso reporte el error al registro usando Print() o use Comment() o Alert() para que sepa que tiene un problema y pueda investigarlo.

Basado en tu código yo haría estos cambios. . . si fuera mi código haría cambios adicionales para imprimir más información en caso de error, Bid, Ask, FreezeLevel, StopLevel, etc.

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

Cuando llama a OrderDelete() (usando la función OrderDelete()) devuelve un valor, devuelve un valor bool, si el valor es verdadero el OrderDelete() funcionó, si es falso el OrderDelete() falló . . así que compruebe el valor de retorno y si es falso reporte el error al registro usando Print() o use Comment() o Alert() para que sepa que tiene un problema y pueda investigarlo.

Basado en tu código yo haría estos cambios. . . si fuera mi código haría cambios adicionales para imprimir más información en caso de error, Bid, Ask, FreezeLevel, StopLevel, etc.


Hola RaptorUK,

La razón por la que la orden pendiente no se han eliminado tienen que ver con la toma de beneficios que era demasiado baja en este caso 5 pips. Mi confusión viene del hecho de que si tenía una rutina para poner el stoploss, el precio de apertura y la toma de beneficios fuera de la zona de congelación por qué esto no ha funcionado. Ok pero ahora esta funcionando.

Por cierto, quiero cerrar la orden contraria una vez que la otra se haya disparado, para ello he puesto este código extra pero (podéis empezar a reíros...) pero nada....

¿Alguien puede ayudarme?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


Hola RaptorUK,

1. La razón por la que la orden pendiente no se ha eliminado tiene que ver con la toma de beneficios que era demasiado baja en este caso 5 pips. Mi confusión viene del hecho de que si tenía una rutina para poner el stoploss, el precio de apertura y la toma de beneficios fuera de la zona de congelación por qué esto no ha funcionado. Ok pero ahora esta funcionando.

2. Por cierto, quiero cerrar la orden contraria una vez que la otra se haya disparado.para eso he puesto este código extra pero(puedes empezar a reirte...) pero nada....

¿Alguna ayuda?


1. Ah, por eso hay que comprobar los valores de retorno e imprimir los códigos de error, etc. Tienes que asegurarte de que cualquier acción comercial sobre cualquier Orden cumple con la información aquí:Requisitos y limitaciones en la realización de operaciones

2. Hay que esperar a que la Orden cambie de tipo de OP_BUYSTOP a OP_BUY, esto puede llevar algún tiempo, por lo que hay que seguir comprobando... una vez que se ha convertido en OP_BUY entonces puedes cerrar la Orden opuesta y para hacer eso vas a tener que encontrar la Orden correcta para cerrar. deberías leer mi reciente conversación conWhooDoo22 esa conversación cubre un tema similar.

 

Hola RaptorUk,

He seguido el enlace que me has proporcionado pero el tema aunque interesante, es demasiado largo y con tantas opiniones divergentes que me he perdido en ellas.

Así que, he introducido un código para cerrar el pendiente opuesto y de nuevo nada y no puedo ver nada en el diario que da una ayuda soever..... lo que me estoy perdiendo aquí ......

gracias por cualquier luz.....

Luis

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

Hola RaptorUk,

He seguido el enlace que me has proporcionado pero el tema aunque interesante, es demasiado largo y con tantas opiniones divergentes que me he perdido en ellas.

Así que, he introducido un código para cerrar la pendiente opuesta y de nuevo nada y no puedo ver nada en el diario que da una ayuda soever..... lo que me estoy perdiendo aquí ......

RaptorUK:

2. Tienes que esperar a que la Orden cambie de tipo de OP_BUYSTOP a OP_BUY, puede tardar algún tiempo,así que tienes que ir comprobando... una vez que se haya convertido en OP_BUY entonces puedes cerrar la Orden contraria y para ello vas a tener que encontrar la Orden correcta para cerrar.

 
RaptorUK:



Hola RaptorUK ,

Ok, ahora parece que está borrando laorden pendiente opuesta después de que un pendiente viene activado., pero ahora algunas órdenes vienen en dobles, lo que significa, el ea poner una venta y compra al mismo tiempo y el tamaño del lote es el mismo para las dos órdenes cuando se debe poner una orden de un tiempo. Empecé a conseguir crazy.....

¡¡¡¡Cualquier ayuda aquí, por favor!!!!

Archivos adjuntos:
 
luisneves:


Hola RaptorUK ,

Ok, ahora parece que está borrando la orden pendiente opuesta después de que un pendiente viene activado., pero ahora algunas órdenes vienen en dobles, lo que significa, el ea poner una venta y compra al mismo tiempo y el tamaño del lote es el mismo para las dos órdenes cuando se debe poner una orden de un tiempo. Empecé a conseguir crazy.....

¡¡¡¡Cualquier ayuda aquí, por favor!!!!

Mirando tu código me resulta muy difícil seguir lo que estás tratando de hacer, veo muy pocos comentarios para ayudarme, tu función start() no me muestra lo que estás tratando de hacer en cada tick, no tienes un diseño consistente de sangría.

¿Qué hace la función GoToClose()? si usted hizo algunos comentarios en el inicio de la función que describe lo que se supone que debe hacer entonces yo podría ver si realmente está haciendo lo que se supone que debe hacer, actualmente lo que hace es llamar a unCloseAll(); si cualquier operación que coincida con su Símbolo y Número Mágico está en beneficio por cualquier cantidad, o si tiene más de 7 operaciones para cualquier símbolo y cualquier Número Mágico. CloseAll() sólo cierra las operaciones parasu Símbolo y Número Mágico, por lo que si tuviera 7 operaciones para un Símbolo o Número Mágico diferente, GoToClose() seguiría llamando a CloseAll() y no pasaría nada más.


Si colocas una operación manual en tu cuenta Demo y luego ejecutas tu EA no haría nada... vería la operación pero no la ignoraría, la contaría y como resultado no colocaría una operación propia, ni cerraría esta operación abierta. ¿Qué debería hacer tu EA en esta situación? ¿qué pasaría si hubiera una operación colocada por otro EA con un Número Mágico diferente?

Necesita tener una imagen clara de lo que está tratando de hacer, comente su función start() para que el flujo y el proceso sean claros, comente cada función para que esté claro lo que cada una debe hacer.

 
RaptorUK:

Mirando tu código me resulta muy difícil seguir lo que intentas hacer, veo muy pocos comentarios que me ayuden, tu función start() no me muestra lo que intentas hacer en cada tick, no tienes un diseño consistente de sangría.

¿Qué debe hacer la función GoToClose()? si usted hace algunos comentarios al comienzo de la función que describe lo que se supone que debe hacer, entonces podría ver si realmente está haciendo lo que se supone que debe hacer, actualmente lo que hace es llamar a una funciónCloseAll(); si cualquier operación que coincida con su Símbolo y Número Mágico está en beneficio por cualquier cantidad, o si tiene más de 7 operaciones para cualquier símbolo y cualquier Número Mágico. CloseAll() sólo cierra las operaciones parasu Símbolo y Número Mágico, por lo que si tuviera 7 operaciones para un Símbolo o Número Mágico diferente, GoToClose() seguiría llamando a CloseAll() y no pasaría nada más.


Si colocas una operación manual en tu cuenta Demo y luego ejecutas tu EA no haría nada... vería la operación pero no la ignoraría, la contaría y como resultado no colocaría una operación propia, ni cerraría esta operación abierta. ¿Qué debería hacer tu EA en esta situación? ¿y si hubiera una operación colocada por otro EA con un Número Mágico diferente?

Necesitas tener una imagen clara de lo que estás tratando de hacer, comenta tu función start() para que el flujo y el proceso sean claros, comenta cada función para que quede claro lo que cada una debe hacer.


Hola RaptorUK,

Perdón por el lío. Hasta el momento parece que el EA está haciendo lo que uno espera de él excepto este tema;

El EA debería abrir una orden contraria cada vez que la orden anterior no tome el TakeProfit con un incremento de tamaño de lote y con la misma cantidad de TakeProfit y lo hace.El tema es que debe poner una sola orden a la vez y pone más de una. Mirando el informe se puede ver que la orden 6 y 7 son de venta y la orden 7 debería ser de compra.

Ahora he puesto el código por función. La razón por la que tengo todas esas llamadas nulas es que quiero tener un funcionamiento completo de bloques independientes y aquí sé que estoy con problemas para arreglar esto El Go to Open y go to Close es sólo una manera de decir si no tenemos órdenes abiertas los primeros van a abrir si no el ir a cerrar ( es un lío tengo que trabajar en esto...) Estoy usando el simbolo y el numero magico para garantizar que el ea solo se ocupe de sus propias ordenes.

La estrategia principal es (y los bloques son por esta orden);

1- Dos ordenes pendientes por encima y por debajo del precio. Una vez que el precio activa una de ellas se elimina la pendiente opuesta. Esto funciona.

2- Si el precio recoge el TakeProfit entonces la orden se cierra y el EA vuelve a poner dos órdenes pendientes y el proceso comienza de nuevo. Esto funciona

2- si el precio no escoge el TakeProfit y rebota una vez que baja el importe del TakeProfit (para las órdenes de compra) entonces se abre una orden de venta opuesta con el mismo importe de TakeProfit y con un tamaño de lote mayor que el anterior. Esto está funcionando excepto que pone más de una orden y en el informe se puede ver que las órdenes 6 y 7 son ambas de venta y debería haber sólo una, la 7 debería ser de compra.

3- Una vez que la última orden toma ganancias todas las órdenes abiertas deberían cerrarse. Y el proceso comienza a ganar. Esto está funcionando.

4- En este ping pong se debe esperar que como máximo en 7 ocasiones una orden recoja el TakeProfit si no entonces estas órdenes se cierran.

5-Para abrir la oportunidad de un aumento de los beneficios de un punto de equilibrio o beneficio mínimo trailing stop debe ser utilizado. por ejemplo, si queremos para TakeProfit 2 pips entonces esperamos a que el precio llegue a 3 pips y luego una de estas funciones (punto de equilibrio o beneficio mínimo trailing stop) poner una línea de parada en el nivel de 2 pips. Si el precio sube (para comprar) entonces la línea de parada irá con él y una vez que el precio rebote 1 pip la orden se cierra y porque tiene un beneficio todas las órdenes abiertas se cierran. Aquí no estoy seguro si esto puede funcionar correctamente.

Gracias

Luis

Archivos adjuntos:
 
luisneves:


Hola RaptorUK,

Perdón por el lío. Hasta el momento parece que el EA está haciendo lo que uno espera de él excepto este tema;

El EA debería abrir una orden contraria cada vez que la orden anterior no tome el TakeProfit con un incremento de tamaño de lote y con la misma cantidad de TakeProfit y lo hace.El problema es que debe poner una sola orden a la vez y pone más de una. Mirando el informe se puede ver que la orden 6 y 7 son de venta y la orden 7 debería ser de compra.

Ahora he puesto el código por función. La razón por la que tengo todas esas llamadas nulas es que quiero tener un funcionamiento completo de bloques independientes y aquí sé que estoy con problemas para arreglar esto El Go to Open y go to Close es sólo una manera de decir si no tenemos órdenes abiertas los primeros van a abrir si no el ir a cerrar ( es un lío tengo que trabajar en esto...) Estoy usando el simbolo y el numero magico para garantizar que el ea solo se ocupe de sus propias ordenes.

La estrategia principal es (y los bloques son por esta orden);

1- Dos ordenes pendientes por encima y por debajo del precio. Una vez que el precio activa una de ellas se elimina la pendiente opuesta. Esto funciona.

2- Si el precio recoge el TakeProfit entonces la orden se cierra y el EA vuelve a poner dos órdenes pendientes y el proceso comienza de nuevo. Esto funciona

2- si el precio no escoge el TakeProfit y rebota una vez que baja el importe del TakeProfit (para las órdenes de compra) entonces se abre una orden de venta opuesta con el mismo importe de TakeProfit y con un tamaño de lote mayor que el anterior. Esto está funcionando excepto que pone más de una orden y en el informe se puede ver que las órdenes 6 y 7 son ambas de venta y debería haber sólo una, la 7 debería ser de compra.

3- Una vez que la última orden toma ganancias todas las órdenes abiertas deberían cerrarse. Y el proceso empieza a ganar. Esto funciona.

4- En este ping pong se debe esperar que como máximo en 7 ocasiones una orden recoja el TakeProfit si no entonces estas órdenes se cierran.

5-Para abrir la oportunidad de aumentar el beneficio, se debe utilizar un break even o un trailing stop de beneficio mínimo. Por ejemplo, si queremos un TakeProfit de 2 pips, entonces esperamos a que el precio llegue a 3 pips y entonces una de estas funciones (break even o trailing stop de beneficio mínimo) pone una línea de stop en el nivel de 2 pips. Si el precio sube (para comprar) entonces la línea de parada irá con él y una vez que el precio rebote 1 pip la orden se cierra y porque tiene un beneficio todas las órdenes abiertas se cierran. Aquí no estoy seguro si esto puede funcionar correctamente.

Gracias

Luis

Ok, creo que he encontrado lo que está mal con la apertura de varias órdenes. Tuve queincluirlas en el código (Negrito Italic);

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


Falta el archivo del informe
Razón de la queja: