网格制作者1.1 - 页 3

 
再次问好

谢谢你的回答,我回家后会加你的。
 
我发现这段代码有时会出现问题,无法保持完美的网格(至少当我以回撤而不是突破网格的方式运行时)。 我见过洞的形成和不被更新,我见过网格有时不完全形成所有10个订单。 另外,它似乎不喜欢更新时间设置得很短,我不明白为什么。 似乎15分钟对于更新一个网格来说太长了(更像是15秒!),所以这是一个大问题。 如果你有这方面的经验,我将非常感激。 不过,能把这个事情办好,是件了不起的事情。 不错的工作。
 
索玛。

你是对的,有人向我指出了一个错误,似乎已经修复了。 这是新版本。我还将间隔时间改为1分钟--但我认为15至30分钟更好......这将避免市场真正快速移动时的一些反交易。

问候。

//+------------------------------------------------------------------+ //| MakeGrid.mq4 | //| Copyright © 2005, hdb | //| http://www.dubois1.net/hdb | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, hdb" #property link "http://www.dubois1.net/hdb" //#property version "1.4beta" extern string GridName = "Grid"; // 识别网格。允许几个并存的网格 extern double Lots = 0.1; // extern double GridSize = 6; // 订单之间的点数 - 网格或网格大小 extern double GridSteps = 12; // 下订单的总数 extern double TakeProfit = 6 ; // 获利的点数。通常是=网格大小,但你可以覆盖 extern double StopLoss = 0; // 如果你想添加止损。正常的网格不使用止损,而双倍的UpdateInterval = 1; //每隔x分钟更新一次订单 extern bool wantLongs = true; //我们是否需要多头头寸 extern bool wantShorts = true; //我们是否需要空头头寸 extern bool wantBreakout = true; //我们是否需要高于价格的多头,低于价格的空头 extern bool wantCounter = true; //我们是否需要低于价格的多头,高于价格的空头 extern bool limitEMA34 = false;      //我们是否希望多头只在ema以上,空头只在ema以下 extern double LastUpdate = 0; //用于记录最后一次更新时间的计数器 extern double GridMaxOpen = 0; //最大开仓数 //+------------------------------------------------------------------+ //|专家初始化函数 | //+------------------------------------------------------------------+ int init() { //---- #属性 show_inputs //显示参数 - 谢谢 Slawa...    
 if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; } //---- return(0); } //+------------------------------------------------------------------------+ //| 测试在atRate区域是否有未结头寸或订单 | //| 如果checkLongs为真将检查多头,否则将检查 | //| 短头 | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal( );
     for(int j=0;j<totalorders;j++) // 扫描所有订单和仓位。... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  //只看mygrid和符号...... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) //不看精确价格,但看价格的接近程度(小于网格大小) { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) { return(true); } } } 

   return(false); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- int i, j,k, ticket, entermode, totalorders; bool doit; double point, startrate, traderate; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // we update the first time it is called and every UpdateInterval minutes { LastUpdate = CurTime();
   Print("Updating"); point = MarketInfo(Symbol(),MODE_POINT); startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // 取整为可被GridSize划分的点数 k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point 。          //计算最低进入点 double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0); for( i=0;i<GridSteps;i++) { traderate = startrate + i*point*GridSize; if ( wantLongs && ( !limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == false )           // 测试我是否有接近我的价格的未结订单:如果有,就放一个 { double myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP; } 
              否则 { entermode = OP_BUYLIMIT ; } 
              
              如果((traderate > Ask ) && (wantBreakout))|| ((traderate <= Ask ) && (wantCounter)) ) 

              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); } } if ( wantShorts && ( ! limitEMA34 || traderate < EMA34)) { if ( IsPosition(traderate,point*GridSize,false)== false )           //测试我是否有接近我的价格的未平仓订单:如果有,就放一个 { myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } 
              否则 { entermode = OP_SELLSTOP ; } 
              
              如果 ( ( (traderate < Bid ) && (wantBreakout) )|| ((traderate >= Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); } } } return(0); } //+------------------------------------------------------------------+
 
谢谢,hdb。 但也许我没有完全理解你对网格的看法,因为我看不出更新过早会有什么不好的理由。 漏掉一个条目会使网格无法充分发挥其潜力。 当我手动运行它时,我在任何变化的时候都会更新订单。 我运行的是回撤网格,而不是突破网格,所以也许这就是差异所在,但是对于回撤,你会从波动中获利,所以保持网格没有漏洞是最理想的。
 
Soma,

是的,也许你是对的......所以最好是经常更新,但只有几个格子的位置。我没有强烈的意见。

参考资料。
 
好吧,我一直在等待一个有利的时机来发布网格的更新--因为它最近的表现真的很糟糕。
在我上次更新后的一周,我在度假,网格被停止。上周,电网大部分时间都在运行。
当利用保证金为零时,我关闭了几次,并在大多数主力上设置了 "只做多"。
今天是超级复出的一天。

余额 : 93 (自10天前起+10)
已用保证金 : +15k
可用保证金 : +28k
虚幻的P&L : -49k (自10天前起-11)
余额 : 44k

净值比10天前少了1千,比起始余额少了5千。

这一切真正困难的部分是试图限制缩减。我真的必须找到方法来做到这一点!
 
我认为避免下跌的唯一方法是使用酌情处理的方法
即知道何时停止增加订单,何时像你一样停止增加空头头寸。

在开始的时候,由于使用了过大的手数,被迫关闭了大量的头寸,导致了10万的余额。

余额:97 594.19 大约2周前的余额为83K
自由保证金: 6 016.88
浮动盈亏:-38 960.45和-56000一样糟糕
保证金:52 616.86

在过去的几天里,保证金水平一直非常缓慢,低至93%。

但现在,所有的主力似乎都在疯狂的转身,目前
保证金水平回升到130%左右
 
同意,darkstonexa,我认为你可能是对的 - 但我正在测试一些基于EMA和MACD 的自动变化......虽然我不是很乐观。

我的一个朋友也有一个带止损的自动交易系统......而且它正在努力保持浮动!但这确实解决了缩减的问题!

同时,我清理了我的头寸--所有带有强烈的负结转利息且亏损严重(几百点)的头寸都被关闭。

因此,我的网格现在已经准备好迎接另一次打击(保证金契约为430%)!
 
我们度过了多么美好的两天啊......在经历了几周的灾难性交易后,昨天我的网格又增加了5千的绿色(资产是54千,我从49千开始)。

幸运的是,我们可以在模拟账户 上进行尝试!

现在我回到了一个 "合理 "的位置,我把所有的货币对都设置成了以下情况。
1)只在正利差的方向上交易(除非利差接近0,否则就双向交易)。
2)只在34ema以上做多,只在34ema以下做空
3)对于双向货币,使用5分钟图上的macd来决定是做多还是做空。

我们将看看这能带来什么!

ps.我希望后面的测试能起作用!
 
你好,hdb。

我在欧元兑美元上使用了您的顾问,交易双方都是突破性的。

现在我想问问您,您是否已经遇到了以下问题。

一段时间后,我在一些相同的网格位置上有一个以上的订单。有时是两个,但我也见过5个或更多。

就我对代码的理解而言,一个网格位置上一次只能有一个订单开放。

在比较之前,我已经把所有的双数转换成了英数,因为在MQL2中,我发现在比较双数值时有类似的问题。

你是否遇到过类似的情况?

请注意。

cori