查看完整版本: 各位老师请指教一个语句的使用

cdf888 2007-11-4 11:31

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

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

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

cdf888 2007-11-4 17:02

有几个学习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、对定单的操作(如开仓、平仓、修改)怎么才能确保成功?虽然可以判断返回值,但是假如返回负值,怎么才能从新操作以便确保操作成功?

xfxyldj 2007-11-5 00:02

[quote]原帖由 [i]cdf888[/i] 于 2007-11-4 11:31 发表 [url=http://www.onefx.net/bbs/redirect.php?goto=findpost&pid=142757&ptid=34086][img]http://www.onefx.net/bbs/images/common/back.gif[/img][/url]
我看资料说是开仓或修改或平仓的指令要紧跟一条Exit命令,以确保指令完成

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

我想原文的意思应该是对这三种指令的返回码进行判断。以确定指令正确执行。
即使没成功完成也要返回一个错误号码。
据我所知在mt4中没有你说的EXIT指令。

xfxyldj 2007-11-5 00:15

回复 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、你可以循环开单直到成功为止。一般的处理是如果开单失败就停止操作打印错误。等待下一个报价再开新单。。

cdf888 2007-11-5 05:12

多谢指点

我有多明白了一些

cdf888 2007-11-5 13:49

//+------------------------------------------------------------------+
//|                                                  已开仓管理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 ());
            }
         //---------------
         }
      
                  
     }
   }
}

cdf888 2007-11-5 13:52

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

xfxyldj 2007-11-5 16:29

回复 7楼 的帖子

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

cdf888 2007-11-5 17:53

//+------------------------------------------------------------------+
//|                                                  已开仓管理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 ());
           }
         }
      

                  
     }
   }
}

cdf888 2007-11-5 17:54

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

xfxyldj 2007-11-5 19:52

回复 10楼 的帖子

1、检查下你平台的止损止赢的要求。一般的平台要求止损止赢距离现价4个点以上才可以。出数据的时候要15个点。
2、对于删除订单。估计是这个语句OrderComment() == Text有问题。我没用过OrderComment() 不太了解其特点。有空试试。

zennchew 2007-11-26 00:51

趁机学习,谢谢。
页: [1]
查看完整版本: 各位老师请指教一个语句的使用