Como enviar ordem de compra a um preço específico

 

Caros,

gostaria de saber com enviar ordem de compra a um preco expecifico, exemplo, grafico de 5 Minutos, quando o last romper a barra anterior enviar ordem de compra na high da barra anterior, ja consequi fazer ele enviar a ordem, porem ele nao manda no preco que eu determinei.


exemplo

void OnTick()

  {
//---
 

   MqlTick latest_price;     // To be used for getting recent/latest price quotes
   MqlRates mrate[];         // To be used to store the prices, volumes and spread of each bar
   MqlTradeRequest mrequest;  // To be used for sending our trade requests
   MqlTradeResult mresult;    // To be used to get our trade results
   MqlTradeRequest mrequest2;  // To be used for sending our trade requests
   MqlTradeResult mresult2;    // To be used to get our trade results 

    int Mybars=Bars(_Symbol,_Period);
    
    if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
     if(CopyRates(_Symbol,_Period,0,3,mrate)<0)
     {
      Alert("Error copying rates/history data - error:",GetLastError(),"!!");
      return;
     }
   // the rates arrays
  // ArraySetAsSeries(mrate,true);
  // the MA-8 values arrays
      ArraySetAsSeries(maVal,true);
      if(CopyBuffer(maHandle,0,0,5,maVal)<0)
     {
      Alert("Error copying Moving Average indicator buffer - error:",GetLastError());
      ResetLastError();
      return;
     }
  
    //Print("Br Anterior High = " + string( mrate[1].high) + ", Br Ult. = " + string(latest_price.last)+ " DtHr = " + StringSubstr(string(latest_price.time) ,14,2) );
    // && int(StringSubstr(string(latest_price.time) ,14,2))> Hms
  
    Print("********************** "+string(maVal[0])+" **********************");
    //Ordem de Compra
    
    if( (latest_price.last > mrate[1].high) && (OC == 0) )//&& (latest_price.last > maVal[0] )  )
    {
         OC = 1;
         Hora_ = Mybars;
         Prc_Env = mrate[1].high;
         Print("********************** Ordem de Compra **********************");
         ZeroMemory(mrequest);
         mrequest.action = TRADE_ACTION_DEAL;                                // immediate order execution
         mrequest.price = mrate[1].high;          // latest ask price
         mrequest.sl =    NormalizeDouble(mrate[1].high - 500*_Point,_Digits); // Stop Loss
         mrequest.tp =    NormalizeDouble(mrate[1].high + 500*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                         // currency pair
         mrequest.volume = 5;                                            // number of lots to trade
         mrequest.magic = EA_Magic;                                        // Order Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                     // Buy Order
         mrequest.type_filling = ORDER_FILLING_FOK;                          // Order execution type
         mrequest.deviation=0;                                            // Deviation from current price
           if(OrderSend(mrequest,mresult) == false)
         {
          Alert("Error copying rates/history data - error:",GetLastError(),"!!");
          return;
         }
    }
    
        //Ordem de Venda
        
    if( (latest_price.last < mrate[1].low) && (OC == 1) && ( Mybars > Hora_) )
    {
         OC = 0;
         Hora_ = 0;
         Print("********************** Ordem de Venda ("+string(Prc_Env)+")**********************");
         ZeroMemory(mrequest2);
          mrequest2.action = TRADE_ACTION_SLTP;                   // setting the TP & SL
          mrequest2.symbol = _Symbol;                             // symbol
          mrequest2.sl = latest_price.last - 5 * _Point;        // Stop Loss
          mrequest2.tp = latest_price.last + 5 * _Point;        // Take Profit    
        if(OrderSend(mrequest2,mresult2) == false)
         {
          Alert("The order request could not be completed -error:",GetLastError()," with trade return code ",mresult.retcode);
          return;
         }                                         
         
    }
        if( ( latest_price.last > (Prc_Env+15) ) && (OC == 1) && ( Mybars > Hora_) )
    {
         OC = 0;
         Hora_ = 0;
         Print("********************** Ordem de Venda **********************");
         ZeroMemory(mrequest2);
          mrequest2.action = TRADE_ACTION_SLTP;                   // setting the TP & SL
          mrequest2.symbol = _Symbol;                             // symbol
          mrequest2.sl = latest_price.last - 5 * _Point;        // Stop Loss
          mrequest2.tp = latest_price.last + 5 * _Point;        // Take Profit    
        if(OrderSend(mrequest2,mresult2) == false)
         {
          Alert("The order request could not be completed -error:",GetLastError()," with trade return code ",mresult.retcode);
          return;
         }                                         
         
    }  
  }
 

Olá Mackson,

da próxima vez que postar partes de código no fórum, por favor use o botão SRC para que a formatação saia da maneira correta. Dessa vez eu faço pra você... :-)

 
macksonwilly:

Caros,

gostaria de saber com enviar ordem de compra a um preco expecifico, exemplo, grafico de 5 Minutos, quando o last romper a barra anterior enviar ordem de compra na high da barra anterior, ja consequi fazer ele enviar a ordem, porem ele nao manda no preco que eu determinei.


exemplo

Olá Mackson, você precisa definir antes o que exatamente você quer...

Se você pretende enviar uma ordem de compra para execução imediata, logo, usar a máxima da barra anterior pode lhe trazer problemas, uma vez que sua ordem pode ser rejeitada por estar fora do preço.

Entretanto, se você quiser colocar uma ordem pendente para ser executada na máxima da barra anterior, então o tipo de operação (no caso, você usou TRADE_ACTION_DEAL) deve ser alterado para que você possa colocar uma ordem pendente.

Logo, antes de colocar a ordem, é preciso de antemão saber se ela é do tipo pendente ou do tipo de execução imediata.

Espero ter ajudado.

Abraços,
Malacarne 

Razão: