初学者的问题 MQL5 MT5 MetaTrader 5 - 页 574

 
Anton Balakirew:
在买入或熊市握手信号时开仓的想法,如何让它只有一个买入/卖出交易和一个挂单 交易,我在交易的每一个刻度上都有一个开仓。帮助解决这个问题。
在您开立新的头寸或下新的挂单之前,请检查已设定的订单数量和未结头寸数量。
 
Artyom Trishkin:

那么,这里有另一种方法:为范围内的每个蜡烛写上火柴。在以前的版本中,只为一支蜡烛写了匹配--也就是说,没有为与这支蜡烛匹配的蜡烛写匹配。

Artem,谢谢你。我将研究这个问题。

pako:

高值可以四舍五入,例如,我们可以将1.23456的值四舍五入为1.2346。


我明白我的意思。我还在设置中添加了一个变量,你可以规定偏差,在这个偏差范围内,高值被认为是相等的。这是必要的,因为对于4位数的引号来说,往往不存在这样的问题,但对于5 位数的引号来说,搜索精确匹配的可能性是无限的。

 
Andrey Koldorkin:

Artem,谢谢你。我会研究的。

四舍五入的情况很明显。我还在设置中加入了一个变量,在这个变量中,我将能够规定偏差值,在这个偏差值内,高值被认为是相等的。这是有必要的,因为对于4位数的报价来说,往往没有这样的问题,但对于5位数的报价来说,寻找完全匹配的报价是无止境的。

不客气。我在第二个版本中犯了一个不准确的错误。因为在第一个版本中,我们是从循环索引的下一个蜡烛开始搜索匹配的,所以主循环的传递是通过蜡烛的数量减去1来比较最外层的两个蜡烛。现在,在第二个版本中,对于每一个蜡烛图,我们在整个范围内搜索匹配,因此在行中

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

你应该将条数 改为

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
在您开立新的头寸或下新的挂单之前,请检查已设订单的数量和未结头寸的数量。

也就是说,有必要在交易条件中添加一个条件来检查订单 和头寸的数量

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition

如果(OrdersTotal()==0) //第二个条件

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0);; }...................................,每笔交易都是如此?

那么哪个职能部门会计算开放职位的数量?

我想我已经解决了这个问题。

如果(Hour()>=0&Hour()<23){

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

如果(PositionsTotal()<=1)

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0);; }//开启购买

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

如果(PositionsTotal()==1&OrderType()==0)

OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);{HotTag}。//推迟的卖出止损单

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

如果(PositionsTotal()<=1)

OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0);; }//打开塞尔

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

如果(PositionsTotal()==1&OrderType()==1)

OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);}//推迟的买入止损单

}

//+------------------------------------------------------------------+

//返回未平仓头寸总数的函数。

//|

//+------------------------------------------------------------------+

int PositionsTotal() {

int pos = 0。

for (int i=0; i<OrdersTotal(); i++){

OrderSelect(i, SELECT_BY_POS, MODE_TRADES)。

如果(OrderType() == OP_BUY || OrderType() == OP_SELL)

pos++。

}

return(pos)。

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

那么,这里有另一种方法:为范围内的每个蜡烛写上火柴。在以前的版本中,只为一支蜡烛写了匹配--也就是说,没有为与这支蜡烛匹配的蜡烛写匹配。

很好。但在我看来,如果蜡烛2的高点与蜡烛7的低点重合,那么将找到两个匹配点:2<=>7,7<=>2。那么考虑到反向对,但没有额外的循环呢?

你就不能在不使用嵌套for循环的情况下,一次解决这个问题吗:)))?

 
Vasiliy Sokolov:

咕德。然而,根据我的理解,如果蜡烛2的高点与蜡烛7的高点重合,那么将找到两个匹配:2<=>7,7<=>2。那么考虑到反向对,但没有额外的循环呢?

不使用嵌套的for循环,一次性解决这个问题,怎么样?)

:)不要试图扮演我的弱者;)当然,我认为你可以用一个循环来解决这个问题,但我懒得多想,按照自己的想法一下子就做了。

当然,这里所有成对的或更多的蜡烛都被记录在每个蜡烛的匹配数据中。这就是为什么他们相互参照。我只是在建议变体,不知道它们的用途是什么。

而且,进一步解决优化计算的任务是可能的,但我不需要它。

如果你需要的是每支蜡烛和所有匹配的数据,如果突然,突然......怎么办?只有....

所以我没有时间,也没有愿望。我已经浪费了我的时间,而不是写我自己的代码。

SZY,也许你也应该在知道所需输入参数的情况下连接Kohonen方法。

 
Artyom Trishkin:

一般来说--没有时间,也没有愿望。就这样浪费了时间,而不是写我自己的代码。

这是一个遗憾,一个真正的遗憾。
 
Vasiliy Sokolov:
太糟糕了,太糟糕了。
嗯,是的,这是一个有趣的任务,但可惜,我没有时间。
 
Artyom Trishkin:

不客气。我在第二个版本中犯了一个不准确的错误。由于第一个版本是从循环索引的下一个蜡烛开始搜索匹配的,所以主循环是通过蜡烛的数量减去1来比较最外层的两个蜡烛。现在,在第二个版本中,对于每一个蜡烛图,我们在整个范围内搜索匹配,因此在行中

你应该把小节的数量 改为

请告诉我们这些句子的含义。

输入 int Search_Period=10; // 要复制的烛台数量

int searchPeriod=(Search_Period<1)?1:Search_Period; // "?", ": "符号是什么意思?

输入 int Delta=2; // 收容点的数量

int delta=(Delta<0)?0:Delta; // 符号"?"、": "是什么意思?

 
Andrey Koldorkin:

请告诉我这些句子的含义。

输入 Search_Period=10; // 要复制的烛台数量

int searchPeriod=(Search_Period<1)?1:Search_Period; //字符"?"、": "是什么意思?

输入 int Delta=2; // 收容点的数量

int delta=(Delta<0)?0:Delta; // 符号"?"、": "是什么意思?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

从参考资料来看。

条件运算符 ?

三元运算符 的一般形式看起来像这样。

expression1? expression2: expression3

作为第一个操作数,"expression1 "可以是任何导致bool类型值的表达式。如果结果为 ,则执行第二个操作数 "expression2 "所指定的运算符

如果第一个操作数 假的,第三个操作数 "expressionZ " 将被执行。第二个和第三个操作数,即 "expression2 "和 "expressionZ",必须返回相同类型的值,并且不能是无效类型。执行条件运算符的结果是 "表达式2 "的结果或 "表达式3 "的结果,这取决于 "表达式1 "的结果。

double true_range = (High==Low)?0:(关闭-打开)/(高-低)。

该条目等同于以下内容

double_range。

如果(High==Low)true_range=0;//如果High和Low相等

else true_range=(Close-Open)/(High-Low);//如果High不是零 的话。