Как начать работу с MQL5 - страница 13

 

Пример: форма короткого торгового запроса и форма полного торгового запроса

Код: Купить короткий код и полный код.mq5

//+------------------------------------------------------------------+
//|                                Buy Short code and  Full code.mq5 |
//|                              Copyright © 2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020, Vladimir Karputov"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
CTrade         m_trade;                      // trading object
//---
#property script_show_inputs
//--- input parameters
input group             "Trading settings"
input uint     InpStopLoss          = 150;         // Stop Loss
input uint     InpTakeProfit        = 460;         // Take Profit
input group             "Additional features"
input ulong    InpDeviation         = 10;          // Deviation
input ulong    InpMagic             = 200;         // Magic number
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   m_trade.SetExpertMagicNumber(InpMagic);
   m_trade.SetMarginMode();
   m_trade.SetTypeFillingBySymbol(Symbol());
   m_trade.SetDeviationInPoints(InpDeviation);
//--- Short code
   m_trade.Buy(0.01);
//--- Full code
   MqlTick last_tick;
   ResetLastError();
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print(Symbol()," ",last_tick.time,": Bid = ",last_tick.bid," Ask = ",last_tick.ask);
     }
   else
     {
      Print("SymbolInfoTick() failed, error = ",GetLastError());
      return;
     }
//---
   double sl=(InpStopLoss==0)?0.0:last_tick.ask-InpStopLoss*Point();
   double tp=(InpTakeProfit==0)?0.0:last_tick.ask+InpTakeProfit*Point();
   m_trade.Buy(0.02,Symbol(),last_tick.ask,sl,tp,"Full code");
  }
//+------------------------------------------------------------------+


Результат

 

Здравствуйте, мне нужна помощь в определении ChartID.

Я использую свой советник как сканер и использую функцию ChartOpen для получения экранированного символа, я хочу использовать вертикальные линии и линии тренда на этих графиках, но я не знаю, как получить ChartID. Я пробовал, и он продолжает добавляться к моему графику с советником.

 
Ahmad861:

Здравствуйте, мне нужна помощь в определении ChartID.

Я использую свой советник как сканер и использую функцию ChartOpen для получения экранированного символа, я хочу использовать вертикальные линии и линии тренда на этих графиках, но я не знаю, как получить ChartID. Я пробовал, и он продолжает добавляться к моему графику с советником.

Использовать ChartID

Documentation on MQL5: Chart Operations / ChartID
Documentation on MQL5: Chart Operations / ChartID
  • www.mql5.com
ChartID - Chart Operations - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Vladimir Karputov:

Используйте ChartID

Я попробовал, но он все равно будет рисовать линии на моем графике с советником, а не на только что открытом графике

 
Ahmad861 :

Я пробовал, но он все равно рисует линии на графике с советником, а не на только что открытом графике.

Если вы используете функцию ChartOpen, вы должны помнить: эта функция возвращает идентификатор открытого графика. Именно этот идентификатор нужно использовать для рисования на новом графике.

ChartOpen

Открывает новый график с указанным символом и периодом.
long  ChartOpen(
   string           symbol,     // Symbol name
   ENUM_TIMEFRAMES  period      // Period
   );

Параметры

символ

[in] Символ графика.NULL означает символ текущего графика (к которому привязан эксперт).

период

[in] Период графика (таймфрейм). Может быть одним из значений ENUM_TIMEFRAMES. 0 означает текущий период графика.

Возвращаемое значение

В случае успеха возвращает идентификатор открытого графика. В противном случае возвращается 0.

Примечание

Максимально возможное количество одновременно открытых графиков в терминале не может превышать значение CHARTS_MAX.

Documentation on MQL5: Chart Operations / ChartOpen
Documentation on MQL5: Chart Operations / ChartOpen
  • www.mql5.com
ChartOpen - Chart Operations - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Vladimir Karputov:

Если вы используете функцию ChartOpen, вам нужно помнить: эта функция возвращает идентификатор открытого графика. Именно этот идентификатор необходимо использовать для построения нового графика.

Я вообще об этом не подумал .все получилось, спасибо большое !!!

 

Расчет позиций и отложенных ордеров

Код: Calculate Positions and Pending Orders.mq5

//+------------------------------------------------------------------+
//|                       Calculate Positions and Pending Orders.mq5 |
//|                         Copyright © 2019-2020, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019-2020, Vladimir Karputov"
#property version   "1.003"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
COrderInfo     m_order;                      // object of COrderInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int buys=0,sells=0;
   int buy_limits=0,sell_limits=0,buy_stops=0,sell_stops=0;
   CalculateAllPositions(buys,sells);
   CalculateAllPendingOrders(buy_limits,sell_limits,buy_stops,sell_stops);
   string text="BUY: "+IntegerToString(buys)+", SELL: "+IntegerToString(sells)+"\n"+
               "Buy limits "+IntegerToString(buy_limits)+", Sell limits "+IntegerToString(sell_limits)+
               ", Buy stops "+IntegerToString(buy_stops)+", Sell stops "+IntegerToString(sell_stops);
   Comment(text);
//---
  }
//+------------------------------------------------------------------+
//| Calculate all positions Buy and Sell                             |
//+------------------------------------------------------------------+
void CalculateAllPositions(int &count_buys,int &count_sells)
  {
   count_buys=0;
   count_sells=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.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
            count_buys++;
         if(m_position.PositionType()==POSITION_TYPE_SELL)
            count_sells++;
        }
//---
   return;
  }
//+------------------------------------------------------------------+
//| Calculate all pending orders                                     |
//+------------------------------------------------------------------+
void CalculateAllPendingOrders(int &count_buy_limits,int &count_sell_limits,int &count_buy_stops,int &count_sell_stops)
  {
   count_buy_limits  = 0;
   count_sell_limits = 0;
   count_buy_stops   = 0;
   count_sell_stops  = 0;
   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()==InpMagic)
        {
         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++;
        }
  }
//+------------------------------------------------------------------+


Открытые позиции: GBPUSD BUY 0.03 лота и USDPLN SELL 0.01

Выставлены отложенные ордера: USDPLN Sell limit 0.01 и GBPUSD Buy limit 0.03


Рассчитать позиции и приказы по Пендонгу

 
ChartOpen() возвращает длинное значение, как я могу получить доступ к этому длинному значению, не выполняя ChartOpen(). Я запускаю советник с несколькими символами и несколькими таймфреймами на циклах
  string symbolarray[];
  ArrayResize(symbolarray,SymbolsTotal(true));
  for(int i=0;i<ArraySize(symbolarray);i++){
  for(int j=0;j<ArraySize(TF);j++){
  string sym=SymbolName(i,true);

  // Strategy Logic

  ChartOpen(sym,TF[j]);
 
Ahmad861 :
ChartOpen() возвращает длинное значение, как я могу получить доступ к этому длинному значению, не выполняя ChartOpen(). Я запускаю советник с несколькими символами и несколькими таймфреймами на циклах.

Используйте стайлер - вы сразу увидите свою ошибку:

string symbolarray[];
ArrayResize(symbolarray,SymbolsTotal(true));
for(int i=0; i<ArraySize(symbolarray); i++)
  {
   for(int j=0; j<ArraySize(TF); j++)
     {
      string sym=SymbolName(i,true);
      // Strategy Logic
      ChartOpen(sym,TF[j]);
      //+------------------------------------------------------------------+
 
Vladimir Karputov:

Используйте стайлер - вы сразу увидите свою ошибку:

Я не понимаю, Что вы имеете в виду?

Причина обращения: