新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 196

 
Alexey Viktorov:

好吧,我会尽力多做一点事情来教育你。

我在发送时将称呼你为 "你"。我有一张指针的快照...

请告诉我,在同一个刻度上调用同一个函数5次,不觉得不妥吗?但这是一半的麻烦。这个函数会浏览所有的订单。而这一切在一次勾选中进行了5次......而我算上4个这样的功能。我们不能硬着头皮去想如何在一个循环中再容纳3个函数来搜索所有的订单。

下面是其中的两个。

这就是

它甚至还没有接近拖后腿。

为了理解这一点,我们需要清楚地了解尾随的定义。我不能逐字记忆,但大约是 "跟随价格移动止损位,以减少可能的损失或增加 "保证 "利润。

而这

当你运行专家顾问时,它看起来像什么?可能是四条线...是否需要它们?

今天的最后一件事:你不必在你的头脑中建立一个图书馆。有文件并知道如何使用它就足够了。我仍然记不住iMA(_Symbol, _Period, ,,,,,)的所有参数,如果不研究文件,我就无法进一步了解。因此,几乎所有的功能。幸运的是,他们不久前制作了工具提示,这并没有什么帮助。我不是要记住如何写这些或那些枚举。所以你必须每次都看一下文件。


阿列克谢,谢谢你提供的信息。是的,我承认这段代码不是最佳的,我只是不是一个程序员,我不知道你所描述的微妙之处。我根本不明白这样的细微差别,我不明白如何优化这一切,也许我以后会这样做,如果我将继续前进。现在我清楚地知道,如果我开始优化,我只会破坏一切。我在我的网站上看到了其他EA的代码--那里有太多的东西了!- 可以肯定的是,如果你是一个专业的编码员,也许他的代码对终端的要求比我的要低,但现在我不能考虑你的意见,因为我真的不了解这些编程优化的细微差别。如果你在代码中删除一些对函数的调用--可以肯定的是,专家顾问会在那里开始混乱,并在没有必要的时候打开订单。我在那里编码,测试--没有出错或者出错,我就纠正,结果最后的代码变成了这样,我没有时间去优化,你明白我的知识包袱。

至于追踪--最重要的是它能追踪到利润,在目前的发展阶段,我对它感到满意))))。可以肯定的是,新旧尾随代码的尾随是一样的,交易的数量 也是一样的--当然,我已经得出结论,尾随是有效的,但如何在这个尾随有效的环境中正确地做,没有人告诉我,我也没有想法--我所有的代码都是乐高构造器--也就是说,我根据视频教程的材料组装的。当然,有一点是我自己的--实际上是专家顾问本身的算法,而整个代码和功能不是我的发明,而是来自TradeLikeaPro的视频教程,我完全按照类比和我的需要 "编辑 "了代码--用于我的算法。最后,我得到了我所拥有的。

 
geratdc:   我所有的代码都是乐高构建器--即我从TradeLikeaPro的视频教程材料中组装的,此外,我完全按照类比和我的需要 "编辑 "了代码--用于我自己的算法。最后,我拥有我所拥有的。

看了看存款图--有了兴趣,下载了第一个版本。把它复制到MetaEdit中。我有两个警告。首先,我把int timeprev=0;替换为datetime timeprev=0;来消除它,因为这个变量包含日期。第二个表示在

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

我已经删除了最后三根琴弦。它翻译的很干净。我更进一步...

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

已经改变了(为了说明问题,我附上了脚本--运行它,它会解释),所以

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
下面是结果


这个函数被删除了--没有对它的调用,其主体是空的。

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

我试着运行它,看到了。

它是

我只在用相同的工具和滑移量在两个图表上运行EA时改变了它 - 为什么要改变这个参数?然后我想了想,把参数增加了10倍。我还删除了OnInit这个函数。 毕竟,我只使用五位数的代码。为什么? 因为四位数的差价是3分,所以是30分。而五位数的价差只有12。

它变得更加清晰。

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

我修剪了页眉的顶部。这就是我离开的原因。

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

这一行就在这里。

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

把它移到了索赔处。它是这样的。

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

然后,我扔掉了开头对操作变量的描述,用以下内容取代了它

   if (CalculateProfit()>=tp) CloseAll();

在OnTick函数的开头,有几行字。这是为了确保每个条形图只进行一次处理,而不是每个刻度都进行处理。

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

然后计算MA。这一点必须详细研究。为了这个目的,我做了一个脚本并显示了结果

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

我们可以看到,第四个MaShift参数和最后一个参数是相加的,也就是说,条数=它们的总和。它从第2小节开始,从结尾的第三小节开始,采取了MA。

我将进一步研究它。有兴趣吗?

 
STARIJ:
...

我将继续寻找。有兴趣吗?

你一直在提这个问题吗?

已经够了--人们为那些有兴趣的人关注这个话题,这就浪费了。

如果你想让一个人回答你,把他们叫到线上。像这样。@STARIJ.但你不必通过编辑你的最后一个帖子来不断提起这个话题。


 
Victor Nikolaev:

这意味着有人要倒霉了。再一次。这是一个脚本,不是一个专家顾问或指标

想通了--显然终端没有足够的内存--关闭了几个图表就成功了。

谢谢你--的确,计算发生了。

如果变量不是int类型,而是bool,该怎么做?

 

你好,请你告诉我。

1 - 是否只能作为自然人注册,还是也可以作为法人注册,是否有任何限制和条件

2 - 是否有任何与社交网络的同步,以拥有一个单一的账户(用户名和密码)。

3 - 我还看到一个功能,"在你的页面上放置一个小部件,分享信号" - 我们是在谈论网站还是其他东西


 
你好,我最近才开始学习Mql4。如果我在错误的地方问了你一个问题,请把我引到正确的主题。我的问题如下:如何与建立各种区域、矩形等的指标合作。我可能会对线条的交叉或价格的高低进行编程,例如MA。)我在底部附上了一个指标,缓冲区是四个,有八个类型的区域。因此,我实际上搞不清楚如何编码打破或突破这些区域。
附加的文件:
 
STARIJ:

看了看存款图--有了兴趣,下载了第一个版本。把它复制到MetaEdit中。我有两个警告。首先,我把int timeprev=0;替换为datetime timeprev=0;来消除它,因为这个变量包含日期。第二条指向

响应

也许,这与视频课程中的TP是int类型的事实有关,但我已经将其转换为double,因此int timeprev仍然是原样。好的,我会解决这个问题。 但它对EA的运行有什么影响?事实上,这些条形图和时间与视频教程中的TrailingStop函数有关,但由于我用自己的函数取代了这个函数,它只是作为源代码的遗迹保留下来,我的追踪止损实际上并不是基于条形图时间。


我已经删除了最后三行。它翻译的很干净。我更进一步...

我把它改成了这样(为了说明问题,我附上了一个脚本--运行它,它就会解释)。

下面是结果

*答案。

这段代码到哪里去了?

   return(INIT_SUCCEEDED);
  }

也许应该是这样的?


空白的OnInit()

{

如果(Digits == 3 || Digits == 5)

{

步骤*=10。

后续步骤*=10。

尾数止损*=10。

滑移*=10。

}

return(INIT_SUCCEED)。

}

但你为什么要把TakeProfit变成int类型? 这意味着它将是以点为单位的利润,而CalculateProfit()函数是双倍类型的,所以我把TakeProfit变成相同的类型,使它们保持一致。


我删除了这个函数--没有对它的调用,它的主体是空的

响应

在代码中,有一个void CloseAll()函数。 我以为它与这个函数有某种关系

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

响应

好吧,让我们把它删除。


试着运行它,看到了。

它是

通过修改--好吧,只是添加了评论,并从Magic中删除了extern。

响应

是的,也许extern是多余的,因为我从来没有改变过它,Slippage也没有改变过,这都是来自视频教程的源代码。

- 我们只有在用相同的工具和滑点在两个图表上运行EA时才会改变它 - 为什么要改变这个参数?然后我想了想,把参数增加了10倍。我还删除了OnInit这个函数。 毕竟,我只使用五位数的代码。为什么? 因为四位数的差价是3分,所以是30分。在五位数的差价上,它只有12。

答案是 。

这是EA的默认设置,可以在所有货币上工作。我将保留Oninit()。

它变得更加清晰。

我已经修剪了顶部的页眉。这是我留下的东西。

回复

这个页眉是由默认的编辑器制作的。我还是保持原样,以防在经纪人那里或在终端因为没有这些线条而不能通过的事情。

我已经把这一行移到了

挪到了索赔处。事情是这样的

然后,我删除了开头对变量op的描述,并将其替换为

响应

这很符合逻辑。



在OnTick函数的开头,有几行字。这是为了确保每个条形图只进行一次处理,而不是每个刻度都进行处理。

然后计算MA。这一点必须详细研究。为此,我做了一个脚本并输出结果。


你可以看到第四个参数MaShift和最后一个参数是相加的,也就是说,条数=它们的总和。我们从第2小节的MA开始,第三小节结束。

响应

由于我已经改变了尾数--日期--时间,所以我认为移动平均数与此无关。这是源代码的遗迹,我曾经试图通过3个(三个)开放订单中的最后一个来拖动。事情是这样的,如果市场按STep的值向错误的方向发展,EA就会开出一个反单,然后如果市场继续向相反的方向发展,就会增加第二个位置的类型的第三单。或者反过来说,如果价格返回了方向,那么第三个订单将以第一个订单类型(买入或卖出)打开。 在那里,使用CalculateProfit()函数对三个订单进行追踪;然而,如果第一个订单成功打开,并且价格如期移动,在这种情况下,在酒吧上的追踪将使用视频教程中的datetime进行 - 我重复,即使在1个订单上使用calculateprofit()函数追踪。

我将进一步寻找。有兴趣吗?

响应

是的,我对拖网有一些问题。它似乎可以跟踪,但我不希望任何人了解我用它做了什么。Trailing()函数没有条形和日期时间 - 它与Trailing()一起工作。

MA周期约为200,但关键是它是一个可调整的值。而关键参数Value似乎不见了--我已经在README文件描述中解释了其含义。



谢谢你为这一切付出的努力。事 实上,专家顾问并不是真的那么好,机械的我想说。但基本上,如果你设置了它,并偶尔监测它的工作,它可能是相当好的。时间会证明一切。可能,他们可以赚到一些钱,但他们会连眼睛都不眨一下就破产,也不会发短信。 我甚至没有去管它,尽管我的想法是,如果缩水超过30%的存款已经发生,就发短信--这意味着已经有3个订单被打开,市场开始逆向运动,在这种情况下,它有石蜡的味道。所有其他情况都由专家顾问解决,如果它是根据交易工具图表的行为历史进行调整。


我暂时在记事本中对代码进行了推荐(但不是全部)修改。请检查我是否已经纠正了代码?

我支持优化,只是我没有考虑到你删除oninit的时刻--我需要它能够在所有货币上测试和工作))))。

附加的文件:
 
Aleksandr Verkhozin:
你好,我最近才开始学习Mql4。如果我在错误的地方问了你一个问题,请把我引到正确的主题。我的问题如下:如何与建立各种区域、矩形等的指标合作。我可能会对线条的交叉或价格的高低进行编程,例如MA。)我在底部附上了一个指标,缓冲区是四个,有八个类型的区域。所以我搞不清楚如何编码打破或突破这些区域。

如果你想了解更多关于程序员的信息,你应该通过实例查看并使用彩色按钮。你可能会问:你是如何得到mql4代码作为编程范例的,你又是如何知道该如何处理它的?)也许你会进步。
 

geratdc:

...
是的,我有一些关于拖网的问题。它似乎在拖动,但没人想知道我对它做了什么。

...

如果你知道,就在这个主题中,我发布了一个拖网的模板,该模板在计算中使用发给它的指标值。查一查,别偷懒。
 
geratdc:

你可能需要从RuTracker上的TradeLikeApro下载mql4编程视频教程。我认为mql4的基本原则是,你不需要做任何复杂的事情,你根本不需要做任何事情)。也许你会进步。


看了关于使用外部指示器的视频,写了一点代码来查看测试器中缓冲器的值。

空白的OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1)。

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1);

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1)。

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1)。

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

这些区域在可视化模式下出现和消失。但无论如何,缓冲区的值总是为零。是否没有办法在代码中正式规定这些区域?

也许除了iCustom之外,还有一个函数适合这种指标?也许有人写过有这种指标的猫头鹰?