错误、漏洞、问题 - 页 804

 

ilunga:

P.S. 我认为在我的(和你的)代码中bar_info[1]是当前条形的最大值,这样的假设是否正确?

没有人说过关于目前的酒吧。:)

我刚刚重新做了你的例子。 如果你想要的正是当前的酒吧,你必须这样做。

1.定义数组的方向(0条--当前或第一个)。

如果像我们的例子那样,数组被移出,你可以在初始化块中做一次。如果我们将数组隐藏在一个函数中,我们就地定义它。

2.如果数组被声明为一个系列,那么当前的条形将是0,而在它之前关闭的条形将是1。

至少在我的记忆中是这样。

 

我可能遗漏了什么,但为了在当前栏上打开(考虑到所有添加的内容),它应该是这样的。

将数组移到函数中去!

//Function BUY_pending
bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

double bar_info[1];

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of array
ArraySetAsSeries(bar_info,true);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,1,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
//Preparation of request
TradeRequest.type_filling = ORDER_FILLING_FOK;
TradeRequest.action       = TRADE_ACTION_PENDING;
TradeRequest.type         = ORDER_TYPE_BUY_STOP; 
TradeRequest.deviation    = 10;
TradeRequest.symbol = symbol;
TradeRequest.magic  = magic;
TradeRequest.volume = volume;
TradeRequest.price  = price;
TradeRequest.sl     = sl;
TradeRequest.tp     = tp;
//Checking
Result = OrderCheck(TradeRequest,CheckResult);

  if(!Result)
  //Print message for user
  {
  PrintFormat("retcode=%d",CheckResult.retcode);

  PrintFormat("%s %s at %G Ask=%G  Bid=%G  ",
              EnumToString(TradeRequest.type),symbol,TradeRequest.price,SymbolInfoDouble(symbol,SYMBOL_ASK),
              SymbolInfoDouble(symbol,SYMBOL_BID));                  
  Print("------------");
  }

  if((!Result)||(CheckResult.retcode!=0))return(false);
//OrderSend
Result = OrderSend(TradeRequest,TradeResult);
//Checking for presence of the errors
  if(_LastError!=0){Result = false;}
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
 
Interesting:

而且没有人说过关于现在的事情。:)

我刚刚重做了你的例子。 如果你需要当前的,你必须。

1.定义阵列系列的方向(0条-当前或最新)。

如果像我们的例子那样,数组被移出,你可以在初始化块中做一次。如果我们将数组隐藏在一个函数中,我们就地定义它。

2.如果数组被声明为一个系列,那么当前的条形将是0,而在这之前关闭的条形将是1。

至少在我的记忆中是这样。

我把数组扩大到3个元素。我得到了一个目前的价格 和里面的内容不匹配。这很可能就是原因。

#include <Trade\SymbolInfo.mqh>
double bar_info[3];

CSymbolInfo m_sym1;
CSymbolInfo m_sym2;

bool a;
int OnInit()
{
   SymbolSelect("EURUSD",true);
   SymbolSelect("GBPUSD",true);
   a = false;   
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
   if(ResCopy==-1)return;
   Print("bar_info[0] = " + DoubleToString(bar_info[0]));
   Print("bar_info[1] = " + DoubleToString(bar_info[1]));
   Print("bar_info[2] = " + DoubleToString(bar_info[2]));
   PrintFormat("Ask=%G  Bid=%G  ", SymbolInfoDouble("EURUSD",SYMBOL_ASK), SymbolInfoDouble("EURUSD",SYMBOL_BID));
}

结果(测试是在英镑兑美元上进行的)。

FR      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[0] = 1.29591000
LH      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OF      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   bar_info[2] = 1.29220000
QN      0       test3 (GBPUSD,H1)       13:12:59        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

我们得到的是,卖出价和买入价都大于零点的最大值,并且大于第二条杠的最大值。


如果我们在欧元兑美元上运行测试,一切都很好。

FL      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[0] = 1.29591000
LJ      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OP      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   bar_info[2] = 1.29220000
CO      0       test3 (EURUSD,H1)       13:21:09        2012.01.02 09:00:00   Ask=1.29241  Bid=1.2922  


我有一种感觉,在测试 "不是我的 "对的情况下,"条形信息已被更新,但还没有打勾"。

 
ilunga:

我已经把数组扩大到3个元素。我得到了当前价格 和数组内容之间的不一致。这很可能就是原因。

结果。

我们得到的结果是,卖出价和买入价都大于零柱最大值和大于第二柱最大值。

在你的代码中,你没有考虑数组的序列性。没有人能够保证,在这种结果下,0条不会在比如说2000年。

我给出了上面的代码,它适用于阵列变体中的所有TFs。

这个代码的存在是有原因的。

//Preparation of array
ArraySetAsSeries(bar_info,true);

如果你只需要一个日线时间框架(D1) 来识别条形的最大值,你根本不需要处理数组,只需将函数的第一部分改成这样就可以了

//Function BUY_pending
bool BUY_pending(string symbol,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
double High  = 0; //The maximum value of bid for the current day

int Dig     = 0; //Digits

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Calculations
High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);
Dig  = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(High + 500*_Point,Dig);
sl    = NormalizeDouble(price - 200*_Point,Dig);
tp    = NormalizeDouble(price + 1000*_Point,Dig);
 
Interesting:

你在代码中没有考虑数组的序列性。没有人可以保证在这个结果0吧不会在说2000年。

我给出了上面的代码,它适用于阵列变体中的所有TFs。

这个代码的存在是有原因的

ArraySetAsSeries只适用于动态数组
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Interesting:

你在代码中没有考虑数组的序列性。没有人能保证在这种结果下,0条不会在说2000年。

我给出了上面的代码,它适用于阵列变体中的所有TFs。

这个代码的存在是有原因的。

好的,让数组成为动态的。

#include <Trade\SymbolInfo.mqh>
double bar_info[];

CSymbolInfo m_sym1;
CSymbolInfo m_sym2;

bool a;
int OnInit()
{
   ArrayResize(bar_info, 3);
   ArraySetAsSeries(bar_info,ххх);
   SymbolSelect("EURUSD",true);
   SymbolSelect("GBPUSD",true);
   a = false;   
   return(0);
}

void OnTick()
{
   if (a) return;
   a = true;
   int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
   if(ResCopy==-1)return;
   Print("bar_info[0] = " + DoubleToString(bar_info[0]));
   Print("bar_info[1] = " + DoubleToString(bar_info[1]));
   Print("bar_info[2] = " + DoubleToString(bar_info[2]));
   PrintFormat("Ask=%G  Bid=%G  ", SymbolInfoDouble("EURUSD",SYMBOL_ASK), SymbolInfoDouble("EURUSD",SYMBOL_BID));
}

而不是xxx,我们把真和假。

其结果是。

FF      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[0] = 1.29220000
GL      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[1] = 1.29987000
OJ      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   bar_info[2] = 1.29591000
FR      0       test3 (GBPUSD,H1)       13:25:47        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

и

JP      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[0] = 1.29591000
PN      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[1] = 1.29987000
KD      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   bar_info[2] = 1.29220000
MP      0       test3 (GBPUSD,H1)       13:26:07        2012.01.02 09:00:00   Ask=1.29722  Bid=1.29709  

数组中的顺序被改变了,结果却没有。出价大于数组的最大[0]-条

 
ilunga:
ArraySetAsSeries只适用于动态数组

说实话,我不记得了。但是,我上面引用的那个代码的结果与我们得到的结果是一致的(欧元的开盘价为1.24516,英镑的开盘价为1.56721)。

High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);

尽管是的,在这一点上,没有ArraySetAsSeries也能正常工作。

//+------------------------------------------------------------------+
//Function BUY_pending
bool BUY_pending(string symbol,ENUM_TIMEFRAMES period,double volume,ulong magic = 0)
{
//----------------------------------------------------------------------------//
//Work variables
double price = 0, sl = 0, tp = 0; //Prices: Open, Sell stop, Take profit
int ResCopy = -1; //Result of copying the data into an array
int Dig     = 0;  //Digits

double bar_info[1];

bool Result = true; //Returned importance
//----------------------------------------------------------------------------//

ResetLastError();

//Checking the signal to stopping the trading system
  if(IsStopped()) return(false);
//Preparation of structures
ZeroMemory(TradeRequest);
ZeroMemory(TradeResult);
ZeroMemory(CheckResult);
//Copying the data into an array
ResCopy = CopyHigh(symbol,period,0,1,bar_info);

  if(ResCopy==-1)return(false); 
//Calculations
Dig   = (int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);

PS

也就是说,如果你想得到当前的条形图,你就不必要在这一行复制三个条形图到数组中。

//Это не правильно
int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,3,bar_info);
//так правильно
int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,1,bar_info);

//если PERIOD_D1 не меняется вот идеальный вариант
 High = SymbolInfoDouble(symbol,SYMBOL_BIDHIGH);
 
Interesting:

PS

也就是说,如果你需要获得当前的条形图,你绝对是徒劳的,在这一行中复制三个条形图到数组中

谢谢你!这个选项工作起来没有错误,在这种情况下是完全足够的。


然而,上面留下的问题是,竞标价怎么能大于最大值=(

 

ilunga:

然而,上面留下的问题是,出价如何能大于最大限度=(

首先,我们需要确定这个最大值是在哪个时期取得的。

如果数组被声明为double bar_info[n],那么其中的当前酒吧将是最大的索引。

如果n=2,这段代码将在昨天的日线上工作。

int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,2,bar_info);
price = NormalizeDouble(bar_info[0] + 500*_Point,Dig);

和这个带有当前栏的

int ResCopy = CopyHigh("EURUSD",PERIOD_D1,0,2,bar_info);
price = NormalizeDouble(bar_info[1] + 500*_Point,Dig);

也就是说,如果你复制了几个条形,你应该这样安排以获得当前条形(尽管你可能需要额外检查有多少条形 被复制到数组中)。

price = NormalizeDouble(bar_info[ResCopy-1] + 500*_Point,Dig);
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
Interesting:

首先要做的是定义这个最大值的期限。

如果数组被声明为double bar_info[n],那么其中的当前酒吧将是最大的索引

因此,在前一页有一段代码,其中有一个3个元素的数组。当用Prints输出时,我们得到Bid=1.29709,而bar_info[n-1]存储1.29220
原因: