新手的冒险 - 页 3

 
niko:

谢谢你,cloudbreaker!这开始变得有点意思了,我不知道你可以在一个返回中调用一个函数(尽管它可能在mql书中有,就像其他理论上的东西一样)。看起来不错的直升机EC155!为什么'感谢',你不想要你自己的直升机?

问题 Aero HC2。


到目前为止,我的策略有3个脚本。2个是单向的,1个是双向的(也就是我们正在研究的那个)。

根据您在MT4上的经验,如果我为屏幕上的5个或更多的货币对附上不同的脚本(每个货币对1个脚本),我是否会遇到严重的问题。对我来说,这比编写或修改一个大的脚本并让它选择我想要的货币对要容易得多(因为这需要每天修改代码)?

 
niko:

问题 Aero HC2。


到目前为止,我的策略有3个脚本。2个是单向的,1个是双向的(也就是我们正在研究的那个)。

根据您在MT4上的经验,如果我为屏幕上的5个或更多的货币对附上不同的脚本(每个货币对1个脚本),我是否会遇到严重的问题。对我来说,这比编写或修改一个大的脚本并使其选择我想要的货币对更容易(因为这需要每天修改代码)?

假设我们谈论的是一个跨货币对 的单一交易策略:-。

我倾向于使我的EA与货币对无关--即同一个EX4可以连接到任何货币对。

-这样,我们只有一个代码库需要维护。

-逻辑尽可能保持简单。

 
cloudbreaker:

假设我们在这里谈论的是一个跨货币对的单一交易策略:-。

我倾向于使我的EA与货币对无关--即同一个EX4可以连接到任何货币对。

-这样我们就只有一个代码库需要维护。

-逻辑尽可能保持简单。

是的,这将是最理想的,但我每天为每个货币设置一个手动过滤器,而不是基于指标的,另外它变成了3个策略,尽管想法是一样的。在我看来,这将使代码变得非常大,如果我们把所有的东西放在一起,每天的调整也很麻烦。在不久的将来,我将对过滤器进行编程,以减少我的工作时间,但总有一些事情你不能编程(90%要编程,其余的是大脑的作用,我想。虽然我在试图对所有东西进行编程并想出完美的模型之前,确实在追逐 "圣杯",哈哈,找错方向了)。


我将在本周一推出这两个策略,因为这些策略的代码已经完成。这两个策略已经由我的岳父和我自己手动执行了一下,编码应该会带来更高的结果。对于组合策略,我想我可以在同一图表上启动2个EA(一个做多,一个做空),但我仍然想学习,所以将继续编码过程。所以希望很快就会有很多问题出现


你在哪个国家工作?我在英国的伦敦。

 

嘿,cloudbreaker和其他mt4大师在这里!?


问题。我有两个脚本(一个是买入,另一个是做空)。今天我想在3个货币对上使用这两个脚本。现在,因为一个图表只能连接一个EA,我打开了6个图表(每对2个),并将脚本连接到它们。然而,只有一个脚本被执行。我不知道为什么。有什么帮助吗?


总结一下:2个EA,一个只做买入,另一个只做做空,非常基本的规则(emas上的金叉,仅此而已),盈利20点,没有止损。为什么只有一个被执行?我检查了专家顾问系统是否激活,所有的脚本在图表中都有笑脸。

 
niko:

嘿,cloudbreaker和其他mt4大师在这里!?


问题。我有两个脚本(一个是买入,另一个是做空)。今天我想在3个货币对上使用这两个脚本。现在,因为一个图表只能连接一个EA,我打开了6个图表(每对2个),并将脚本连接到它们。然而,只有一个脚本被执行。我不知道为什么。有什么帮助吗?


总结一下:2个EA,一个只做买入,另一个只做做空,非常基本的规则(emas上的金叉,仅此而已),盈利20点,没有止损。为什么只有一个被执行?我检查了专家顾问系统是否被激活,所有的脚本在图表中都有笑脸。



日志文件是怎么说的?即日志目录下的那份和专家目录下的那份?

你是否收到任何 "交易环境繁忙 "的信息?如果是,那么我建议添加一些使用IsTradeAllowed()函数 的逻辑。

如果没有,那么我建议在你的EA中加入Print()语句。

 
cloudbreaker wrote>>

日志文件是怎么说的?即日志目录下的那份和专家目录下的那份?

你是否收到任何 "交易环境繁忙 "的信息?如果是,那么我建议添加一些使用IsTradeAllowed()函数的逻辑。

如果没有,那么我建议在你的EA中加入Print()语句。

嘿,Cloudbreaker!谢谢你来救我!"。

1.你说的日志目录是什么意思?我怎样才能进入这两个目录?(我试图通过C>ProgramFiles>MT4>Experts>Logs打开它,但该文件夹显示为空)。

 
niko wrote>>

嘿,破云者!感谢你来救我!"。

1.你说的日志目录是什么意思?我怎样才能进入这两个目录?(我试图通过C>ProgramFiles>MT4>Experts>Logs打开它,但文件夹显示为空)。

嘿,cloudbreaker!

我已经看了很多遍你关于编码的评论(我把它们都贴在我的墙上),试图理解并把它们拼凑起来,但还是完全迷失了。我从另一个EA中复制了MyOrderCount函数,但仍然不知道如何将其整合到代码中。我完全不懂,但这并不意味着我们不能进步。如果你能帮助我一点一点地构建代码(并指导我可能更具体的东西,我也可以自己构建),那么我们将完成代码,我也会学得更快。

我附上了我所掌握的代码,以及我所认为的程序设计图。不要担心代码中的括号等小东西,我会在我们进行的过程中用notepad++仔细检查它们。

最重要的是,如果你能帮助我一步一步地将MyOrderCount的代码整合到其余部分,并请在我们进行的过程中一点一点地解释一切。如果你觉得合适,也可以把书中的特定部分或类似的东西发给我。这样我们会进展得更快。

谢谢你!"。

ps:如果程序图没有附上,请告诉我。

//+------------------------------------------------------------------+
//|                                     N&P 1DailyUpTrendExec.mq4 |
//| Copyright Nick Lou & Pete Arh 2009                               |
//|                                     20090523                     |
//|                                                                  |
//+------------------------------------------------------------------+

extern double    Lots=0.01;
extern double    TakeProfit=20;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
  return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
if(Bars<75)
     {
     Print("Bars less than 100");
     return(0);
     }
  //-------------------Declaring All Variables and Conditions

double ema1,ema2,ema3,closeup, e1over2, e2over3,e1under2,e2under3;

ema1= iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,0);
ema2= iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,0);
ema3= iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);
e1under2=ema1<ema2;
e2under3=ema2<ema3;
e1over2=ema1>ema2;
e2over3=ema2>ema3;
//--------------------declaration end

//-------------order counting code
int CalculateNumberOfOrders(string Symbol)
{
int long=0,short=0;
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)break;
      if(OrderType()==OP_BUY)long++;
      if(OrderType()==OP_SELL)sell++;
     {
  //---return orders Volume
  if(long>0)return(long);
  if(short>0)return(short);
{
//------------ (fingers crossed this is right). I still don't get it
why we need to count orders.


//------------------EURUSD Block-------------------------
//check order type, if it doesn't equal to buy already then buy
if(OrderType()
     {
    static int ticket;
      // deleted if(OrdersTotal()==0)
     if(e1under2 && e2under3)     // short function
       {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,Bid-TakeProfit*Point,"Short
Order ",0,0,Red);
        if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SHORT order opened : ",OrderOpenPrice());
              }
              //return(0);
       }

      //  -------------------------------------------------------------------------------------------

      {
      static int ticket1;
            // deleted if(OrdersTotal()==0)
        if(e1over2 && e2over3) //buy function
        {
         ticket1=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,Ask+TakeProfit*Point,"",0,0,Green);
//What's 12345 for? I ADDED ASk-30*Point for stop loss
         if(ticket1>0)
           {
           if(OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
           }
           //return(0);   //the problem is with this return not being
in the right place i think
        }
      }
return(0);
}
}

ps:请忽略代码中的随机//注释,它来自于旧的注释。

 
niko wrote>>

嗨,破云者!

我已经看了很多遍你关于编码的评论(我把它们都贴在我的墙上),试图理解并把它们拼凑在一起,但还是完全迷失了。我从另一个EA中复制了MyOrderCount函数,但仍然不知道如何将其整合到代码中。我完全不懂,但这并不意味着我们不能进步。如果你能帮助我一点一点地构建代码(并指导我可能更具体的东西,我也可以自己构建),那么我们将完成代码,我也会学得更快。

我附上了我所掌握的代码,以及我所认为的程序设计图。不要担心代码中的括号等小东西,我会在我们进行的过程中用notepad++仔细检查它们。

最重要的是,如果你能帮助我一步一步地将MyOrderCount的代码整合到其余部分,并请在我们进行的过程中一点一点地解释一切。如果你觉得合适,也可以把书中的特定部分或类似的东西发给我。这样我们会进展得更快。

谢谢你!"。

ps:如果程序图没有附上,请告诉我。

ps:请忽略代码中随机的//注释,它来自旧的笔记。

嗨,尼科

请允许我在这次讨论中加入我的两点意见。

作为一个有一点教学和培训经验的老程序员,我在这段时间里遇到了很多糟糕的代码。导致代码写得不好的一个常见错误是缺乏计划。这可能是一个显而易见的问题,但是在你开始尝试编码之前,你确实需要明确你想要做什么。这看起来像是额外的工作,但从长远来看,它将为你节省大量的时间,并产生更可靠、更易理解、更容易维护的代码。

有一种非常有用的技术用于指定计算机代码,被称为伪编码。基本上,它只是一套用普通英语写的类似计算机指令的逻辑。没有特定的格式要求,但你可以使用典型的计算机程序术语,这些术语以某种形式出现在几乎所有的计算机编程语言中。

这里有一个煮奶酪和通心粉的伪代码的例子。我从IBFX网站上的一篇文章 "Patrick Nouvion的编程介绍 "中抓取了它。整篇文章可能值得一读。http://www.ibfx.com/ibfxu/catalog/programming/pro1010.aspx

开始
找到牛奶和黄油以及卡夫盒
如果找到了,继续
否则让孩子去商店

在碗橱里找锅

如果找到了,继续找,否则请妻子帮忙找。

寻找炉子
如果找到了,继续
否则订购比萨饼

检查是否有可用的燃烧器
如果有,继续
否则就使用

将炉子开到高位
寻找水
如果找到,继续
否则订购比萨饼

将水放入锅中
确保炉子是热的
如果是热的,继续
否则检查它是否插上了电源
否则就打电话给维修人员并订购比萨饼

将锅放在燃烧器上
如果你有盐,加一撮盐
如果没有,继续
如果你有胡椒粉,加入一撮胡椒粉
如果没有继续
在水未沸腾时等待
打开卡夫盒
将盒子里的通心粉加入锅中
等待8分钟
在等待的过程中,如果锅里的水过沸,就把火调小,并对其吹气
找到滤网
在滤器中沥干通心粉
放回锅中
加入奶酪包中的内容
加入黄油
加入1汤匙牛奶
搅拌以混合
如果太稠,加入1汤匙牛奶;如果不稠,可以吃。
结束

如果我自己写这个伪代码,我会把它细化成一些功能块,并使用一些缩进的方法使它 "看起来很美"。比如说

START BLOCK - 准备沸腾的水

将水放入锅中

将锅放在燃烧器上
如果你有盐,就加一撮盐
如果没有,继续
如果你有胡椒粉,加入一撮胡椒粉
如果没有继续
在水未沸腾时等待

结束块--准备煮沸的水

等等....

Niko,我赞扬你想学习编写自己的代码。根据我的经验,最快速和最简单的学习方法是做你正在做的事,然后放手一搏。不过,我建议你向后退一步,用伪代码写出你想实现的目标。这应该能帮助你清楚地了解你想要实现的到底是什么。

一旦你完成了这些,你可能想把它贴回这里,让我或其他人看一看。一旦你有了正确的伪代码,那么你就可以开始将其转换为MT4代码。试图一次性完成是一个很大的跳跃,特别是当你是一个初学者。

顺便说一下,我的伪代码从未被浪费。它的大部分在我完成的代码中作为注释完成。

祝您好运!

蒂姆-威尔逊

 
niko:

嗨,破云者!

我已经看了很多遍你关于编码的评论(我把它们都贴在我的墙上),试图理解并把它们拼凑在一起,但还是完全迷失了。我从另一个EA中复制了MyOrderCount函数,但仍然不知道如何将其整合到代码中。我完全不懂,但这并不意味着我们不能进步。如果你能帮助我一点一点地构建代码(并指导我可能更具体的东西,我也可以自己构建),那么我们将完成代码,我也会学得更快。

我附上了我所掌握的代码,以及我所认为的程序设计图。不要担心代码中的括号等小东西,我会在我们进行的过程中用notepad++仔细检查它们。

最重要的是,如果你能帮助我一步一步地将MyOrderCount的代码整合到其余部分,并请在我们进行的过程中一点一点地解释一切。如果你觉得合适,也可以把书中的特定部分或类似的东西发给我。这样我们会进展得更快。

谢谢你!"。

ps:如果程序图没有附上,请告诉我。

ps:请忽略代码中随机的//注释,它来自旧的笔记。

我看了一下,发现你犯了一个基本的错误。

你似乎试图在start()函数的代码块中声明函数MyOrderCount()。

把你的代码想象成一系列的函数init(), start(), yourfunction1(), yourfunction2() ... yourfunctionN()。

init()和start()函数是特殊函数。init()函数在你第一次初始化EA时运行一次。start()函数在每次传入的tick到达时都会运行。

因此,start()函数形成了一个根,一旦EA开始运行,你所有的逻辑都会被调用。

举个例子,每次有tick到达时,你的start()函数就会运行,并做以下事情。

- 检查一些条件

- 如果条件得到满足,执行一个订单

你需要的条件之一是,在你发出买入订单 之前,确保你没有一个该类型的订单(比如说买入)。

因此,在start()函数中,你需要通过调用你的买入订单计数函数(其代码块位于start()函数之外)来计算出存在哪些买入订单。

你的订单计数函数将返回买入订单的数量,你将在调用买入订单计数函数后的那一行继续执行start()函数。

然后您将使用买入订单计数函数返回的值来决定是否执行您的买入订单。

买入订单的实际执行可能是调用你为自己创建的另一个函数(同样,在start()函数之外声明)。

希望这有意义。你的结构可能完全不同,但我只是想让你明白函数和调用的概念。


CB

 

嘿,TSWilson和CB!

你们真了不起!非常感谢你们。

关于伪代码,完全正确。我在用pro**realtime语言做非常基本的编程时也这样做过,但那里非常简单,没有声明,没有块,等等(整个代码只是'if...then'哈哈)。我今天早上开始写伪代码(提前一小时上班就是为了写这个),并写了一个关于如何和有哪些块的视觉图。我将在今天晚些时候完成这个,并在这里发布。

一旦完成了这个,其余的模块和代码的具体细节我可以在你们的帮助下弄清楚。所以,现在要回到绘图板上了

我很乐意在今天和明天通宵工作,以尽快完成代码,因为我下周要去度假,希望在我走之前把所有东西都准备好。

所以今天继续关注这个话题,我将发布伪代码和图表

像往常一样,感谢宇宙中像你这样的人!