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

 
Alexey Kozitsyn:
而且需要检查的不是头寸或交易,而是订单,因为先有订单,后有交易,再有头寸。

为什么只有订单?交易不是有一个位置标识(门票)吗?

[删除]  
Alexey Viktorov:

为什么只有订单?交易不是有一个位置标识(门票)吗?

是的,你是对的。订单和交易都有一个位置标识符。然而,在一般情况下,我们应该知道,该位置被分配了一个启动交易的第一顺序的标识符。因此,启动头寸的 "实体 "是订单,而不是交易。而且,应该搜索的是订单,而不是交易。

来自文件。

职位标识符是一个唯一的数字,分配给每个新开的职位,在整个生命周期内不会改变。它与开仓时的订单票相对应。

仓位标识符在每个订单(ORDER_POSITION_ID)和每个开启、改变或关闭它的交易(DEAL_POSITION_ID)中被指定。使用此属性来搜索与头寸相关的订单和交易。

 
Alexey Kozitsyn:

是的,你是对的。订单和交易都有一个位置标识符。然而,一般来说,你应该知道,该头寸被分配给发起交易的第一个订单的标识符。因此,启动头寸的 "实体 "是订单,而不是交易。而且,应该搜索的是订单,而不是交易。

来自文件。

我不打算争论,这正是文件中所说的。但在同一文件的其他地方,它说"作为一项规则......",这意味着可能有不一致的地方。而这是我曾经遇到的 "作为一个规则"...

位置

的职位票。当一个职位 被改变和关闭 时,它应该被填入,以便其独特的识别。通常情况下,它与订单的票据相对应,因为它是开仓的结果。

我不记得了,而且我不太可能理解它,读了它,做了修改,然后忘记了。从那时起,我变得更加关注它。
 
Vitaly Muzichenko:
请告知如何取回用于交易的票据。在截图上,它是 "63214735"。

在这里,你要找的是交易列表中的位置编号,否则就是错误的

下面是一个演示 HistorySelectByPosition 带来的脚本

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

这就是结果的样子。

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = 打开位置

1 = 关闭位置

如果你没有得到它=你没有进入门票位置

如果你从 "交易票 "开始,也可以得到同样的结果。

对于HistoryDealGetInteger()函数

enum_deal_property_integer

识别器

描述

类型

折扣_TICKET

交易票。将分配给每个交易的唯一号码

购货订单

订单,交易是在此基础上执行的

折扣时间(DEAL_TIME

交易执行时间

日期时间

机会

从1970年1月1日开始的交易执行时间,单位为毫秒

种类:Deal_TYPE

交易类型

ENUM_DEAL_TYPE

帐户

交易方向--市场进入、市场退出或反转

enum_deal_entry

淘宝网

交易的神奇数字(见 ORDER_MAGIC

交易理由

交易的原因或来源

enum_deal_reason

交易_职位_ID

该交易所涉及的开仓、修改或平仓的标识符。 每个头寸都有一个独特的标识符,它被分配给该头寸有效期内的所有交易。

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

谢谢你!

我需要这个:HistoryOrderGetTicket

 
Vitaly Muzichenko:

谢谢你!

我需要这个:HistoryOrderGetTicket

该订单可以是1.0手。但它可能会被部分执行,例如0.9手 - 剩余部分将被拒绝(取决于执行模式)。当你开始搜索订单上的手数时,就会出现不一致的情况。

 

请帮助--我需要一些合理的代码来获得OHLC环境值--现有的代码非常慢。

选项1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


选项2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

请帮助--我需要一些合理的代码来获取OHLC环境值--现有的代码非常慢。

选项1


选项2

发布一个代码片段,展示你如何应用它。
 
Vitaly Muzichenko:
发布一段你如何应用它们的代码

我不知道哪一块的速度变慢了--我以不同的方式应用它们,包括在循环中...


这里有一个例子


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

我不知道哪一块的速度慢了--我以不同的方式应用它,包括在循环中...

在循环中似乎是这样的,你可以不使用函数

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }