初学者的问题 MQL4 MT4 MetaTrader 4 - 页 85

 
deathmond1990:
你好。问题是:我们能否将某个交易时段(即一个蜡烛)的ticks值(对应的价格)加载到一个一维数组中?而且要以这样的方式进行,即在形成蜡烛的过程中形成阵列。在MQL4中,这是否现实?我将感谢您的反馈。


它是真实的。一个动态的阵列 和去。

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


实事求是地说。一个动态阵列,然后就可以走了。

非常感谢您 =)
 
先生们,你们好!我不希望这成为洪水猛兽,但我不能没有这个功能。所以,伙计们,谁能帮我完成这个功能,它可以浏览所有的订单,同时删除两个订单,一个是最小的手数和负利润的订单,另一个是最大的手数和正利润的订单。
 
Arseniy Barudkin:
先生们,你们好!我不希望这成为洪水猛兽,但我不能没有这个功能。所以,伙计们,谁能帮我完成这个功能,它可以浏览所有的订单,同时删除两个订单,一个是最小手数和负利润的订单,另一个是最大手数和正利润的订单,也是从现有订单中删除。

尝试搜索OrderCloseBy
 

如何使所有全局变量的数据在正常和异常模式下关闭终端后仍能保存?

这个问题涉及到在代码开始时声明的变量,比如说。

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

我需要不丢失VAR1和VAR2的值(在Expert Advisor的操作过程中,数组中充满了数据)。到目前为止,唯一的想法是在每次打勾时将数据写入一个文件(global.txt),然后在终端启动 时,从文件(global.txt)中读取并重新创建变量,然后在每次打勾时再次写入这些变量。还有什么其他选择?

 
smart_man:

如何确保所有全局变量的数据在正常和非正常模式下,即使在客户终端关闭后也能保留下来?

这个问题涉及像这样声明的变量。

extern double  VAR1 = 1;

double VAR2[1000];

我需要不丢失VAR1和VAR2的值(在Expert Advisor的操作过程中,数组中充满了数据)。到目前为止,唯一的想法是在每次打勾时将数据写入一个文件(global.txt),然后在终端启动 时,从文件(global.txt)中读取并重新创建变量,然后在每次打勾时再次写入这些变量。还有什么其他选择?

选项

客户终端的全局变量

//--------

不要与全局声明的变量相混淆

 
fxtz:

问题 我能否在Metatrader 4中编写一个程序,在设定了止损和利润的情况下,一键开启2至250个我选择的头寸?我不需要手动打开一个


你有没有找到一家经纪公司,可以为一个工具开这么多订单?通常情况下,100个订单是所有工具的限制...

是的,我可以打开100个。

 
Alekseu Fedotov:

尝试搜索OrderCloseBy

谢谢你!但我必须从至少3个订单中选择这些订单的票,最常见的是有5到10个订单,我真的要分别计算和比较这些订单的手数和利润吗?

 
Arseniy Barudkin: 我们必须选择订单的代号,那么我们为什么要分别计算和比较这些订单的手数和利润呢?

情况比你想象的要糟糕得多。在任何时候,只有一个由OrderSelect() 选择的订单可以使用。而当最开始的订单被选中时,我们应该把它与什么进行比较?聪明的人真的是这样做的

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
然后再看看发现的门票的价值--突然间它们就变成了零!!!。
 
STARIJ:

情况比你想象的要糟糕得多。在任何时候,只有一个由OrderSelect() 选择的订单可以使用。而当最开始的订单被选中时,我们应该把它与什么进行比较?聪明的人真的是这样做的

然后看一下找到的票的价值--突然间它们就变成了零!!!。

谢谢你的帮助!到目前为止,我一直让它像这样,现在我决定稍微改变一下调用该函数的条件。总的来说,你给了我很大的帮助))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}
原因: