[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 396

 
rajak:

大家好!

如果有人知道问题出在哪里,请告知,编译后的文件ex4没有出现,通过metalang也没有出现。我可以做什么呢?几天前,一切工作都很正常。

编译运行时没有错误,即使你有目的地引入错误。

如果你有windows7,试着在虚拟文件夹中寻找

c:\Users\Your folderAppData\Local\VirtualStore\Program Files (x86)\MT4 folder\experts\

用你的文件夹和MT4文件夹代替你的真实目录。

 
lottamer:

前段时间,好心人告诉我,如何从 "最后两个平仓的回程票 "这个函数中制作 "最后一个平仓的回程票"。

而当我需要函数 "三个封闭位置的门票 "时,我无法(通过相似性和选择方法)实现它

请帮助。

你可以看到有两份副本,第二份有一些变化。但我能够继续它们......

我对第三张票有这种变体......但由于某种原因,它又返回了第一位置的票......。


替换

if(OrderTicket()==A && (OrderTicket()==B) )continue;

if(OrderTicket()==A || (OrderTicket()==B) )continue;

只是不清楚你在做什么,从一个函数返回三个值

 
Roger:


替换

只是不清楚你在做什么,从一个函数返回三个值



重点是计算最后N个位置的结果,为此我叫他们的票,然后就是技术问题了

fLastClosetPoz();
     OrderSelect( Ticket1,SELECT_BY_TICKET); X=OrderProfit(); SL1=OrderType(); TM1=OrderOpenTime();      Print (Ticket1); Print (SL1,"_",X); //ПОСЛЕДНИЙ 
     OrderSelect( Ticket2,SELECT_BY_TICKET); Y=OrderProfit(); SL2=OrderType(); TM2=OrderOpenTime();      Print (Ticket2); Print (SL2,"_",Y); //ПРЕДпоследний
     OrderSelect( Ticket3,SELECT_BY_TICKET); Z=OrderProfit(); SL3=OrderType(); TM3=OrderOpenTime();      Print (Ticket3); Print (SL3,"_",Z); //ПРЕД-ПРЕДпоследний
 
Roger:


替换为


它起作用了!说实话,我有这个想法,用OR代替AND....,但...:)))))))))))))))))))))

谢谢!现在我明白了这个逻辑,虽然要计算15个关闭的,我必须把代码吹成气球大小

能否将所有这些都压缩到一个循环中? 并只用所需的交易数量N来代替参数?

 
Zhunko:

1.你不应该这样做。它甚至表达了我对他的算法的钦佩之情。这就是HENRYFIX。他那时有一个不同的绰号。

脚本名称的前缀是我们昵称的第一个字母。

===============

2.德米特里,无论如何,我都由衷地高兴,你通过一些秘密算法解决了一些秘密问题,这是不可能公开的。

3.一切看起来都非常神秘。谢谢你的吹嘘。你无疑是这个论坛上最酷的程序员,甚至可能是整个宇宙中最酷的程序员!

1.哦,是的!在发现是你的代码,或你的朋友的代码之后。阿巴德,是最操蛋的,也是最尴尬的,现在马上变得令人钦佩。

2.我是一个程序员,我所知道的和我如何知道并能做到的,与我不知道的和不知道的 - 我会以某种方式处理它。

3.这个任务绝对不是秘密,它是绝对清楚的,它已经在这里被公开定义。所有能够理解它的人,都能立即理解,没有任何问题。它不是通过一些秘密和神奇的方法解决的,而是通过通常的标准和明显的(和世界闻名的)方法。我不是在这里吹牛,我是在嘲笑你,奇迹。 只有你的自大狂使你无法理解和意识到这一点。

 
Integer:

1.哦,是的!在它被证明是你的密码,或你的伴侣的密码之后。阿巴德兹,是最操蛋的,也是最难堪的,现在马上就能让人佩服。

2.我是一个程序员,我所知道的和我如何知道并能做到的,与我不知道的和不知道的 - 我会以某种方式处理它。

3.这个任务一点都不秘密,它是绝对清楚的,它已经在这里公开定义了。所有能够理解它的人,都能立即理解,没有任何问题。它不是通过一些秘密和神奇的方法解决的,而是通过通常的标准和明显的(和世界闻名的)方法。我不是在这里吹牛,对你,奇迹,我在笑。 只有你的自大狂使你无法理解和意识到这一点。




你们这些家伙,去别的地方蹭饭吧!人们在这里解决实际问题,而你们却在这里用情绪化的方式乱搞...。
 
lottamer:


你们去别的地方蹭饭吧!人们在这里解决实际问题,你们在这里用情绪 化的方式乱搞。


你为什么要给我写这个?以顺子为例,这是他在这里的第四天,他不能理解我们在说什么,其余的人在第一天就已经理解了。
 

当然,任何辩论都必须有限度。否则,它可能已经跨越了合理性的界限。

在陈述双方立场后,双方可能同意也可能不同意。- 那是他们的权利。即使人们是错误的。每个人都有做错的权利。

如果是公开辩论,就像这次一样,那么观看的人就会看到每一方的论点,不管在这个问题上是否达成共识,每个人都有机会选择自己版本的解决方案(或两者)。

但是,转而指责和呼吁个人(而不是任务、问题、案件),已经是在降低自己的可信度。这是不必要的,应受谴责的(因为侮辱了一个人)。


既然论点和解决问题的方法早已铺陈开来,我建议双方在这个问题上停下来,互相呼吁。

显然,如果说辩论者是解决纲领性问题的专业人士,那么他们就是辩论的新手。这并不与该主题脱节,但可以提供专业建议。我希望这个建议能得到重视。

 
Integer:

1.哦,是的!在它被证明是你的密码,或你的伴侣的密码之后。阿巴德兹,是最操蛋的,也是最难堪的,现在马上就能让人佩服。

2.我是一个程序员,我所知道的和我如何知道并能做到的,与我不知道的和不知道的 - 我会以某种方式处理它。

3.这个任务绝对不是秘密,它是绝对清楚的,它已经在这里被公开定义。所有能够理解它的人,都能立即理解,没有任何问题。它不是通过一些秘密和神奇的方法解决的,而是通过通常的标准和明显的(和世界闻名的)方法。我不是在这里吹牛,对你,奇迹,我在笑。只有你的自大狂使你无法理解和意识到这一点。

1.你知道代码和算法的区别吗?更重要的是,该算法与打开图表窗口毫无关系。当然,我已经修正了代码。图表打开的地方实际上并没有改变。当时我们没有其他选择。我在DLL中采用了不同的方式。它更可靠。

2.这很好!你是最棒的!

3:

常见问题

1) 问题:每个脚本(EA)都应该知道所有其他脚本的存在。

2) 问题:如果出现故障,来自故障的globals将被挂起而不被触动,队列会被卡住。

3) 解决方案:

每个exp组织1个globalka,名称为--通用前缀+窗口手柄+符号。globalka的值是该仪器上最后一个刻度的时间。2个普通的全局,有自己的句柄(工作后,它将自己的句柄写入其中,如果它是最古老的,则将其清除)

队列按升序排列(手柄),最高级的将第二个globale设置为零

在每个exp中,我们创建了三个数组(因为缺乏结构)--符号/手柄/最后访问时间/最后打勾时间。

所有的EXP都会跟踪它们的(最后访问时间/最后勾选时间),一旦它们不同(其中一个EXP失败),失败的EXP的两个globals就会被删除,它被认为是不活跃的。

队列被恢复

这实际上是由EA站在最活跃的图表上完成的(频繁点击)。

当正常去初始化时,每个expo会自己清理。

最大限度地跳过--打一个勾。

ZS.而一般来说,最好是做一个多币种的

所以这要归功于鲁斯塔姆的心灵感应能力。这是一个假想的问题和假想的解决方案。这与你的问题有什么关系?你从来没有说过这件事。我不得不撬开。答案无非是亵渎,而不是建设性的话语,你一直建议这样做,但没有实施。

我在2008年也遇到了类似的挑战。秘密是不行的,因为有些人。我将举一个具体的例子,说明什么样的问题,如何解决,以及为什么我认为用这种方式解决这种问题是不成功的。

============================

问题的初始数据。

1.该任务有几个相同的循环专家顾问。也就是完全独立的线程。

2.有一个分为8组的系数数据库,可供一些专家访问。DB大小从2Gb开始。

3.DB有时会得到补充。以2小时的倍数进行补给。处理时间取决于一天中时间的倍数。时间从5分钟到45分钟不等,取决于一天中时间的倍数和CPU的容量。

任务。

由于补充数据库需要大量的时间,所以应该只有一位专家负责补充数据库。否则,你可能无法等待它完成。

2.在数据库更新时,有必要禁止对其进行访问。分组进行,这样就不会大大减慢系数的更新速度,专家们都是用这种方式工作的。

使用系数工作的专家,目前正在更新,应该使用旧的系数工作。

在更新期间被切换到一个特定的系数组的专家应该使用一个单一的系数工作,并告知有关情况。当更新结束后,他们应该切换到新的系数。这同样适用于第3点。

当时的解决方案。

1.由他们的指数组成的专家标识符的共同队列被制成。

2.建立了一个由专家索引组成的专家识别码队列,这些专家访问数据库。

两个队列都是一个共同的资源。对队列的访问由一个单一的同步对象进行同步。

第二队列的第一位专家负责更新数据库。

5.此外,它几乎与鲁斯塔姆描述的一样。由于在DLL中的实现,它有点容易。

识别器是通过索引。当我们删除一个专家顾问时,该标识符会从队列中删除。不进行重新索引。剩余的专家将离开他们的索引。

当添加一个新的专家时,如果最后一个专家的索引与他们的编号不匹配,则会分配第一个空闲的旧索引。否则将分配新的指数。

与描述符和图表工具的绑定是没有必要的。此外,也不需要记录卸载失败的情况。从未出现过失败。即使它发生了,也不是一场灾难。环境署将继续使用旧的比例进行工作。到下一次更新时,更新计数器控制器将检测到没有更新,并从第二个队列中删除领先EA的ID。下一位专家将接过主人的任务。当专家顾问进入数据库连接模式时,同一个控制器会做同样的事情。即把它输入到第二个队列中。也就是说,只有从事M1工作的专家会受到影响,因为系数值并不关键。

这样的解决方案完全完成了任务,但我非常不喜欢它,因为专家顾问之间的绑定和专家顾问的不寻常任务,即为数据库提供信息,这并没有增加可靠性。那时候我不知道,也不知道如何做很多事情。一年后,我重新做了。

解决方案2。

1.数据库在一个单独的线程中维护,它在一个定时器上进行自我补充。

2.在数据库补充的时刻,对数据库的访问受到同步对象的保护。

这一切都变得容易多了。没有排队。但我也不太喜欢它。在补货之前,数据库调用报价交换的脚本,有时会导致内存溢出。这使MT4的速度降低了很多。当时MT4在2GB的内存下工作。它现在以4GB运行。

解决方案3。

1.DB是一个独立的应用程序。也就是说,另一个进程有自己的专用内存,独立于MT4。

2.DB正在进行自我补充。

数据交换通过映射发生。它提高了数据交换和补充数据库的速度。早些时候,一切都从磁盘中读取。否则就不可能做到这一点。МТ4的工作记忆是非常有限的。

4.历史记录是由MT4从DB应用程序中远程抽出的,你在那里根据需要踢它。MT4的任何故障 - 其卸载和随后的加载。

5.第4点是通过创建一个符号链接到当前MT4目录来完成。也就是说,它是当前MT4的完整拷贝。历史记录直接在飞行中更新到MT4目录中,无需等待工作的MT4上传。

6.在数据库更新的时候,通过mutex同步访问数据库,因为关键部分只对一个进程工作。

========================

所以,德米特里,在不了解你的任务的情况下,你可能认为不需要组织队列和保持专家顾问线程的独立性就可以解决这个问题。它将提高可靠性和整体性能。我已经谈了好几页了(独立的主题)。

 

对不起。这个问题没有答案。

Integer:

它是一个原子访问单元,没有同步性。只以这种方式解决存款问题是没有意义的。调用任何一个存款参数函数本身就会是原子性的,不需要任何调整。如果你以原子方式进行,专家顾问的所有工作。这就是你解决问题的方式--你认为你已经做了一些事情,但事实上这只是一个幻觉。

德米特里,你不应该认为周围只有傻子。从谢尔盖的问题中,你可以看出他对这个问题有很好的理解。

当然,简单地引用具有同步性的存款参数是没有意义的。改变这些参数需要同步进行。这样,并行的专家顾问就会收到已经被改变的正确参数,而不是在改变参数的过程中得到它。