初学者的问题 MQL4 MT4 MetaTrader 4 - 页 30

 
spoiltboy:

问候。我已经问过了,但还没有找到答案。请你用下面的条目告诉我原因

如果(x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}。

如果(z!=minpr1){z=minpr1;OrderDelete(ticketUP);}。

系统不断产生错误

: OrderDelete函数的无效票据

: OrderDelete错误4051

根据参考书,它是

函数参数的无效值

虽然参数似乎是一样的。

尽管如果你去掉这个条件,只留下

OrderDelete(ticketD)。

OrderDelete(ticketUP)。

它成功地删除了(但我需要按条件删除)。我做错了什么?这里是整个事情。

因为它必须通过OrderSelect来选择,你的ticketD 值就会丢失,很可能在那里代替ticket,一些yukhnya,尝试打印,并进行比较。总的来说,这种写作风格是无稽之谈。
 
Vitaly Muzichenko:
因为必须通过OrderSelect来选择,所以你的ticketD 值会丢失,很可能有一些废话来代替ticket,试着打印出来比较一下。

是不是因为删除函数是由值丢失的条件触发的?试着这样写。

如果(x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}。

OrderDelete(ticketUP)。

对 "ticketD "的未来条件写出同样的错误,而"ticketUP " 的订单每次打勾 时都被成功删除。

 
Vitaly Muzichenko:
而一般来说,这种写作风格是无稽之谈。
我才刚刚开始,欢迎评论。
 
spoiltboy:
我才刚刚开始,欢迎大家提出意见。
用 "SRC "粘贴代码,这样你就可以看到它了
 
Renat Akhtyamov:
通过 "SRC "插入代码,以便你可以查看
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0;


void OnTick()  
{
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);


double maxpr=-9999; double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}

int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:

是不是因为删除函数是由值丢失的条件触发的?试着这样写。

如果(x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}。

OrderDelete(ticketUP)。

当 "ticketD "的条件出现时,它写下了同样的错误,而"ticketUP " 的订单每一次打勾 时都被成功删除。

我们应该检查订单是否存在,如果有一张这样的票,我们就删除它;如果没有,我们什么也不做。发生的情况是,订单已经被删除,而你又不断地删除它
 
Vitaly Muzichenko:
我们应该检查订单是否存在,如果有一个这样的勾,我们将删除它,如果没有,我们将不做任何事情。现在的情况是,订单已经被删除了,而你又一直在删除它。

在这个条目中,带有ticketUP 的订单首先被打开,然后在每个tick 上被删除,而tikcetD的订单,如果发生相应的条件,会产生一个删除错误这是根据该杂志的说法。

或者,也许我混淆了什么?

 
spoiltboy:

但这两者的底线是否有可能是多余的?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);//лишняя?

如果不是多余的,删除的条件在哪里?

这是一个变种的代码,试图在每个tick 上删除一个挂单,因为我认为

而票据的编号也不清楚。

这就是会返回错误的原因。

 
spoiltboy:

在这个条目中,带有ticketUP 的订单首先被打开,然后在每个tick 上被删除,而tikcetD的订单,如果发生相应的条件,会产生一个删除错误这是根据该杂志的说法。

或者是我对某些事情感到困惑?

嗯,正确。

那么问题是什么呢?

 
Renat Akhtyamov:

嗯,这就对了。

那么问题是什么呢?

这是针对不同的订单。有条件删除一个,无条件删除另一个的功能。

问题是,为什么在我的例子中,删除函数在没有条件的情况下能成功工作,而如果我把它放在一个条件中,当条件出现时就会出现错误。