检查开放交易的问题

 

嘿,我在我的代码中加入了这个,以检查 是否已经有一个开放的交易。问题是该代码将执行一个交易,仅此而已。谁能看出这段代码的问题。我不是一个编程的超级专家


//

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{

if(OrderSymbol()==Symbol() )
{
tradeopen=true;
}
else
{
tradeopen=false;
}

}

}

 
你的代码将拾取挂单和开仓交易,除此之外,我认为它看起来还不错。
 

谢谢Raptor的及时回复。


如果你不介意的话,我把整个代码附在后面,也许我在其他地方有什么遗漏。我现在在这方面遇到了困难。

附加的文件:
daz.mq4  3 kb
 
dazamate:
谁能看出这段代码的问题。

  1. 没有神奇的数字意味着它与其他所有的EA和手动交易 以及自己在同一对/不同时间段的交易不兼容。
  2. 如果第一个打开的订单不是EA的,那么标志是假的,即使它有开放的交易。
    int TotalOrderCount(){
        int count=0;
        for(pos = OrdersTotal()-1; pos >= 0 ; pos--) if (
            OrderSelect(pos, SELECT_BY_POS)                 // Only my orders w/
        &&  OrderMagicNumber()  == magic.number             // my magic number
        &&  OrderSymbol()       == Symbol() ){              // and my pair.
            count++;
        }
        return(count);
    }

 
dazamate:

谢谢Raptor的及时回复。


如果你不介意的话,我把整个代码附在后面,也许我在其他地方有什么遗漏。我现在在这方面遇到了困难。

有几点意见......

你声明....

int i;

. . . 但你没有在任何地方设置它,什么是 i

你设置了 . . .

static bool tradeopen = false;

. . . 然后检查 它,看你是否可以进行交易 . . . 在这一点上它总是假的 . . . 然后你的代码以后可能会把它设置为真

if(OrderSymbol()==Symbol())
    {
    tradeopen=true;
    }  

barcount被设置为0

static int barcount = 0;

所以如果你的图表上至少有一个条形图,这将永远为真 ......

if(Bars != barcount)

你需要逐行查看你的代码 ......任何你不理解的东西都要查找并阅读相关内容 ......这是你唯一可以学习的方法。

 

猛禽,谢谢你的介绍。正如我所说,我不是超级专家。我一直在阅读其他人的编码方式,并尝试将其落实到我的编码中。我已经做了很多关于功能的阅读。只是当它不工作时,你不知道如何诊断你自己的灾难,这让人感到沮丧。

为了回应你的意见

int i;

它不见了,我正在用它做别的事情,不小心把它留在那里了。


我将解释一下我脑海中关于酒吧计数器的情况。我仍然不确定为什么这部分代码是不好的。

static int barcount = 0;  // <- First time program is run bar counter is set to 0

     if(Bars != barcount) // <-  This will be true so the if statement is allowed to run
    
       {      
         if(iBarHour == iOpenHour)
                {
                //If statement
    
                }
         barcount=Bars ; // <- At the end of the if statement, the bar counter is set to Bars so that this if statement will not be true
                         //    again until another bar opens
       }

至于检查该货币对是否有任何开放交易......

static bool tradeopen = false;                // First time program is run tradeopen is set to false. I use the static in front 
// because if I don't the programming will keep setting this to false because an ea or   // a program is just a giant loop is it not. However I should set this to true because // the ea should assume there is a trade open until it does it checks that would // probably be the more smarter approach.       for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)         {           if(OrderSelect(cnt,SELECT_BY_POS)) // <- So it scans each open and pending trade             {                           if(OrderSymbol()==Symbol()) // <- Checks to see if any of them trades are the same as the pair the ea is using                {                 tradeopen=true; // If so then set tradeopen to true                }                        else                {                 tradeopen=false; // If not set trade open to false                }                          }                         }

所以在EA的最后,它做了这样的检查,看当前货币对上是否有交易。将tradeopen设置为真或假。在EA的结尾处使用这段代码有什么问题吗?

还有一个我想不通的问题......

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);
为什么iBarHour总是返回1?我希望它能返回当前的小时数 :(


冯先生


EA是否使用一个神奇的数字有什么关系吗?它能不能只检查所有未完成和待完成的交易,以及其中是否有当前的交易对?


我知道我是个新手,但还是要感谢你们的意见,我知道我可能又要被人骂了,说我的编码太差劲了:P


谢谢

 
dazamate:

我将解释一下我脑海中关于条形码的情况。我仍然不确定为什么这部分代码是不好的。

对不起,我可能显示了我对静态变量使用的无知。. .我使用全局变量来代替,任何我想在代码初始化时设置的东西我都把它放到init函数中。https://docs.mql4.com/basis/functions/special

如果你在周末运行这部分代码,它将不会改变,它使用的是服务器时间,而服务器时间会随着每次打勾而更新。

int iBarHour;
iBarHour = TimeHour(TimeCurrent());
Print(iBarHour);

假设这段代码有效,那么dDayOpenPrice将只在iBarHour = 6时被设置,当iBarHour = 7时,dDayOpenPrice将不再被设置为正确的值。 如果你把dDayOpenPrice设为全局值,那么它的值将在代码运行时被保存下来(把它设为静态值也可能会有效果)。 如果代码被重新启动,在第二天之前不会发生任何事情......直到早上6点。

WHRoeder

EA是否使用一个神奇的数字有什么关系吗?它能不能只检查所有未结交易和待定交易,以及其中是否有当前的交易对?

如果你在一个图表上只有一个EA,没有手动交易,那么你可能可以不使用神奇数字,但使用它是很好的做法,首先让你的代码工作,然后实施一个神奇数字,这将有助于你学习。

 

RaptorUK 再次感谢你。


我对EA进行回测,看看代码是否有效,并打印()变量,看看其中发生了什么,以帮助调试代码。ibarhour代码似乎工作正常,只是在回测中不能正常显示,因为我将其设置为不断打印ibarhour的值,它不能在代码吐出时快速显示,所以回测器被卡住了。是否有办法在打印代码上设置一个延迟?



另外,我希望它能存储06:00条的开盘值:)


我重新组织了代码,我为自己感到骄傲,我确实让它能够检查EA在当前货币对上是否有任何交易。我使用了 WHRoeder 的例子,把它变成了一个单独的函数:),并让这个函数返回真或假。耶。



因为你显然是EA编码领域的精英。你听说过多少人自己制作EA的成功故事?我只听到/看到过不好的故事。











 
dazamate:

既然你显然是EA编码领域的精英。你听说过多少人自己制作EA的成功故事?我只听到/看到过不好的故事。











大笑.......你的评论应该是针对WHRoeder 而不是我,他是一个比我熟练得多的编码者,看看他最近的一些帖子,看看他分享的代码,你可以从理解他的代码中学到很多东西,我 知道我 有,谢谢你 WHRoeder :-).

我在这里闲逛,是因为我喜欢尝试帮助人们帮助自己......而且在这个过程中我也能学到东西。

要想拥有一个成功的EA,你首先需要一个成功的方法......有多少这样的方法呢? 很多东西在短时间内有效,少数东西会在一两个月内有效,很少有持续有效的。 即使有人有一个好的方法(如果没有适当的测试,他们如何知道这一点,我不知道),他们通常没有知识或能力将其变成一个可行的EA。 任何拥有可行的EA的人都不可能宣传这一事实,他们将使用它并赚钱。

很高兴听到你正在取得进展 ... ...关于你的打印问题,你可以使用Comment(iBarHour);相反,它可以在左上角输出到屏幕。

 
  1. 不客气。"要学习某样东西,就要练习。要掌握它,就要教。"
  2. Bars是不可靠的(一旦你达到图表上的最大条数,它就不会改变,代码就会中断。总是使用时间。
    int start(){
       static datetime Time0;
       if (Time0 == Time[0]) return; Time0 = Time[0];
       // A new bar has started.

  3. 可能表明我对静态变量的使用一无所知.. .我使用全局变量来代替,任何我想在代码初始化时设置的东西
    如果变量需要被初始化,那么它必须是全局的。如果该变量在两个或多个函数之间共享,那么它必须是全局的。否则就把它定义为函数的本地变量,如果需要的话,可以是静态的。
  4. EA是否使用一个神奇的数字有什么关系吗?
    你可能一切正常,然后你会打开另一个图表来测试,然后突然一切都失败了。从一开始就做对了。在我的代码 中,我同时检查神奇数字和对子,以防我把它放在另一个图表上,但不改变神奇数字。
 

你是对的 猛禽...对不起,WHRoeder,这是不礼貌的,不感谢你是好的。这对我来说是一个巨大项目的开始,所以我真的希望你们不要介意我打扰你们。


int start(){
   static datetime Time0;
   if (Time0 == Time[0]) return; Time0 = Time[0];
   // A new bar has started.

WHRoeder,这段代码看起来很简单,但我想不出来它是如何工作的,如果每次时间0等于时间[0]的时候,if语句不都是真的吗?我不是说它不能工作,但我只是不明白它是如何以这样的结构工作的。


还有两个问题。

我如何制作一个计数器,如果一个挂单 被放置,而它在x个柱子内没有被触发,那么它将被取消?我所能想到的是,在每次形成新的条形图时,如果计算的条形图数量==指定的允许条形图,那么挂单就会被取消。每当有新的挂单被打开时,条形计数器就会被重置?这听起来如何?

下一个问题。

这个问题我不知道如何去做。

我想做一个函数,在1小时Tf上扫描eurusd, usdchf, gbpusd, usdjpy。它回溯到上一个06:00 gmt蜡烛记录开盘,再回溯到上一个06:00 gmt蜡烛记录开盘,并记录每个货币对的6gmt-6gmt范围。然后比较所有货币对的6gmt-6gmt范围,并返回最高的那个。一个EA有可能通过连接到一个时间图表来做到这一点吗?


再次感谢你们的知识和你们的病人