初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1225

 
Vitaly Muzichenko:

为所有。更确切地说,它在图表窗口中显示的 设置中指定的条数,而不取决于时间框架。

P.S. 我从来没有改变过这个值,但我刚刚检查了一下,发现它不能被设置为小于1000。

所以你需要用iBars()来检查?

 

下午好。脚本由于某种原因不能工作。

有什么问题呢?


//+------------------------------------------------------------------+
//|                                                         test.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"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   
   if(!ChartSetInteger(0,CHART_IS_MAXIMIZED,true))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      //return(false);
     };


  }
//+------------------------------------------------------------------+
 
与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。
 

朋友们好!

问题。

1.卖出止损 订单是放在经纪人那边还是放在终端那边?

2.当我关闭程序时,当条件得到满足时,这个订单是否会被触发?

MICEX股票市场 上交易。提前感谢您!

Акции: новости и аналитика фондовых рынков - Блоги трейдеров и аналитика финансовых рынков
Акции: новости и аналитика фондовых рынков - Блоги трейдеров и аналитика финансовых рынков
  • www.mql5.com
Акция — это ценная бумага, которая выпускается каким-либо предприятием (акционерным обществом) и дает ее владельцу права на получение части прибыли от этого предприятия в виде дивидендов. Также
 

下午好,亲爱的程序员们。关于MQL5的问题

如何在MetaTrader 5中实现仓位控制?我想在一个柱子上只有一个开仓,也就是说,无论在哪里--在哪个柱子上,这个仓位都应该被关闭,但开仓应该只在一个柱子上。

这段代码被完全忽略了。 什么是错误?

if (OrderSelect(HistoryDealsTotal()-1))

{
datetime Cu=PositionsTotal();
int hd=iBarShift(Symbol(),_Period,Cu);
if (hd<=1)
{
return;
}
}



Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Alexey Belyakov:

下午好,亲爱的程序员们。关于MQL5的问题

如何在MetaTrader 5中实现仓位控制?这意味着无论在哪里--在哪个柱子上--都会关闭头寸,但开仓应该只在一个柱子上。

最简单的方法是将开仓的时间保存在全局变量中,然后在开新仓时,检查开仓时间,如果该值高于保存值,则开仓。

 
Alexey Belyakov:

下午好,亲爱的程序员们。关于MQL5的问题

如何在MetaTrader 5中实现仓位控制?我想在一个柱子上只有一个开仓,也就是说,无论在哪里--在哪个柱子上,这个仓位都应该被关闭,但开仓应该只在一个柱子上。

这段代码被完全忽略了。 什么是错误?



错误:你把苍蝇和肉片搞混了--你把远程命令和位置搞混了。

为避免混淆,请阅读参考资料:《一般原则


上面的简单方法是,当你开仓时,记住当前栏的开仓时间。然后,如果你想建立一个新的头寸,你要检查保存的时间和当前栏的开仓时间。

OnTradeTransaction 中,存储开仓的时间是很方便的。

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
         return;
      if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic)
        {
         if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry()==DEAL_ENTRY_IN || m_deal.Entry()==DEAL_ENTRY_INOUT)
               m_last_deal_in=iTime(m_symbol.Name(),InpTimeFrame,0);
            int size_need_position=ArraySize(SPosition);
            if(size_need_position>0)
              {
               for(int i=0; i<size_need_position; i++)
                 {
                  if(SPosition[i].waiting_transaction)
                     if(SPosition[i].waiting_order_ticket==m_deal.Order())
                       {
                        Print(__FUNCTION__," Transaction confirmed");
                        SPosition[i].transaction_confirmed=true;
                        break;
                       }
                 }
              }
           }
        }
     }
  }

并对信号被触发的时间进行核对

//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignals(void)
  {
   if(m_prev_bars==m_last_deal_in) // on one bar - only one deal
      return(true);


例子取自OHLC检查2 的代码

Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит и...
 

不知为何,这有点棘手....。第一阶段没有问题,"记住当前酒吧 开放时间"

你去吧。

if (PositionsTotal()==1)  // Здесь проверяю, что открыта одна позиция
{
datetime Cu=iTime(NULL,_Period,0);        // Здесь в переменную - время открытия бара при открытой позиции

但在这里 "你检查保存的时间和当前酒吧的开放时间。"问题。

我也做过差不多的事,看看这个。

if (PositionsTotal()==1)  // Здесь проверяю, что открыта одна позиция (или была открыта, неважно, любое торговое действие)
{
datetime Cu=iTime(NULL,_Period,0);        // Здесь в переменную - время открытия бара при открытой позиции
int hd=+iBarShift(Symbol(),_Period,Cu)+1;    // Здесь в переменную - бар на котором произошло открытие позиции 
if (hd>=1)                                //Здесь проверяем - если этих баров, больше чем один, то.......   
{
return; //....то зацикливанием программу, НО проблема только в return
}
}

我在这里需要做的是循环 走动,如 "return(-1)",但我不能给return分配一个表达式,因为是空的。 我怎样才能绕过这个问题呢?如何循环但不返回?

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
 
datetime PR=iTime(NULL,_Period,0);  // проверяю время открытие бара
if (PositionsTotal()==1)  
{
datetime TK=iTime(NULL,_Period,0);  // время открытия бара при открытой позиции                        
if (PR==TK)                         // сравниваю
{
return(true);  // НЕ катит true - ошибка 
}
}


这也没有用。

 
Alexey Belyakov:

不知为何,这有点棘手....。第一阶段没有问题,"记住当前酒吧 开放时间"

你去吧。

但在这里 "你检查保存的时间和当前酒吧的开放时间。"问题。

我也做过差不多的事,看看这个。

我在这里需要做的是循环 走动,如 "return(-1)",但我不能给return分配一个表达式,因为是空的。 我怎样才能绕过这个问题呢?如何循环但不返回?

循环项目的治疗方法是将他们的手臂砍在脖子上。这样你将来就不必再这样做了。


这是你需要的东西--整个程序体,你只需要把信号接收正式化。

//+------------------------------------------------------------------+
//|                              Example One position on one bar.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\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\DealInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
CTrade         m_trade;                      // object of CTrade class
CSymbolInfo    m_symbol;                     // object of CSymbolInfo class
CDealInfo      m_deal;                       // object of CDealInfo class
//--- input parameters
input ulong    InpMagic             = 200;      // Magic number
//---
datetime m_prev_bars                = 0;        // "0" -> D'1970.01.01 00:00';
datetime m_last_deal_in             = 0;        // "0" -> D'1970.01.01 00:00';
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: CSymbolInfo.Name");
      return(INIT_FAILED);
     }
   RefreshRates();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==m_prev_bars)
      return;
   m_prev_bars=time_0;
   if(!RefreshRates())
     {
      m_prev_bars=0;
      return;
     }
//--- search for trading signals
   if(!SearchTradingSignals())
     {
      m_prev_bars=0;
      return;
     }
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
         return;
      if(m_deal.Symbol()==m_symbol.Name() && m_deal.Magic()==InpMagic)
        {
         if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry()==DEAL_ENTRY_IN || m_deal.Entry()==DEAL_ENTRY_INOUT)
               m_last_deal_in=iTime(m_symbol.Name(),Period(),0);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignals(void)
  {
   if(m_prev_bars==m_last_deal_in) // on one bar - only one deal
      return(true);
//--- signal
//---
   return(false);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
     {
      Print(__FILE__," ",__FUNCTION__,", ERROR: ","Ask == 0.0 OR Bid == 0.0");
      return(false);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+


变量'm_prev_bars'存储的是当前交易时段的开仓时间,变量'm_last_deal_in'存储的是开仓时的交易时段。

这两个变量在获取信号的区块"SearchTradingSignals"中被比较。

附加的文件: