专家顾问 - 杂项问题 - 页 23

 

我推荐它。

当你解决了所有这些问题时,你就可以认为自己是专家了。

尽可能让事情变得更难,那么你将学到最多的东西。

否则你会一直在简单的事情上挣扎。

 

首先,非常感谢您的评论。

在你的评论之后,我决定我应该再次创建订单修改代码块,以确定和测试。

 

@Marco vd Heijden 先生

在你最伟大的评论/例子之后--我已经为止盈价格的拖曳写了一段代码。
但实际上我反对持续更新。为什么?因为我为获利拖动写了代码块,我看到我的图表变得缓慢。也许我在这部分的代码中犯了错误。我将在解决这个问题后检查它。

(当我试图自己解决我的问题时,在我尝试了几次之后,我只是认为如果我使用 "for "循环操作,就没有机会停止计算)

想说的是,我已经计算了止盈和止损的大小,所以我从下面的代码中删除了 "开关 "操作。
我只是在尝试当获利价格等于 "线 "价格时--然后停止计算/更新,直到下一次获利价格"!="线价格。
问:我
很难纠正下面的代码,因为我担心。那么,我可以做些什么呢,请问?
问: 我是否做错了,我没有使用 "切换 "操作符来处理这个问题?

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
           {
            if(Symbol()==OrderSymbol()) // only for current chart symbol
              {
               /* I just try for - if price not equal != "Line OBJPROP_PRICE "
                  stop updates */


               // if objects not found - create them
               // ...
               // if objects exist
               // ...
               while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
                 {
                  PlaySound("ok.wav");
                  price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
                  Comment(price);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

当我读到OrderModify()的文档和书中的例子时,我没有看到确切的例子来解决我的问题。

祝您一切顺利!

 

我没有跟上这个主题,所以我可能错过了你正在做的事情。

首先,要简单化。

for(int order=OrdersTotal(); order>=0; order--)
     {
      bool selected=OrderSelect(order,SELECT_BY_POS);
        {
         if(selected==1)
应该变成。
for(int order=OrdersTotal()-1; order>=0; order--)
     {
      if(OrderSelect(order,SELECT_BY_POS)

另外,考虑一下你移动线的频率。是一秒钟一次吗?可能不是。

把你的代码放在OnChartEvent()中。

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG && sparam=="line") // the chart event of dragging the line

你正在对你的每一个未平仓订单多次调用同一个函数

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
   Comment(price);
  }

在你进入订单循环之前调用一次。

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal()-1; order>=0; order--)
  {  
 

请确保你理解while循环的原理。

这是很危险的,因为如果出于任何原因,其他EA 试图修改行价值,那么结果是这段代码将被卡在一个无尽的循环中,你的终端很可能冻结。

这通常以非正常终止而告终。

由于你使用的是 "线 "这个对象,所以危险性没有你所说的由OrderModify()发送给服务器的tp和sl水平那么大,所以除非你打算编写另一个干扰 "线 "的EA,否则应该不会有问题。

 
honest_knave:

我没有跟上这个主题,所以我可能错过了你正在做的事情。


在你进入订单循环之前调用一次。

double lineprice=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
for(int order=OrdersTotal(); order>=0; order--)
  {  

请理解他想做什么。

他必须调用两次并比较数值,以查看线路是否被移动。

如果不读两次值,这是不可能做到的。

while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))// if price differs from "line" value do:
  {
   PlaySound("ok.wav");
   price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);// now overwrite old line value with new line value.
   Comment(price);
  }
 
Marco vd Heijden:

请理解他正在努力做什么。

他必须调用两次并比较数值,以查看线路是否被移动。

如果不读两次值,这是不可能做到的。

你需要再向我解释一下。

如果你有一个CHARTEVENT_OBJECT_DRAG,并且sparam是 "线",那么线已经移动了。

对于极少数情况下,它沿着同一价格进行时间上的移动,惩罚是不多的。

 

有许多方法可以做同样的事情。

如果你决定使用CHARTEVENT,请记住它在测试器中不起作用。

 
好吧,我把它留给你们。祝你们好运。
 

我已经看了你们的有益评论,马可先生、克纳夫先生、威廉先生,非常感谢你们的评论!所以,我想我应该和你们分享那块代码,但我现在不能分享,因为我还在努力。

现在我已经检查了一些东西,而且我决定我可以一步一步地写(/和检查)OrderModify()。因为这个OrderModify()对我来说真的很危险。
有几次我已经面临错误的修改。但当我试图面对同样的问题时,我知道问题来自哪里,甚至我在图表中尝试了同样的东西,问题也没有再次发生。几个小时后,我又面临同样的问题。
我仍然不知道到底是什么原因导致了这个问题。我指的问题是什么。我已经在之前的评论中与你分享了其中一个问题。我也用我的贸易面板 EA开了一个头寸,这很好!然后我尝试用手动交易方法开卖出限额。(这是我的贸易面板还没有卖出限价或卖出止损挂单)。

所以,我想我应该和你分享这个代码块,但我现在还不能分享,因为我还在研究它。我想把这个代码移到OnChartEvent()中,因为我还要在其中添加一些按钮。

问题:我 不能写一个代码,如果订单关闭,然后删除它的对象,像这样,止损,获利,打开,关闭箭头这样的东西,请帮助我。
问题。还 有交易面板对象前面的止损、止盈线。我知道这是由上次创建的对象引起的。但如果你能理解我,请让我知道我怎样才能使贸易面板对象在所有其他对象前面没有 "止损和获利 "线。

先谢谢你。