Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 864

 
Vladimir Karputov:

Deve passar um PREÇO para a função, em torno da qual as ordens pendentes serão procuradas.

Para além deste preço, é necessário passar duas variáveis:

Desisto, tem um Expert Advisor pronto a fazer que mostra uma impressão dos preços das encomendas pendentes que mostrei com setas na imagem do ecrã?

Não compreendo porque é que esta função funciona sem passar nenhum preço.

int TotalGridBuyOrders=0;
         Print(__FUNCTION__);
         for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
            if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
               if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic && m_order.OrderType()==ORDER_TYPE_BUY_STOP)
                  TotalGridBuyOrders++;
         Print("Количество buy ордеров grid ",TotalGridBuyOrders);
         if(TotalGridBuyOrders>=1)
           {
            grid_buy_price_memory=m_order.PriceOpen();
            Print("Цена ближайшего buy grid ордера: ",grid_buy_price_memory);

???

 
ilyav:

Desisto, não têm um Expert Advisor pronto a imprimir os preços das encomendas que mostrei com setas no ecrã?

Dei-lhe uma função já pronta. É preciso passar nele:

  • o preço actual
  • uma variável na qual será escrito o preço da próxima paragem de compra
  • uma variável na qual será escrito o preço da próxima paragem da Venda

O que é que não compreende?

 
Estou a ver. Aparentemente, não é a minha onda.
 
ilyav:

Desisto, não tem um Expert Advisor pronto a imprimir os preços das encomendas pendentes que mostrei com setas no ecrã?

Não compreendo porque é que esta função funciona sem enviar qualquer preço.

???

Mostra código impraticável - pelo menos não compila - porque tem um desajuste de abrir e fechar parênteses. E em segundo lugar = lógica quebrada.

 
Vladimir Karputov:

Está a mostrar código impraticável - pelo menos não compila - porque tem um desajuste de abrir e fechar parênteses. E em segundo lugar = lógica quebrada.

Eu reescrevi o seu código.

Mas produz encomendas pendentes longe do preço

void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 
                 }
               Print("buy : ",price_nearest_buy_stop);
                return;  
              }
              
               
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 return;
              }
           }
  }
  
 
 
ilyav:

Eu reescrevi o seu código.

Mas dá pingentes mais longe do preço

As impressões devem vir após o laçoOrdersTotal.

E qual é o preço1? Como é que o obtém?
 

E, nesta versão, imprime todos os

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }
                 Print("buy : ",price_nearest_buy_stop);
                 
              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }
                 Print("sell : ",price_nearest_sell_stop);
                 
              }
           }
  }
 
Vladimir Karputov:

As impressões devem vir após o laçoOrdersTotal.

E qual é o preço1? Como é que o obtém?
//|  Выбран режим торговли 3 ? Тогда торгуем его    

      if(РежимТорговли==3)

        {

        price1=m_symbol.Bid();

        TradeMode3();

E no cabeçalho da EA, escrevi

double price1;
double price_nearest_buy_stop;
double price_nearest_sell_stop;

Se tudo estiver correcto, aqui está a variante final

//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void TradeMode3()
  {
   price_nearest_buy_stop  = 0;
   price_nearest_sell_stop = 0;
   double diff_buy_stop    = DBL_MAX;
   double diff_sell_stop   = DBL_MAX;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders
      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties
         if(m_order.Symbol()==m_symbol.Name() && m_order.Magic()==m_magic)
           {
            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
              {
               if(m_order.PriceOpen()-price1>0.0 && m_order.PriceOpen()-price1<diff_buy_stop)
                 {
                  diff_buy_stop           = m_order.PriceOpen()-price1;
                  price_nearest_buy_stop  = m_order.PriceOpen();
                 }

              }
            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
              {
               if(price1-m_order.PriceOpen()>0.0 && price1-m_order.PriceOpen()<diff_sell_stop)
                 {
                  diff_sell_stop          = price1-m_order.PriceOpen();
                  price_nearest_sell_stop = m_order.PriceOpen();
                 }

              }

           }
   Print("Цена ближнего SELL_STOP : ",price_nearest_sell_stop);
   Print("Цена ближнего BUY_STOP : ",price_nearest_buy_stop);
  }
//+------------------------------------------------------------------+

Tudo parece funcionar. Digam-me se há algum erro. Muito obrigado.

 

Por favor, ajude-me a resolver este problema.

Suponhamos que tenho um período de tempo actual M1, preciso de saber a hora da última barra N da barra dada de qualquer TF superior, a hora pode não ser 60 minutos, mas 45 ou qualquer outra hora, e para além de haver fins de semana, preciso de saber a data da última barra da TF actual de qualquer TF.

Como implementá-la?

 
ilyav:

E no cabeçalho do conselheiro diz

E se tudo estiver correcto, aqui está a variante final

Tudo parece funcionar. Digam-me se há algum erro. Muito obrigado.

Antes da linha

price1=m_symbol.Bid();

é necessário actualizar as citações:

if(!RefreshRates())
   return;