Ayuda con código mql5

 

Hola gente, quería ver si alguien podría ayudarme a resolver lo siguiente.
En una situación en la que hay una orden abierta, con un nivel de TP, y otra orden pendiente a la espera de ser tocada por el precio, quería saber cómo modificar el TP de la primera en el momento en que la segunda sea alcanzada y abierta. Los siguientes son dos fragmentos de código con los que trato de hacer eso de dos maneras diferentes, ambas sin éxito. Agradecería si alguien pudiese corregirme. Muchas gracias y un saludo!

El primero:

#include <Trade/Trade.mqh>
CTrade trade;

double Close[];
double Open[];
input double TP = 50;
input double lotaje = 0.1;
input int StartTradingHour = 8;
input int StartTradingMinute = 0;
input int EndTradingHour = 18;
input int EndTradingMinute = 0;



void OnTick()
{
    MqlDateTime time_now;
    TimeToStruct(TimeCurrent(), time_now);

    double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
    double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);

    bool orden_seleccionada = PositionSelect(_Symbol);
    bool tradea = true;

    if (orden_seleccionada == true)
    {
        tradea = false;
    }

    bool copia_close = CopyClose(_Symbol, PERIOD_CURRENT, 0, 10, Close);
    bool copia_open = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 10, Open);

    bool serie_open = ArraySetAsSeries(Open, true);
    bool serie_close = ArraySetAsSeries(Close, true);

    if (tradea == true && (time_now.hour >= StartTradingHour && time_now.min >= StartTradingMinute) && (time_now.hour <= EndTradingHour && time_now.min <= EndTradingMinute))
    {
        if (Close[2] < Open[2] && Close[1] > Open[1])
        {
            ulong buyticket = trade.Buy(lotaje, _Symbol, Ask, 0 , Ask + TP * _Point);
            trade.SellStop(lotaje, Bid - 50 * _Point, _Symbol, Bid - 25 * _Point, 0, ORDER_TIME_GTC, 0, 0);
            trade.PositionModify(buyticket, 0, TP-75);
        }
    }
}

El segundo:

#include <Trade/Trade.mqh>
CTrade trade;

double Close[];
double Open[];
double TP = 50;
input double SL = 25;
input double lotaje = 0.1;
input int StartTradingHour = 8;
input int StartTradingMinute = 0;
input int EndTradingHour = 18;
input int EndTradingMinute = 0;
double OpenPrice = 0;

ulong trade_ticket = 0;

void OnTick()
{

    if (PositionSelectByTicket(trade_ticket) == false && trade_ticket != 0) {
    
    trade_ticket = 0;
    
    } else if (trade_ticket !=0) {
      ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      double current_price = PositionGetDouble(POSITION_PRICE_CURRENT);
      double NewTP = 0;
     
      if(type == POSITION_TYPE_BUY && current_price == OpenPrice-50*_Point){ 
      
       NewTP = current_price+25*_Point;
          
       trade.PositionModify(trade_ticket, 0, NewTP);

    MqlDateTime time_now;
    TimeToStruct(TimeCurrent(), time_now);

    double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
    double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
    
    
    bool orden_seleccionada = PositionSelect(_Symbol);
    bool tradea = true;

    if (orden_seleccionada == true)
    {
        tradea = false;
    }

    bool copia_close = CopyClose(_Symbol, PERIOD_CURRENT, 0, 10, Close);
    bool copia_open = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 10, Open);

    bool serie_open = ArraySetAsSeries(Open, true);
    bool serie_close = ArraySetAsSeries(Close, true);

    if (tradea == true && (time_now.hour >= StartTradingHour && time_now.min >= StartTradingMinute) && (time_now.hour <= EndTradingHour && time_now.min <= EndTradingMinute))
    {
        if (Close[2] < Open[2] && Close[1] > Open[1])
        {
        
          OpenPrice = Ask
          
          trade.Buy(lotaje, _Symbol, Ask, 0 , Ask + TP * _Point);    

          trade_ticket = trade.ResultOrder();  
            
          trade.SellStop(lotaje, Bid - 50 * _Point, _Symbol, Bid - 25 * _Point, 0, ORDER_TIME_GTC, 0, 0);                 
             
         
          
                                     }
        
        
                           }
                      }
               } 

      }
      
 
Carlos Moya Corredera:

Hola gente, quería ver si alguien podría ayudarme a resolver lo siguiente.
En una situación en la que hay una orden abierta, con un nivel de TP, y otra orden pendiente a la espera de ser tocada por el precio, quería saber cómo modificar el TP de la primera en el momento en que la segunda sea alcanzada y abierta. Los siguientes son dos fragmentos de código con los que trato de hacer eso de dos maneras diferentes, ambas sin éxito. Agradecería si alguien pudiese corregirme. Muchas gracias y un saludo!

El primero:

El segundo:

Haces el cierre de la primera posición (la más antigua) cuando haya más de una abierta, yo lo utilizo para los cierres por señal opuesta. Algo así:

if(PositionsTotal()>1&&!trade.PositionClose(Ticket,ULONG_MAX)){ ... }

Esto lo tienes que meter en un loop interno que cuente desde la última posición para asegurarte de que te queda abierta sólo la nueva:

for(int i=PositionsTotal()-1;i>=0;i--){
        ulong Ticket=PositionGetTicket(i);
        ...

Espero que sirva.

Razón de la queja: