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

 
Vladimir Pastushak:
Como posso compreender programticamente o tipo de conta? Sebes ou redes?
   if(m_account.MarginMode()!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Alert("Only Hedging!");
      return(INIT_FAILED);
     }
 

Ou como este

AccountInfoSample

   m_label_info[3].Description(m_account.MarginModeDescription());

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//+------------------------------------------------------------------+
//|                                        MarginModeDescription.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;     // account info wrapper
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string Pr= m_account.MarginModeDescription();
   Alert(Pr);
  }
//+------------------------------------------------------------------+
 
Ajude-me a encontrar uma EA (script) que ou coloca uma grelha de ordens virtuais pendentes com parâmetros especificados, ou abre ordens (uma a uma) numa direcção especificada com um take especificado.
 

Por favor, digam-me onde reside o erro:

      for(int s=OrdersTotal()-1; s>=0; s--)          
         {
           if(o_orderInfo.SelectByIndex(s)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL_STOP)
             {                 
               count_sell_stop++;
             }
         }  

      for(int s1=PositionsTotal()-1; s1>=0; s1--)          
         {
           if(o_orderInfo.SelectByIndex(s1)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL)
             {                 
               count_sell++;
             }
         }  
         
      if(count_sell == 0 && count_sell_stop == 0)
         {
            sellstop_req3.action       = TRADE_ACTION_PENDING;
            sellstop_req3.symbol       = _Symbol;
            sellstop_req3.volume       = NormalizeDouble(lot_v, 2);
            sellstop_req3.price        = SymbolInfoDouble(sellstop_req3.symbol, SYMBOL_ASK) - 100*_Point;
            sellstop_req3.sl           = sellstop_req3.price + 110*_Point;
            sellstop_req3.type         = ORDER_TYPE_SELL_STOP;
            sellstop_req3.type_filling = ORDER_FILLING_RETURN;
            sellstop_req3.expiration   = ORDER_TIME_GTC;
            
            OrderSend(sellstop_req3, sellstop_res3);
         }
SELL_STOP - as encomendas são calculadas, mas a SELL não as quer. De acordo com o algoritmo, se não houver nenhum, a encomenda SELL_STOP é colocada, e se houver pelo menos um deles, a encomenda não é colocada.
 
Fergert Фергерт:

Por favor, digam-me onde reside o erro:

SELL_STOP - as encomendas são contadas, mas a SELL não quer. De acordo com oalgoritmo, se não houver nenhum, a encomenda SELL_STOP é colocada, e se pelo menos um deles estiver presente, nenhuma encomenda é colocada.

Não confundir a ORDEM LOCAL com a POSIÇÃO.

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
COrderInfo     m_order;                      // object of COrderInfo class
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count_buys          = 0.0;
   int count_sells         = 0.0;
   int count_buy_limits    = 0.0;
   int count_sell_limits   = 0.0;
   int count_buy_stops     = 0.0;
   int count_sell_stops    = 0.0;
//---
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
            count_buys++;
         else
            if(m_position.PositionType()==POSITION_TYPE_SELL)
               count_sells++;
        }
//---
   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.OrderType()==ORDER_TYPE_BUY_LIMIT)
            count_buy_limits++;
         else
            if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)
               count_sell_limits++;
            else
               if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
                  count_buy_stops++;
               else
                  if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
                     count_sell_stops++;
        }
//--- you code
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Arquivos anexados:
Script_1.mq5  5 kb
 
Vladimir Karputov:

Não confundir a PEDIDO REMOTO com a POSIÇÃO.

MUITO OBRIGADO)) Já está...
 
Não compreendo por que razão o parâmetro começa na segunda variante da função onCalculate é responsável.
Cada vez que a função onCalculate é chamada, é igual a 0.
Eu estava a produzir o valor de início através da função de impressão.
O livro de referência diz que o início é "de onde começam os dados significativos". Isto não me diz nada.
 
MisterRight:
Não compreendo que parâmetro começa na segunda variante da função onCalculate é responsável.
Cada vez que a função onCalculate é chamada, é igual a 0.
Eu fiz a saída do valor inicial através da função de impressão.
O livro de referência diz que o início é "de onde partem os dados significativos". Isto não me diz nada.

Verifique os códigos indicadores abertos de Exemplo.

 
Mikhail Mishanin:

Veja os códigos indicadores abertos de Exemplo.

Procurei. Começar sempre = 0.

Aqui, retirei um pedaço de código do indicador AMA

if(begin!=0)

PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA+begin);


E o que deverá este código dizer-me se a condição começar!=0 nunca é verdadeira?

 
Pode dizer-me o que devo usar para contar as encomendas fechadas na história. Experimentei-o assim:

HistorySelect(0,TimeCurrent());

Alert("Количество ордеров в истории:  ",HistoryOrdersTotal());
Acaba por dar algum disparate, muito mais do que ordens fechadas.