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

 
Valeriy Yastremskiy:

我明白,但不幸的是,mql5很难理解。我同意fxsaber的意见,我认为使用4更容易,对于优化和其他东西,我们应该使用5。总的来说,我想知道是否有谁在没有OOP实践的情况下掌握了mql5?当然,在C++4之后是不相关的,尽管我可能是错的。

这两种语言是绝对相同的。既不多也不少。而OOP(每个人都被它吓到了)在两者中是 完全一样的。 你不知道吗?你是否在互联网上读过恐怖的故事,在YouTube上看了那些 "播种美好、智慧和永恒 "的博主?他们巧妙地胡说八道,故意把人们从MQL5中吓跑。

我急于让大家失望--两种语言完全相同。无论是在易于理解方面,还是在OOP的特点和存在方面。
但MQL5有更多的可能性。

 
Alexey Viktorov:

我把那个西班牙人送到你那里--好吧,吓吓他。让他成为一个指标 - 我没有时间。它是用英语写的。如果有什么事,我会解释。但是......你会明白的。

 
Alexey Viktorov:

我不记得阿特姆的答案了,我也不打算去寻找它。他文章中的所有代码都是多终端或两个版本,为mql5和mql4。我在mql4上检查了这些版本,一切工作正常,通过停止或采取检测关闭,没有错误。

是的,这些文章很难理解,但如果你不比我大,那是值得的。而我,作为一个程序员,已经老得令人发指了。

另一种变体更简单,但速度会慢很多。将订单票据写成一个数组,通过这个数组,选择订单并检查订单关闭的时间。如果它高于零,意味着订单已经关闭。如果一个平仓订单的注释包含字母 "sl",这意味着该订单是用止损来平仓的。如果该订单被关闭,它将从数组中删除。或者,在阵列完成后,它被重新填入剩余的未结订单。想象力一般都在飞。

你选择哪个选项取决于你。并阅读我关于科瓦列夫教科书的一些帖子。是教科书建议写int start(),而较新的mql4要求void OnTick()。

关于指标和脚本,请参考文件。顺便说一下,在更新的mql4中写指标要比Sergey写这个教程时容易得多。

非常感谢你。你的信息对我来说非常有价值。特别是关于start()函数。

 
Alexey Viktorov:

我不记得阿特姆的答案,我也不会去找,我可以猜到他可能会回答什么。 ......

以下是我的答案。明确指出需要做什么。

关于交易、自动交易系统和交易策略测试的论坛

新手对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论

Artyom Trishkin, 2020.04.28 08:22

这是一个简单的解释:你需要监控订单 和头寸的数量,并与之前的状态进行比较。如果我们在前一个tick上有12个位置,而在当前tick上有8个位置,我们就有4个位置的变化。相应地,我们应该以最后四个(按收盘时间计算)头寸来了解它们的情况。

但是,从所附的写有 "神迹 "的代码来看,你真的不需要用文字来解释。但它在这里是为了帮助,而不是为/为写。


 
ANDREY:

非常感谢你。你的信息对我来说非常有价值。特别是关于start()函数

好东西是在编辑器中创建我们需要的东西,EA、脚本、指标,编辑器将创建一个有正确字段的模板。
 
Artyom Trishkin:

而你的代码除了在严格规定的时间内开出两个卖出头寸,并在允许的情况下打印出开出最后一个头寸的时间外,还做了什么?就这样了。使用未初始化的变量,会导致代码的行为出现 "奇迹",还有非常非常老的start()处理程序,这些处理程序是从布满灰尘的架子上拉下来的,上面有多年的蜘蛛网,在市场上(有一天你想卖东西)用古老的处理程序永远不会错过验证器--它会说程序类型错误。

谢谢你的意见。在英镑/美元对上,我在测试时发现了一个价格行为模式。这种带有小幅修正的模式,以及小幅回撤的模式,平衡图自2008年以来不断向上引导,直到目前。正如我所说,平衡图的修正和缩减并不大,但它们可以持续几个月。
我开始测试这种模式的不同变体,并为此诉诸于优化。但事实证明,同时使用几个参数进行优化需要大量的时间。就我而言,这花了大约一年时间。遗传算法 并不适合我。
后来我想到,在正确制定的代码、Pront()函数和Excel表格的帮助下,可以更快地进行测试和优化。

下面的代码只是尝试编写这样的代码。我将进一步改进这个代码。但我遇到了一个我缺乏知识来解决的问题。
请不要对我和我的代码进行评判,非常严重....。我是一个初学者,才刚刚开始了解编码的基本知识,其他的就很少了。但我冷静地接受批评,特别是对建设性的批评不以为然.....。

谢谢你的帮助。

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

如果两个或更多的订单在同一时刻被止损或止盈平仓,程序只在最后一个订单在此时刻平仓后打印Print()。我需要在每个订单关闭后打印()。我不知道如何实现这一点。但如果我看到必要的代码,我就会立即理解并记住它。

下面是我的问题的一个例子。


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
好东西是在编辑器中创建我们需要的东西,一个EA,一个脚本,一个指标,编辑器将创建一个具有正确字段的模板。

是的,我注意到这些正确的字段,即新功能而不是START。但我并没有太注意它们,而是像以前一样用START进行测试。
我不知道在哪里可以看到关于MQL4最新更新的更多细节。我非常喜欢科瓦廖夫的书,因为所有的信息都是有逻辑的,容易理解。而且它足够详细,可以了解所有必要的细节。我想知道为什么他没有为MQL5写同样的教科书。

 
Artyom Trishkin:

两种绝对相同的语言。既不多也不少。而OOP(每个人都被它吓到了)在两者中是 完全一样的。 你不知道吗?你是否在互联网上读过恐怖的故事,在YouTube上看了那些 "播种美好、智慧和永恒 "的博主?他们巧妙地胡说八道,故意把人们从MQL5中吓跑。

我急于让大家失望--两种语言完全相同。无论是在易于理解方面,还是在OOP的特点和存在方面。
但MQL5有更多的可能性。

是的,总的来说我同意,在4卡中的OOP很高兴)))但在初学者的访问中,根据我的经验,教科书科瓦廖夫、日丹关于4卡和难以理解的米申关于5卡和OOP。我不知道如何理解它。无论你重复多少次封装,多形性的理解都不会到来。而且你不明白应该先读哪些文章。以及在哪里寻找什么。这就是为什么到目前为止,在ontik的codeobase中,从启动函数中退出的情况被发现)))))。
 
ANDREY:

是的,我注意到那些正确的字段,即新功能而不是START。但我没有太注意它们,所以我像以前一样用START进行测试。
我不知道在哪里可以看到关于MQL4最新更新的更多细节。我非常喜欢科瓦廖夫的书,因为所有的信息都是有逻辑的,容易理解。而且它足够详细,可以了解所有必要的细节。我想知道为什么他没有为MQL5写同样的教科书。

正如Alexey Viktorov 所说了解简单的事实,mql5与mql4的区别仅在于OrderSend()和其他一些函数,我不记得 了。另一个重要区别是指标缓冲区的索引方向。然而,它可以很快得到解决,但你最好习惯于新的功能。但得到的指标值仍然是一样的。
针对初学者的OOP文章有帮助。还有编辑的帮助。
 
ANDREY:

谢谢你的参与。

...

下面的代码只是尝试编写这样的代码。我将在未来完善这个代码。但我遇到了一个我缺乏知识来解决的问题。
请不要对我和我的代码进行评判,非常严重....。我是一个初学者,才刚刚开始了解编码的基本知识,其他的就很少了。但我冷静地接受批评,特别是对建设性的批评不以为然.....。

谢谢你的帮助。

如果两个或更多的订单在同一时刻被止损或止盈平仓,程序只在最后一个订单在此时刻平仓后打印Print()。我需要在每个订单关闭后打印()。我不知道如何实现这一点。但如果我看到必要的代码,我就会立即理解并记住它。

下面是我的问题的一个例子。


我已经回复了你。

用语言来解释:你需要监控订单 和头寸的数量,并将其与之前的状态进行比较。如果我们在前一个tick上有12个头寸,在当前tick上有8个头寸,我们就有4个头寸的变化。相应地,我们应该把最后四个(按收盘时间)的头寸拿出来,看看它们发生了什么。

你采取清单上的最后一个订单。

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

而你首先需要找出订单列表的状态有多大变化。你以前有12个,现在有8个--这是一个4个订单的变化。相应地,你需要打印所有四个订单。而且你总是只打印列表中的最新订单。

我怎么知道变化有多大?当我们运行EA时,我们需要将订单的数量写进一个变量,例如int last_total。然后,在每个刻度上,将OrdersTotal()与last_total进行比较。如果它们不平等,那就是一种变化。将OrdersTotal()和last_total之间的差异写入一个变量,例如num_changes,并将OrdersTotal()的新状态保存到last_total。
这里可能有一些微妙之处,例如,当一个挂单被触发时。但是现在,你应该先做你需要做的事情。
知道了挂单的数量,你就可以在历史上查找它们。但是,您也可以限制对历史订单列表的监控--对历史订单列表做上述所有工作,而不是对市场订单列表。过去和现在的区别--这是你需要分析的订单量。你总是只分析列表中的最后一个订单。

然而,这不能保证历史列表中的最后一个订单是最后一个关闭的订单。这也是一个必须考虑的细微差别。但随后。