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

 
danil77783:

你好。如果您有时间,能否帮助我? 问题是这样的,我需要EA在两个指标的每个信号上开一个订单,(当它们处于某种组合时,它们会给出一个信号)换句话说,应该有几个订单,根据指标的信号,在市场上买入 或卖出。但我在市场上只有一个订单,在它关闭之前,下一个订单没有打开......,这是一个计算订单的问题吗?请给我一个提示。如果你需要它,我可以把代码发给你。

提前感谢!

删除 "如果(OrdersTotal()==0).... "条件。- 他们只是说:搜索条目,只有在完全没有订单的情况下才开新单。

如果你不想在没有这样一个条件的情况下打开一大包新订单,你需要创建一个额外的条件。这取决于你的策略:是否在前一个订单的时间T内开立新的订单,或控制条形图,或在订单之间保持点数的距离......。

 

你好。我首先要说,非常感谢你对新手的帮助。我就不能日复一日地为自己回答一个又一个新手的基本问题。

而问题是这样的。

我以前认为,当mql4有点不同的时候,任何订单处理,比如开仓/平仓/修改后可能出现的错误应该被return(0)函数打断。 因为,如果我不得不在当前价格 关闭几个开仓订单,测试器会在每个新的柱子上逐一关闭它们,这可能会扭曲测试器中的真实情况(有时相当引人注目)(对于一个框架的每个刻度)。新的EA必须准确地通过信号和部分地关闭几个订单。

问题:是否有可能在一个循环中处理所有的(部分关闭),而不是每次都中断循环?测试人员是否能够处理?也就是说,它是否能够在一个柱子上部分关闭所有的柱子?

 
XpeHHukoB:

你好。我首先要说,非常感谢你对新手的帮助。我就不能日复一日地为自己回答一个又一个新手的基本问题。

而问题是这样的。

我以前认为,当mql4有点不同的时候,任何订单处理,比如开仓/平仓/修改后可能出现的错误应该被return(0)函数打断。 因为,如果我不得不在当前价格 关闭几个开仓订单,测试器会在每个新的柱子上逐一关闭它们,这可能会扭曲测试器中的真实情况(有时相当引人注目)(对于一个框架的每个刻度)。新的EA必须准确地通过信号和部分地关闭几个订单。

问题:是否有可能在一个循环中处理所有的(部分关闭),而不是每次都中断循环?测试人员是否能够处理?也就是说,它是否能够在一个柱子上部分关闭所有的柱子?

在一个小条件下,它可以做到没有任何问题。代码必须写得正确

 
Seric29:
如果有2个函数(可能是重载的),例如,int Funkz(int a) int Funkz(int a, int b, int w),然后程序被编译,哪个函数会工作得更快,第一个考虑到它有一个参数,或者这并不重要,因为程序已经建立,在正文中描述了什么,或者同样有一个小影响,因为函数参数 代表一个堆栈,内存被保留?

如果你有两个参数数不同的同名函数,那就不是哪一个会被更快地调用的问题了。 当你调用一个函数时,你不是写Funkz(),而是指定参数数。

问题是,编译器是否会把同名的函数嚼碎。

根据我的理解,我们不是在讨论代码,而是在讨论编译后的文件?

 
嗯...谢谢你的回答,阿列克谢。很多事情都已经弄清楚了。
 
请帮助,我们有SL等于一个以点为单位的值(这个损失水平--用户可调整的参数),我们有一个当天低点或高点的符号价格--这就像第二个止损,在不同的时间点,它们会有所不同,我需要自动比较功能--这样之后,机器人就会为最小的参数(SL或Ilow--用于买入或SL-iHign用于卖出)设置止损,下面是没有得到理想结果的代码,我不明白这是什么。..
   пользовательский параметр - extern int    SL               = 1000;
//---------------------------------------------------------------
bool CheckForStopLossSell()
  {
   double Hign=iHigh(Symbol(),PERIOD_D1,1);
   double StopLoss=NormalizeDouble(SL*Point,Digits);
   double uroven = StopLoss;
   double OOPS=iLow(Symbol(),PERIOD_D1,1)-StepOpenOrder*Point;
   double StopLossS=NormalizeDouble(OOPS+StopLoss,Digits);
   //----------------------------------------
   if(Hign>StopLoss) Alert("StopLoss");
   return bool(StopLossS);
   
   //else
   if(Hign<StopLoss) Alert("Hign");
   return bool(Hign); 
   
   //else
   Alert("uroven");
   return bool(uroven); 
   
  }
//--------------------------------------------------------------
bool CheckForStopLossBuy()
  {
   double LOW=iLow(Symbol(),PERIOD_D1,1);
   double StopLoss=SL*Point;
   double uroven = StopLoss;
   double SPREAD = MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double OOPB = (iHigh(Symbol(),PERIOD_D1,1)+SPREAD)+StepOpenOrder*Point;
   double StopLossB=OOPB-StopLoss;
   //-------------------------------------------
   if(LOW<StopLoss) Alert("StopLoss"); 
   return bool(StopLossB);  
   
   //else
   if(LOW>StopLoss) Alert("LOW"); 
   return bool(LOW);  
   
   //else
   Alert("uroven");
   return bool(uroven);  
   
  }
//---------------------------------------------------------------
 
XpeHHukoB:

如果你有两个参数数不同的同名函数,那就不是哪一个会被更快地调用的问题了。 当你调用一个函数时,你不是写Funkz(),而是指定参数数。

问题是,编译器是否会把同名的函数嚼碎。

你是指编译后的文件,而不是代码?

如果函数不同,那么哪一个在参数较少或较多的情况下会工作得更快?我认为用不同的数字进行超载也是一种负担,还是只是为了方便?

 

请告诉我如何写#define ?

我是这样写的

#define  my_POS    cst_Position.my_Position

如果我把这个结构改为def--一切都能正常工作。

my_POS.SelectByTicket(pos_DATA(DATA_TICKET))

但当我只写my_POS,函数列表不会在一个点之后弹出。

相同的是

#define  pos_DATA  cst_Position.getPositionData

pos_DATA(.)之后没有任何提示。

我做错了什么?

 
bool operation=0;for(int pos=0;pos<OrdersTotal();pos++)
     {if ( OrderSelect (pos, SELECT_BY_POS) == false )  continue;
      if ( OrderSymbol()==Symbol()) break;}


//=========================================================================================================
if(Hour()>=2&&Hour()<=18&&operation==0){
if(OPB1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)
        {OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-ss*Point,Ask+T*Point,"My order#",mn,0,Green);}}
        if (OrderType()==OP_BUY &&OrdersTotal()==1&&OrderMagicNumber()==8)
        {OrderSend(Symbol(),OP_SELLSTOP,5*lots,OrderOpenPrice()-(ss-ss/4)*Point,0,0,SstopClose,"My order#",80,0,Red);}
       

if(OPS1==1)
   {operation=1;if(operation==0 &&OrderSymbol()!=Symbol()||OrdersTotal()==0)        
         {OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+ss*Point,Bid-T*Point,"My order#",mn,0,Red);}}
         if (OrderType()==OP_SELL &&OrdersTotal()==1&&OrderMagicNumber()==8)
         {OrderSend(Symbol(),OP_BUYSTOP,5*lots,OrderOpenPrice()+(ss-ss/4)*Point,0,0,BstopClose,"My order#",80,0,Green);}}



if(OrderMagicNumber()==80){operation=0;
 {for( int  ii=OrdersTotal()-1;ii>=0;ii--)
       {OrderSelect(ii, SELECT_BY_POS);
        int  type   = OrderType();bool result = false;
        switch(type)
         {case OP_BUYSTOP   : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );//break;
          case OP_SELLSTOP  : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); //break;
         
          result = OrderDelete( OrderTicket() );//break;
          }}}}

亲爱的专家们,你们好!

请帮助我解决这个问题。

当测试任何货币对时,一切工作正常,但当与其他货币一起工作时,挂单 不被放置(我必须暴露挂单),并且在触发获利后不被关闭。

如果可能的话,请告知如何改变该代码。



非常感谢您的到来

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
附加的文件:
c5k8icfo.png  55 kb
 
Motzaart:

亲爱的专家们,你们好!

请帮助我解决这个问题。

...

请正确插入代码


原因: