Trading 如果头寸处于亏损状态,如何在一段时间后结束交易| MQL4
我在Trading 如果头寸处于亏损状态,如何在一段时间后结束交易| MQL4,trading,algorithmic-trading,mql4,metatrader4,Trading,Algorithmic Trading,Mql4,Metatrader4,我在1H和4H周期上交易&我试图在交易周期的一半时间(当前周期)实施一种编码,以关闭处于亏损状态的头寸 贸易周期4H=4[hr]=240[min]=14400[s] 交易周期为4H,因此如果交易在最初开盘2小时后出现亏损,我希望能够自动平仓 基于时间,自1970年1月1日以来以秒为单位,我将TimeCurrent()与OrderOpenTime()+以秒为单位的False,这将从if(…)测试中产生true输出,并且将执行以下{…}代码(for()的最后一个循环除外),其中earlcloses=
1H
和4H
周期上交易&我试图在交易周期的一半时间(当前周期
)实施一种编码,以关闭处于亏损状态的头寸
贸易周期4H
=4[hr]
=240[min]
=14400[s]
交易周期为4H
,因此如果交易在最初开盘2小时后出现亏损,我希望能够自动平仓
基于时间,自1970年1月1日以来以秒为单位,我将TimeCurrent()
与OrderOpenTime()
+以秒为单位的<4H
进行了比较,但将其除以2得到两小时后的时间
但是,这不起作用-我添加了下面的代码
如果有人能解释这一点,我们将不胜感激
示例
OrderStartTime = 14,000,000
OrderCloseTime = 14,000,000 + 60 minutes * 240 minutes = 14,014,400 <<<<<
MQL4
应该很好地理解语言构造函数的语法:
如上所述,代码正在执行单个命令earlcloses=OrderClose(…)代码>当且仅当满足所有串行嵌套的if()
-条件时
紧接着(仅有条件地执行CODEBLOCK-{}
),
还有一行,在()的每个循环回合中,除最后一行外,都会对该行进行相反的计算:
if ( earlcloses == true )
此if()
-条件在所有情况下都计算为True,但在最后一次for(){…}
循环循环中除外,因为在最后一次循环之前,for(){…}
循环--控制变量声明为
for( int earlcloses = OrdersTotal() - 1; // .SET initial value
earlcloses >= 0; // .TEST before a loop-execution starts
earlcloses-- // .UPD after a loop-execution
){...}
这意味着您的代码到达(earlcloses==true)
测试时总是带有一个值>False
,这将从if(…)
测试中产生true
输出,并且将执行以下{…}
代码(for()的最后一个循环除外),其中earlcloses==0
,从而产生if()
-testFalse
,如上所述
OrderClose()
应遵守XTO规则,请参考您的其他问题
提交服务器端执行的指令时,请确保正确设置了价格。请阅读刷新率()
,而不是像在前面的问题中多次重复的那样,处理MarketInfo()
和的结果,始终NormalizeDouble()
健壮的MQL4
代码从不依赖于数据库。池按位置排序
:
而是使用OrderTicket()
db.Pool-DMA-模式。正如您的代码中所列,当db.Pool的HISTORY
-部分中没有记录时,隐式基于位置的假设会导致这种情况,盲目尝试OrderSelect(…,mode\u HISTORY)
将失败
时间比较应正确:
第一个OrderClose()
调用通过在循环控制变量中插入{0 | 1}
值,杀死整个for(){…}
逻辑留下{none | one}
-最后一个循环
后记:
一旦你在最后四个问题中的一个问题上发表了一条评论,你会对没有按照自己的意愿运行代码感到厌恶,因为否则,你有一个盈利的策略,雇佣一名专业人员为你正确而稳健地完成算法似乎是合理的两倍。这将使你的策略更加有效比更正单个代码片段更重要。MQL4
应该很好地理解语言构造函数的语法:
如上所述,代码执行单个命令earlcloses=OrderClose(…);
当且仅当满足所有串行嵌套的if()
-条件时
紧接着(仅有条件地执行CODEBLOCK-{}
),
还有一行,在()的每个循环回合中,除最后一行外,都会对该行进行相反的计算:
if ( earlcloses == true )
此if()
-条件在所有情况下都计算为True,但在最后一次for(){…}
循环循环中除外,因为在最后一次循环之前,for(){…}
循环--控制变量声明为
for( int earlcloses = OrdersTotal() - 1; // .SET initial value
earlcloses >= 0; // .TEST before a loop-execution starts
earlcloses-- // .UPD after a loop-execution
){...}
这意味着您的代码到达(earlcloses==true)
测试时总是带有一个值>False
,这将从if(…)
测试中产生true
输出,并且将执行以下{…}
代码(for()的最后一个循环除外),其中earlcloses==0
,从而产生if()
-testFalse
,如上所述
OrderClose()
应遵守XTO规则,请参考您的其他问题
提交服务器端执行的指令时,请确保正确设置了价格。请阅读刷新率()
,而不是像在前面的问题中多次重复的那样,处理MarketInfo()
和的结果,始终NormalizeDouble()
健壮的MQL4
代码从不依赖于数据库。池按位置排序
:
而是使用OrderTicket()
db.Pool-DMA-模式。正如您的代码中所列,当db.Pool的HISTORY
-部分中没有记录时,隐式基于位置的假设会导致这种情况,盲目尝试OrderSelect(…,mode\u HISTORY)
将失败
时间比较应正确:
第一个OrderClose()
调用通过它的介入assig杀死整个for(){…}
逻辑留下{none | one}
-最后一个循环
for ( int earlcloses = OrdersTotal() - 1; earlcloses >= 0; earlcloses-- )
{ if ( ...
..
.
{ earlcloses = OrderClose( OrderTicket(), ... );
}
...
}
for ( int orderIndex = OrdersTotal() - 1; orderIndex >= 0; orderIndex-- ) {
//Note: You are closing ALL orders regardless of Symbol() of the current chart!!
if ( OrderSelect( orderIndex, SELECT_BY_POS, MODE_TRADES ) )
if ( OrderType() == OP_SELL )
if ( OrderMagicNumber() == Period() )
if ( (TimeCurrent()-OrderOpenTime()) >= (60*Period()/2) )
if ( ( OrderProfit() // P&L
+ OrderCommission() // needs to factor in Commission
+ OrderSwap() // needs to factor in all Swaps
) < 0.0 ) {
// --------------------------------------------------
RefreshRates(); // VERY IMPORTANT
// --------------------------------------------------
int closedTicket = OrderTicket();
if ( OrderClose( closedTicket,
OrderLots(),
MarketInfo( Symbol(), MODE_ASK ), //You are closing a SELL trade, should use ASK price.
300, clrNONE ) ) {
SendMail( "Notification of early position closure",
"Trade #" + IntegerToString( closedTicket, 0 )
+ " has been closed at " + DoubleToStr( MarketInfo( Symbol(), MODE_ASK), 5 ) + " due to timeout."
);
}
else {
Print( "EarlyClose failed with error #", GetLastError() );
}
}
}