Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Trading 如果头寸处于亏损状态,如何在一段时间后结束交易| MQL4_Trading_Algorithmic Trading_Mql4_Metatrader4 - Fatal编程技术网

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()
-test
False
,如上所述


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()
-test
False
,如上所述


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() );
                                }
                           }
}