12 12
发新话题
打印

[指标EA编写讨论] 各位老师请指教一个语句的使用

各位老师请指教一个语句的使用

我看资料说是开仓或修改或平仓的指令要紧跟一条Exit命令,以确保指令完成

可我怎么找不到这条Exit命令的具体用法?请指教谢谢

TOP

有几个学习mq4的困惑,请不吝赐教

1、变量用中文的话,会不会出错?

2、 for(int i = OrdersTotal (); i >= 0; i --) 和 for(int i = OrdersTotal () - 1; i >= 0; i --)的区别在哪里?怎么都能用啊?初始值后一个少1啊,请问怎么使用?

3、Point和MarketInfo(OrderSymbol(), MODE_POINT)的区别在哪里?虽然结果一样,但具体在哪里区别对待?

4、对定单的操作(如开仓、平仓、修改)怎么才能确保成功?虽然可以判断返回值,但是假如返回负值,怎么才能从新操作以便确保操作成功?

TOP

引用:
原帖由 cdf888 于 2007-11-4 11:31 发表
我看资料说是开仓或修改或平仓的指令要紧跟一条Exit命令,以确保指令完成

可我怎么找不到这条Exit命令的具体用法?请指教谢谢
我想原文的意思应该是对这三种指令的返回码进行判断。以确定指令正确执行。
即使没成功完成也要返回一个错误号码。
据我所知在mt4中没有你说的EXIT指令。

TOP

回复 2楼 的帖子

1、我用过中文变量,还未遇到问题,如果您不放心最好使用英文变量名。
2、后一个语句是对的。for(int i = OrdersTotal () - 1; i >= 0; i --)
     需要减一。OrdersTotal () 返回的是订单总数。但是其索引是从0开始的而不是1开始。因此遍历的时候是从0到(N-1)的遍历。而不是从0到N的遍历。用前面的语句一般不会出什么问题。因为当遍历N的时候找不到订单的。也就不能实行后续的操作。
3、Point只能取当前图表的小数位。而MarketInfo(Symbol(), MODE_POINT)可以取任何货币兑的小数位。只要将Symbol()换成相应的货币标示。(另:OrderSymbol()这个参量用在这里是错误的。这个是返回的订单的货币标记。而不是图表的货币标记。个人认为这里应该是图表的货币标示。Symbol())。
4、你可以循环开单直到成功为止。一般的处理是如果开单失败就停止操作打印错误。等待下一个报价再开新单。。

TOP

多谢指点

我有多明白了一些

TOP

//+------------------------------------------------------------------+
//|                                                  已开仓管理EA.mq4|
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Copyright Chendafa"
#property link      "http://dazhongtan.ys168.com"

extern double Get = 4;                        //盈利大于4点则设1点保护至少4点点差
extern double MinTakeProfit = 1;               
extern bool Alert_sound = true;               //语音报警开关
extern bool Auto_stp = true;                  //追踪止损开关
extern double OverTakeProfit = 24;            //获利大于24点开始追踪止损
extern double N = 15;                         //止损价距离极值价的差距(至少为15)

//+------------------------------------------------------------------+
//| 主代码                                                           |
//+------------------------------------------------------------------+

//bool OK = false; //全局变量,判断是否首次盈利>2点
//首次盈利大于2点,ok为ture,若盈利小于2且ok为ture,执行平仓操作

int start()
{
   string Text;
   for(int cnt=OrdersTotal() - 1; cnt >= 0; cnt --)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     {
      Text = OrderComment();
      double stp = OrderStopLoss();
      double tpt = OrderTakeProfit();
      double open = OrderOpenPrice();
      double sl,mstp;
      bool result = false;
      
      //追踪止损:只要赢利不断增加,就自动抬高止损价,尽可能多的让获利单奔跑
      
        if(OrderType() == OP_BUY)
         {
          if((Bid - open) / Point > OverTakeProfit * Point && Auto_stp == true)
          mstp = Bid - N * Point;
          if(mstp > stp)   //新的价格更具优势才修改
          result = OrderModify(OrderTicket(),OrderOpenPrice(),mstp,0,0,Green);
         Alert (result);
         }

        if(OrderType() == OP_SELL)
         {
          if((open - Ask) / Point > OverTakeProfit * Point && Auto_stp == true)
          mstp = Ask + N * Point;
          if(mstp < stp)   //新的价格更具优势才修改
          result = OrderModify(OrderTicket(),OrderOpenPrice(),mstp,0,0,Green);
          Alert (result);
         }
      
      //最小盈利保护:不允许盈利单变为亏损单

        if((OrderType() == OP_BUY) && (Bid - open) / Point > Get && (stp < open))
         {
          sl = open + MinTakeProfit * Point;
          result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
          if(Alert_sound == true) PlaySound("news");
         //---------------删除挂单
           for(int i = OrdersTotal () - 1; i >= 0; i --)
            {
             OrderSelect(i, SELECT_BY_POS);  
             if (OrderType () == 5 && OrderComment() == Text) //保证删除的是对应的挂单
             OrderDelete (OrderTicket ());
            }
         //---------------
         }
           
        if((OrderType() == OP_SELL) && (open - Ask) / Point > Get && (open < stp))
         {
          sl = open - MinTakeProfit * Point;
          result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
          if(Alert_sound == true) PlaySound("news");
         //---------------删除挂单
           for(int j = OrdersTotal () - 1; j >= 0; j --)
            {
             OrderSelect(j, SELECT_BY_POS);  
             if (OrderType () == 4 && OrderComment() == Text)  //保证删除的是对应的挂单
             OrderDelete (OrderTicket ());
            }
         //---------------
         }
      
                  
     }
   }
}

TOP

各位老师,上楼这个代码是我学习的作品,有个问题我实在是找不到原因:
就是单开的仓单是sell单时,这个ea会自动将止损修改为0,我从代码上却找不到原因,请帮忙看看谢谢!

TOP

回复 7楼 的帖子

有错误
1、(Bid - open) / Point > OverTakeProfit * Point 这个有问题。
同样的(open - Ask) / Point > OverTakeProfit * Point一样的问题。
两个值的数量级不同。去掉一个 Point 。
其他的没看。
你先修改下这个看看。空单的这个语句使得mstp = Ask + N * Point;语句不能执行。因此mstp始终不能赋值。

TOP

//+------------------------------------------------------------------+
//|                                                  已开仓管理EA.mq4|
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Copyright Chendafa"
#property link      "http://dazhongtan.ys168.com"

extern double Get = 4;                        //盈利大于4点则设1点保护至少4点点差
extern double MinTakeProfit = 1;               
extern bool Alert_sound = true;               //语音报警开关
extern bool Auto_stp = true;                  //追踪止损开关
extern int OverTakeProfit = 24;            //获利大于24点开始追踪止损
extern int N = 15;                         //止损价距离极值价的差距(至少为15)

//+------------------------------------------------------------------+
//| 主代码                                                           |
//+------------------------------------------------------------------+

//bool OK = false; //全局变量,判断是否首次盈利>2点
//首次盈利大于2点,ok为ture,若盈利小于2且ok为ture,执行平仓操作

int start()
{
   string Text;
   for(int cnt=OrdersTotal() - 1; cnt >= 0; cnt --)
   {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     {
      double stp = OrderStopLoss();
      double tpt = OrderTakeProfit();
      double open = OrderOpenPrice();
      double sl,mstp;
      bool result = false;
      
      //追踪止损:只要赢利不断增加,就自动抬高止损价,尽可能多的让获利单奔跑
      
      
      //最小盈利保护:不允许盈利单变为亏损单 )

        if((OrderType() == OP_BUY) && (Bid - open) / Point > Get && (stp < open))
        Text = OrderComment(); //返回当前选中定单的注释
        Print(Text);

          sl = open + MinTakeProfit * Point;
          result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
          if(Alert_sound == true) PlaySound("news");
         {
          for(int i = OrdersTotal () - 1; i >= 0; i --)
            {
             OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
             if (OrderType () == 5 && OrderComment() == Text) //保证删除的是对应的挂单
             OrderDelete (OrderTicket ());
            }
         }
           
         
        if((OrderType() == OP_SELL) && (open - Ask) / Point > Get && (open < stp))
        Text = OrderComment(); //返回当前选中定单的注释
        Print(Text);

          sl = open - MinTakeProfit * Point;
          result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
          if(Alert_sound == true) PlaySound("news");
         {
          for(int j = OrdersTotal () - 1; j >= 0; j --)
           {
            OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
            if (OrderType () == 4 && OrderComment() == Text)  //保证删除的是对应的挂单
            OrderDelete (OrderTicket ());
           }
         }
      

                  
     }
   }
}

TOP

我修改了,但是还是存在错误:
不能在盈利>4点后设置+1点保护,而且也不删除对应的挂单,请老师再帮忙看看谢谢

TOP

 12 12
发新话题