Preço no Mini Índice

 
Olá pessoal,

eu comecei a desenvolver um sistema para colocar ordens limitadas no gráfico usando teclas de atalho, parecido com o sistema do TradeZone WebChart (Shift pressionado acima do ultimo preço cria-se uma ordem pendente de BuyStop, abaixo, uma ordem de BuyLimit - o mesmo esquema para SellLimit e SellStop porém com Control pressionado).

Toda essa parte de posicionar a linha no gráfico e enviar o preço para uma função especifica depois de soltar a tecla para abrir a ordem esta tudo certo, o único problema é o preço em si. O mini índice varia de 5 em 5 pontos enquanto o posicionamento da linha no MT5 é feito de 1 em 1 ponto.

Então eu gostaria de saber se há alguma forma de arredondar o preço obtido para o final 0 ou 5 antes de enviar a ordem.

Exemplo:

Preço da linha: 50113

Envio do preço para a bolsa: 50115 ou 50110 

 

//+------------------------------------------------------------------+
//|                                                         line.mq5 |
//|                                  Copyright 2016, EvandroTeixeira.|
//|                                   http://www.evandroteixeira.com |
//+------------------------------------------------------------------+
#property copyright                    "Copyright 2016, EvandroTeixeira."
#property link                         "http://www.evandroteixeira.com"
#property version                      "0.10"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }

//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
      datetime    dt;
      double      price;
      int         window         = 0;
      int         x              = (int)lparam; 
      int         y              = (int)dparam;
      double      askPrice       = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      double      bidPrice       = SymbolInfoDouble(Symbol(),SYMBOL_BID);
      string      nameLineBUY    = "BUYSTOPLIMIT";
      string      nameLineSELL   = "SELLSTOPLIMIT";
      bool        shiftPRESSED;
      bool        ctrlPRESSED;

      if(id==CHARTEVENT_KEYDOWN)
        {
         if(lparam==16)
           {
               shiftPRESSED = true;
           }else
              {
                  shiftPRESSED = false;
              }         

         if(lparam==17)
           {
               ctrlPRESSED = true;
           }else
              {
                  ctrlPRESSED = false;
              }
        }

         if(id==CHARTEVENT_MOUSE_MOVE)
           {
            if(shiftPRESSED)
              {
                  if(ChartXYToTimePrice(0,x,y,window,dt,price)) 
                          {
                              //---
                              ObjectDelete(0,nameLineBUY); 
                              //---
                              ObjectCreate(0,nameLineBUY,OBJ_HLINE,window,dt,price);
                                 if(ObjectGetDouble(0,nameLineBUY,OBJPROP_PRICE,0)>askPrice)
                                   {
                                       ObjectSetInteger(0,nameLineBUY,OBJPROP_COLOR,0,clrGreen);
                                       shiftPRESSED = false;
                                          if(sparam == IntegerToString(0))
                                               {
                                                   buyStop(price);
                                                   ChartRedraw(0);
                                               }
                                       ChartRedraw(0);
                                   }else
                                      {
                                          ObjectSetInteger(0,nameLineBUY,OBJPROP_COLOR,0,clrLightGreen);
                                          shiftPRESSED = false;
                                          if(sparam == IntegerToString(0))
                                               {
                                                   buyLimit(price);
                                                   ChartRedraw(0);
                                               }
                                          ChartRedraw(0);
                                      }
                              ObjectSetInteger(0,nameLineBUY,OBJPROP_SELECTABLE,false);
                              ObjectSetInteger(0,nameLineBUY,OBJPROP_WIDTH,1);

                              shiftPRESSED = false;
                              ChartRedraw(0);                         
                          }
                   ChartRedraw(0);
              }
//---
            if(ctrlPRESSED)
              {
                  if(ChartXYToTimePrice(0,x,y,window,dt,price)) 
                          {
                              //---
                              ObjectDelete(0,nameLineSELL); 
                              //--- 
                              ObjectCreate(0,nameLineSELL,OBJ_HLINE,window,dt,price);
                                 if(ObjectGetDouble(0,nameLineSELL,OBJPROP_PRICE,0)>bidPrice)
                                   {
                                       ObjectSetInteger(0,nameLineSELL,OBJPROP_COLOR,0,clrFireBrick);
                                       ctrlPRESSED = false;
                                          if(sparam == IntegerToString(0))
                                               {
                                                   sellLimit(price);
                                                   ChartRedraw(0);
                                               }
                                       ChartRedraw(0);
                                   }else
                                      {
                                          ObjectSetInteger(0,nameLineSELL,OBJPROP_COLOR,0,clrCoral);
                                          ctrlPRESSED = false;
                                          if(sparam == IntegerToString(0))
                                               {
                                                   sellStop(price);
                                                   ChartRedraw(0);
                                               }
                                          ChartRedraw(0);
                                      }
                              ObjectSetInteger(0,nameLineSELL,OBJPROP_SELECTABLE,false);
                              ObjectSetInteger(0,nameLineSELL,OBJPROP_WIDTH,1);

                              ctrlPRESSED = false;
                              ChartRedraw(0);                         
                          }
                   ChartRedraw(0);
              }
           }
  }
//+------------------------------------------------------------------+

void sellLimit(double priceSL)
   {
      Print("Sell Limit: "+DoubleToString(priceSL,Digits()));
   }

void sellStop(double priceSS)
   {
      Print("Sell Stop: "+DoubleToString(priceSS,Digits()));
   }

void buyLimit(double priceBL)
   {
      Print("Buy Limit: "+DoubleToString(priceBL,Digits()));
   }

void buyStop(double priceBS)
   {
      Print("Buy Stop: "+DoubleToString(priceBS,Digits()));
   }

 

Abraço!

 Evandro Teixeira. 


 
Evandro Teixeira:
Olá pessoal,

eu comecei a desenvolver um sistema para colocar ordens limitadas no gráfico usando teclas de atalho, parecido com o sistema do TradeZone WebChart (Shift pressionado acima do ultimo preço cria-se uma ordem pendente de BuyStop, abaixo, uma ordem de BuyLimit - o mesmo esquema para SellLimit e SellStop porém com Control pressionado).

Toda essa parte de posicionar a linha no gráfico e enviar o preço para uma função especifica depois de soltar a tecla para abrir a ordem esta tudo certo, o único problema é o preço em si. O mini índice varia de 5 em 5 pontos enquanto o posicionamento da linha no MT5 é feito de 1 em 1 ponto.

Então eu gostaria de saber se há alguma forma de arredondar o preço obtido para o final 0 ou 5 antes de enviar a ordem.

Exemplo:

Preço da linha: 50113

Envio do preço para a bolsa: 50115 ou 50110 

 

 

Abraço!

 Evandro Teixeira. 


Olá Evandro,

Uma solução para a situação apresentada é carregar as informações de book e usar os preços disponíveis para compra e venda, de uma olhada na estrutura MQL BOOK.

https://www.mql5.com/en/docs/marketinformation/marketbookget

Espero ter ajudado. 

Documentation on MQL5: Market Info / MarketBookGet
Documentation on MQL5: Market Info / MarketBookGet
  • www.mql5.com
Market Info / MarketBookGet - Reference on algorithmic/automated trading language for MetaTrader 5
 
Marcos Azevedo:

Olá Evandro,

Uma solução para a situação apresentada é carregar as informações de book e usar os preços disponíveis para compra e venda, de uma olhada na estrutura MQL BOOK.

https://www.mql5.com/en/docs/marketinformation/marketbookget

Espero ter ajudado. 

Olá Marcos,

essa solução parece perfeita :)

 

Obrigado pela ajuda!

 

Olá, gostaria de saber se alguma solução foi implementada, pois tenho testado um EA (tradexpert) para negociação manual, e ele parece apresentar o mesmo problema: funciona quando a execução é a mercado, 

porém, quando a ordem é do tipo stop/limit, somente funciona quando se acerta a pontuação com final 0 ou 5, no mais retorna INVALID PRICE. 

 
fasspa:

Olá, gostaria de saber se alguma solução foi implementada, pois tenho testado um EA (tradexpert) para negociação manual, e ele parece apresentar o mesmo problema: funciona quando a execução é a mercado, 

porém, quando a ordem é do tipo stop/limit, somente funciona quando se acerta a pontuação com final 0 ou 5, no mais retorna INVALID PRICE. 

Olá fasspa,

eu cheguei a essa solução...

void buyLimit(double priceBL)
   {
      double last = SymbolInfoDouble(Symbol(),SYMBOL_LAST);
      double resP = MathCeil(last-priceBL);
      double pricebuyLimit = last-((MathCeil(resP/5))*5);
      Print("Buy Limit: "+DoubleToString(priceBL,Digits())+"   "+MathCeil(resP/5)+"   "+pricebuyLimit);
      sendBL(pricebuyLimit);
   }

void buyStop(double priceBS)
   {
      double last = SymbolInfoDouble(Symbol(),SYMBOL_LAST);
      double resP = MathCeil(priceBS-last);
      double pricebuyStop= last+((MathCeil(resP/5))*5);
      Print("Buy Stop: "+DoubleToString(priceBS,Digits())+"   "+MathCeil(resP/5)+"   "+pricebuyStop);
      sendBS(pricebuyStop);
   }

Abraço!

 
Evandro Teixeira:

Olá fasspa,

eu cheguei a essa solução...

void buyLimit(double priceBL)
   {
      double last = SymbolInfoDouble(Symbol(),SYMBOL_LAST);
      double resP = MathCeil(last-priceBL);
      double pricebuyLimit = last-((MathCeil(resP/5))*5);
      Print("Buy Limit: "+DoubleToString(priceBL,Digits())+"   "+MathCeil(resP/5)+"   "+pricebuyLimit);
      sendBL(pricebuyLimit);
   }

void buyStop(double priceBS)
   {
      double last = SymbolInfoDouble(Symbol(),SYMBOL_LAST);
      double resP = MathCeil(priceBS-last);
      double pricebuyStop= last+((MathCeil(resP/5))*5);
      Print("Buy Stop: "+DoubleToString(priceBS,Digits())+"   "+MathCeil(resP/5)+"   "+pricebuyStop);
      sendBS(pricebuyStop);
   }

Abraço!

OK, vou estudar! Grato pela atenção! 
Razão: