我用 1H
& 4H
周期,&我正在尝试实现编码,如果它处于亏损状态,则会关闭一个位置。到交易周期的一半时(PERIOD_CURRENT
)。
贸易周期4H
= 4 [hr]
= 240 [min]
= 14,400 [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 <<<<<
如果贸易在时间损失,请关闭一半 = 14,000,000 + (60 * 240*0.5) = 140,007,200
for ( int earlcloses = OrdersTotal() - 1; earlcloses >= 0; earlcloses-- )
{
if ( OrderSelect( earlcloses, SELECT_BY_POS, MODE_TRADES ) )
if ( OrderType() == OP_SELL )
if ( OrderMagicNumber() == Period() )
if ( OrderOpenTime() + ( 60 * Period() * 0.5 ) <= TimeCurrent() )
if ( OrderOpenPrice() < Bid )
{ // |||||||||||||||||||||||||||||||||||||||||||
/* --serially-nested-if()-s CODEBLOCK-{}-START--- */
earlcloses = OrderClose( OrderTicket(),
LotSize,
MarketInfo( sym, MODE_BID )
+ MarketInfo( sym, MODE_SPREAD )
* MarketInfo( sym, MODE_POINT ),
300,
clrNONE
);
/* ------------------------ CODEBLOCK-{}-FINISH--- */
} // ||||||||||||||||||||||||||||||||||||||||||||
if ( earlcloses == true )
{ Sleep( 60000 );
int earlyclosesel = OrdersHistoryTotal()-1;
bool earlySelect = OrderSelect( earlyclosesel, SELECT_BY_POS, MODE_HISTORY );
if ( earlySelect == true )
{
int earlTicket = OrderTicket();
SendMail( "Notification of early position closure", "Trade #" + IntegerToString( earlTicket, 0 ) + "has been closed at" + DoubleToStr( OrderClosePrice(), 5 ) + "due to timeout" );
}
else if ( earlySelect == false )
{
Print( "EarlyClose failed with error #", GetLastError() );
}
}
}
答案 0 :(得分:0)
MQL4
应该很好地理解语言构造函数的语法:如上所述,当且仅当满足所有串行嵌套earlcloses = OrderClose(...);
条件时,代码才会执行单个命令if()
。
之后(仅有条件地执行CODEBLOCK-{}
),有一条下一行,相反,在每个for(){...}
循环中评估,除了最后一行:
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
测试,这会产生True
的 if(...)
输出test和以下{...}
代码将被执行(for()的最后一个循环除外,earlcloses == 0
,因此产生if()
- test {{1} } ,如上所述。
False
应遵守XTO规则,参考。其他你的问题提交服务器端执行的说明,请务必正确设置价格。阅读 OrderClose()
,而不是处理来自RefreshRates()
和的结果,因为您在之前的问题中已多次重复,MarketInfo()
。
NormalizeDouble()
代码永远不依赖于db.Pool MQL4
:而是使用ORDER_BY_POS
db.Pool- DMA -mode。如您的代码中所列,隐式基于位置的假设导致情况,当OrderTicket()
中没有记录时 - db.Pool的一部分,而HISTORY
的盲目尝试将失败。
OrderSelect( ..., MODE_HISTORY )
( OrderOpenTime() + 0.5 * PeriodSeconds( PERIOD_CURRENT ) <= TimeCurrent() )
代码概念中的最差错误是在干预分配中,损坏了MQL4
- 循环控制的逻辑变量这显而易见:
for(){...}
第一个for ( int earlcloses = OrdersTotal() - 1; earlcloses >= 0; earlcloses-- )
{ if ( ...
..
.
{ earlcloses = OrderClose( OrderTicket(), ... );
}
...
}
调用会杀死整个OrderClose()
逻辑,通过它干预 for(){...}
-last循环值{none|one}
到循环控制变量中。
一旦您在最后四个问题中发布了一条评论,您就会因为没有按照您的意愿运行代码而感到厌恶,因为否则,您有一个有利可图的策略,聘请专业人士似乎是合理的两倍为您做正确和稳健的算法化。与纠正单个代码片段相比,它可以更快地为您提供策略RTO。
答案 1 :(得分:0)
建议。请阅读评论:
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() );
}
}
}