新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1347

 

我无法完成专家顾问的工作。其本质很简单--首先我画一个矩形,这是一个买入触发器,以防价格进入其区域,然后我画第二个--当价格到达那里时,交易应该被关闭。

但相反的情况发生了--价格开始在该区域内开盘和收盘。我做错了什么?


//+------------------------------------------------------------------+

//| RECTANGLES OP_BUY.mq4|

//+------------------------------------------------------------------+

#财产版权""

#属性链接""

#财产版本 "1.00"

#属性严格


外置 int Magic = 777701;

外来的双数Lot = 0.01。

外置 int Slippage = 3;



int票。

int OrderOfSymbol;




//+------------------------------------------------------------------+

//|专家初始化功能|

//+------------------------------------------------------------------+

int OnInit()

{

//---

return(INIT_SUCCEEDED)。

}

//+------------------------------------------------------------------+

//|专家去初始化函数|

//+------------------------------------------------------------------+

空白的OnDeinit(const int reason)。

{

//---

}

//+------------------------------------------------------------------+

//|专家勾选功能|

//+------------------------------------------------------------------+

空白的OnTick()

{

//---

//检查一个矩形

如果(ObjectsTotal(OBJ_RECTANGLE)==0)

{Comment("画一个矩形 来开一个买入交易!");}。


//获得该矩形的NAME。

for(int n=0;n<ObjectsTotal();n++)

{

string name=ObjectName(n)。

如果(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1a = (datetime) ObjectGet(name,OBJPROP_TIME1);

datetime t2a = (datetime) ObjectGet(name,OBJPROP_TIME2);


double p1a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits)。

double p2a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits)。

OrderOfSymbol=CounterOrderTradeType(-1)。

如果(OrderOfSymbol<1)

如果(Close[1]>Open[1])。

如果(TimeCurrent()>t1a && TimeCurrent()< t2a &&)

出价 < p1a && 出价 > p2a )

{

ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "open buy order", Magic, 0, Blue);

}

}

}

//检查是否已经有了第二个矩形

如果(ObjectsTotal(OBJ_RECTANGLE)==1)

{Comment("绘制第二个矩形 来关闭买入交易!");}。


//获得该矩形的NAME。

for(int n=0;n<ObjectsTotal();n++)

{

string name=ObjectName(n);

如果(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1b = (datetime) ObjectGet(name,OBJPROP_TIME1);

datetime t2b = (datetime) ObjectGet(name,OBJPROP_TIME2);


double p1b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits)。

double p2b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits)。


如果(TimeCurrent()>t1b &&TimeCurrent()< t2b &&)

出价 < p1b && Bid > p2b )

CloseBuyPositions1()。

}

}

//检查是否已经有了第二个矩形

如果(ObjectsTotal(OBJ_CHANNEL)==2)

{Comment("买入订单的开仓和平仓区域已设定--交易开始了!");}。


}

//+------------------------------------------------------------------+

空白的CloseBuyPositions1()。

{

for(int i = OrdersTotal() - 1; i >= 0; i--)

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

如果(OrderMagicNumber() == Magic)

如果(OrderSymbol() == Symbol())

{



如果(OrderType()==OP_BUY)

{

如果(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close"); }

}

}

}

//+------------------------------------------------------------------+

//| 顺序计数|

//+------------------------------------------------------------------+

int CounterOrderTradeType(ENUM_ORDER_TYPE order_type)

{

int cnt=0。

//----

for(int pos=OrdersTotal()-1;pos>=0;pos--)

{

如果(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) 继续。

如果(OrderSymbol()!=_Symbol)继续。

如果(order_type == OrderType() || order_type == -1) cnt++;

}

//----

return(cnt)。

}

 
Порт-моне тв:

有一个功能是用来发布这样的代码的,这将使大家更容易读到你的代码,以提供帮助。

 
MakarFX:

有一个发布这样的代码的功能,这将使大家更容易读到你的代码来帮助。

这对他没有帮助。空白的线条只有像他这样的人才能读懂。

 

Порт-моне тв:

我做错了什么?

广场的名称没有唯一性,你有任何广场作为买卖的条件。

 
Порт-моне тв:

这也将帮助你


 

请告知如何纠正这一错误

//+------------------------------------------------------------------+
#property copyright   "Copyright 2020,"
#property version     "1.0"
#property strict

//--- Inputs
int   side_position                    = 1;
input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 
input ENUM_BASE_CORNER  CornerInfo1    = CORNER_LEFT_UPPER; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(side_position == 2)
   {
   CornerInfo  = CORNER_RIGHT_LOWER; 
   CornerInfo1 = CORNER_LEFT_LOWER;
   }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

这里有一个错误

'CornerInfo' - constant cannot be modified      Wa.mq4  22      1
'CornerInfo1' - constant cannot be modified     Wa.mq4  23      1
2 errors, 0 warnings            3       1
 
Forallf:

谢谢你!

不客气 )

MakarFX:

你能告诉我如何纠正这个错误吗?

这里有一个错误

输入变量 不能被改变。

你可以这样做。

input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 

ENUM_BASE_CORNER  MyCornerInfo     = CornerInfo; 


.......

if(side_position == 2)
   {
   MyCornerInfo  = CORNER_RIGHT_LOWER; 



 
Aleksei Stepanenko:

不客气 )

输入变量 不能被改变。

你可以这样做。

谢谢,知道了。

 
MakarFX:

这也会帮助你。


它没有。我意识到,平方值并不是像它们应该的那样取自两个,而是取自最后一个。我不知道怎样才能打败它。我难道不会自己想出来吗。我不精通mql,这就是为什么我在这里问你,而你却给我提供梳子。

 
Порт-моне тв:

没有任何帮助。我意识到,平方值并不是像它们应该的那样取自两个,而是取自最后一个。我不知道怎样才能打败它。我自己也猜不到。我不精通mql,这就是为什么我问你,而你却给我提供梳子。

我为你提供梳子,使你的代码对那些你解决的人来说容易阅读(这里没有恶意)。

至于你的方块,为了正确识别它们,你需要了解它们的来源,即你画的或顾问画的。