新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 82

 
trader781:
你会得到最后失去的那个,用它做什么,为自己调整什么参数,我想你会想明白的。

谢谢,我想我已经知道了。

如何使获利 后的手数恢复到原来的价值?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
并非如此)。
 
wishmast:

谢谢,我想我已经知道了。

我如何在获利 后让这批货恢复到原来的价值?

if (OrderProfit()>0 && OrderType()<2)
            {
            lot=0.1
            }
并非如此)。

我有以下计划

如果(OrdersTotal()==0)

{

以最初的地段开盘

}

否则

...

也就是说,如果没有订单,它将不会以旧的批次打开。

当然有可能记住每个订单,但他们没有告诉我们如何做。
 
Vitalie Postolache:
一个计数器应该被启动,并在达到某个阈值时重置为初始值。

谢谢你。

帮我解决一个问题。
有3个买入头寸,一个卖出头寸出现,我们需要关闭 卖出头寸 和最古老的买入头寸。应该保留两个买入位置。
我把它们都关闭了。

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

 

解释一下为什么OrderProfit()<0函数不起作用?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

我想看看一周内 有多少次止损。

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()>0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

在这里,我认为这也是它不工作的原因。

 
wishmast:

解释一下为什么OrderProfit()<0函数不起作用?

   for(int q=OrdersHistoryTotal()-1; q>=0; q--)
      {
      if(OrderSelect(q,SELECT_BY_POS,MODE_HISTORY))
         {
         if(OrderType()<2 && OrderMagicNumber()==magic)
            {
            if (OrderProfit()<0)
               {
               if (DayOfWeek()==1)
                  {
                  day1++;
                  Print ("Понедельник SL=",day1);
                  }
               if (DayOfWeek()==2)
                  {
                  day2++;
                  Print ("Вторник SL=",day2);
                  }
               }
            }
         }
      
      }

我想看看一周内 有多少次止损。

for(int l=OrdersHistoryTotal()-1; l>=0; l--)
        {
        if(OrderSelect(l,SELECT_BY_POS,MODE_HISTORY))
           {
           if(OrderProfit()<0 && OrderType()<2)
              {
              oldticket=OrderTicket();
              }
           if (oldticket>=ticket)
              {
              ticket=oldticket;
              lot=OrderLots()*4;
              }
           if (OrderProfit()<0 && OrderType()<2)
              {
              lot=0.01;
              }
           }
        }

在这里,我认为这也是它不工作的原因。

因为DayOfWeek()返回最后已知的服务器 时间的星期的顺序号。

而你需要订单关闭时间的星期:TimeDayOfWeek(OrderCloseTime())。

 
Artyom Trishkin:

因为DayOfWeek()返回最后已知的服务器 时间的星期的顺序号。

而你需要订单关闭时间的星期:TimeDayOfWeek(OrderCloseTime())。

但结果是一样的,就像忽略了if(OrderProfit()<0)和有一个循环一样,变量得到了大数值

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

我在这里错误地复制了它,纠正了符号if(OrderProfit()>0&&OrderType()<2),但这并没有改变本质,没有这个条件,循环也能正常工作。

 
wishmast:

但结果是一样的,因为如果(OrderProfit()<0) 被忽略,并且有一个循环,变量的值很大

2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430208
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963666
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Вторник SL=1430207
2017.01.19 00:42:47.883 2014.02.20 23:59:48   EURUSD,H1: Понедельник SL=963665

我把它错误地复制到这里,纠正了if(OrderProfit()>0&&OrderType()<2) 的符号,但这并没有改变本质,循环在没有这个条件的情况下正常工作。

第1天和第2天在哪里声明?
 
Artyom Trishkin:
第1天和第2天在哪里声明?
作为全局,在开始时,在OnTick()和所有函数之前
 
Artyom Trishkin:
第1天和第2天在哪里声明?

我怀疑我选择的订单 不正确,它不起作用OrderProfit()<0),我需要更具体地说明我需要哪个订单我不知道为什么当最后一个订单在Take-Point关闭而没有其他订单时,它会跳过一个订单。 也许,如果我想通过历史搜索,循环应该以不同的方式构建?

for(int w=OrdersHistoryTotal()-1; w>=0; w--)
      {
      if(OrderSelect(w,SELECT_BY_POS,MODE_HISTORY))

原因是Expert Advisors用类似的条件建立循环,它们按要求工作,但它们使用OrdersTotal() 工作。

for(int n=OrdersTotal()-1;n>=0;n--)            
         {                                          
         if(OrderSelect(n,SELECT_BY_POS))            
            {                                        
            if(OrderMagicNumber()==magic)                  
               {
               if(OrderType()>OP_SELL)
 
sile:
谢谢你。

帮我解决一个问题。
有3个买入头寸,一个卖出头寸出现,我们需要关闭 卖出头寸 和最古老的买入头寸。应该保留两个买入位置。
所有这些都已关闭。

void OnTick()
  {
//---
int b_STOP,s_STOP,b=0,s=0;

  for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY) b++;
        if (OrderType()==OP_SELL) s++;
        if (OrderType()==OP_BUYSTOP) b_STOP++;
        if (OrderType()==OP_SELLSTOP) s_STOP++;      
      }  
     if (OrderType()==OP_BUY)
     {
     if(b>=1&&s==1)//бай позиций больше или 1 и появилась SELL позиция
     {
      OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
      CLOSEORDER(OP_SELL);
     }
     }
    }
  }

这不可能在一个周期内得到解决。在这个循环中,你应该记住数组中要删除的订单的代号,在下一个循环中,你应该按代号删除它们。

此外,你有一个混乱的大括号,你在OrderSelect{} 块之外处理订单,这是不正确的。