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

 
Alexey Viktorov:
例如,这里https://docs.mql4.com/ru/basis/preprosessor/compilation
谢谢你!
 
trader781:

在目前的例子中,我希望能够以任何手数下无限多的订单,以不超过其限制。

当然,我们都知道限制,但我想这样做

我的出发点是,如果你在括号中指定一个元素,它将是最后一个元素

所以我得到了这种废话。我正期待着一个按顺序排列的...我希望结果(这种订单的手数*系数)被添加到订单中,而不是手数。

以及从那里检索数据的问题

我想得到我所看到的以下结果

我的Array[0][0.01]。

我的Array[1][0.01]。

我的Array[2][0.02]。

等...

那么实际的问题是什么呢?

你写了一个包含手数的数组,然后按手数排序,它将按开仓数排序,因为在你的案例中,每一个下一个仓位的开仓数都比较大。

double BPosMass[];
double SPosMass[];

void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
  for(int i=0; i<OrdersTotal(); i++) {
   if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
     if(OrderType()==OP_BUY) {
      b++;
       ArrayResize(BPosMass,b+1);
       BPosMass[b]= OrderLot();
     }
     if(OrderType()==OP_SELL) {
      s++;
       ArrayResize(SPosMass,s+1);
       SPosMass[s]= OrderLot();
     }
  }}} // конец записи массив

// Читаем отсортированный массив с лотами
// Buy
  if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Buy лот: ",    BPosMass[0],
            "\nПоследний Buy лот: ",     BPosMass[b],
            "\nПредпоследний Buy лот: ", BPosMass[b-1]
           );

  } // end Buy

// Sell
  if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
    ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
    // Работа с полученными данными
    Comment("Самый старый Sell лот: ",    SPosMass[0],
            "\nПоследний Sell лот: ",     SPosMass[s],
            "\nПредпоследний Sell лот: ", SPosMass[s-1]
           );

  } // end Sell
  
// Конец функции OnTick()
}


然后应用如下:计算总的位置数,如果少于三个,则不访问数组,如果多于三个,则读取数组并从中获取数据。

阵列的输出不是在写的那一刻,而是在读的那一刻。

 
Vitaly Muzichenko:


阵列的输出不是在写的时候发生的,而是在读的时候发生的。

不,在访问一个不存在的数组索引 的时候。
 
Vitalie Postolache:
不对。在访问一个不存在的数组索引 的时候。
那么,我写了什么?
 
Vitaly Muzichenko:
那么我写了什么?

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders不变,地段变化。它不应该是这样的,但它没有任何其他的工作方式

理想情况下,条目MyArray[CountOrders][OrderLots()]

所以输出将是MyArray[0][0.01]MyArray[1][0.01]

但这在µl中不起作用。

然后以某种方式将其从函数中提取到流中。
 
trader781:

2017.01.1312:51:14.3722017.01.0516:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.1312:51:14.3722017.01.0516:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01

CountOrders不变,地段变化。它不应该是这样的,但它没有任何其他的工作方式

理想情况下,条目MyArray[CountOrders][OrderLots()]

所以输出将是MyArray[0][0.01]MyArray[1][0.01]

但这在µl中不起作用

结构将帮助你。你用必要的字段创建一个结构,声明一个 这样的结构数组,在循环中通过打开时间填充订单数据,然后通过它寻找你需要的一切。通过索引检查结构的字段,并将其与必要的值进行比较。索引将按开盘时间显示订单号,关于这个特定订单的所有必要数据将显示在结构的字段中。
 
Artyom Trishkin:
结构将帮助你。你创建一个带有必要字段的结构,声明一个 这样的结构数组,在循环中通过打开时间填充订单数据,然后在其中搜索你需要的一切。通过索引检查结构的字段,并将其与必要的值进行比较。索引将按开盘时间显示订单号,关于这个具体订单的所有必要数据都将在结构的字段中给出。

这就是我们所得到的狗屎。

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


我想取出,例如,一个订单的第5批,并与第3批进行比较。

将开盘价相加,除以头寸数

我们需要一个命令条目来处理这种事情。

 
trader781:

我们已经有了这种狗屎。

struct myorder
{
int    Ticket;
double orderopenprice;
int   ordertype;
double profit;
double stoploss;
double  lot;
};

myorder orders[];

int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
         orders[i].Ticket=OrderTicket();
         orders[i].lot=OrderLots();
         orders[i].orderopenprice=OrderOpenPrice();
         orders[i].ordertype=OrderType();
         orders[i].profit=OrderProfit();
         orders[i].stoploss=OrderStopLoss();
     }
}    


我想拿出一个订单中的第5批,与第3批进行比较。

将开盘价相加,除以头寸数

我需要一个条目本身,以命令的形式来处理这种事情

由于循环索引i指的是任何顺序,而不仅仅是你需要的那些,你应该在函数中声明一个变量(例如,n=0;),它将负责数组的大小。通过检查后,在循环内增加这个变量的值,用这个变量的值增加数组的大小,根据索引n-1填写结构字段:orders[n-1].xxx=XXX。

 

请告诉我为什么OrdersTotal()函数 在搜索订单的时候会写-1。

例子: for (i=OrdersTotal()-1 ;i>=0; i--)

为什么不直接使用OrdersTotal()?

这个函数中的订单数是从0开始还是从1开始?也就是说,如果有一个订单,OrdersTotal()是等于0还是1?

 
Artyom Trishkin:

由于循环索引i指的是任何订单,而不仅仅是你需要的订单,你应该在函数中声明一个变量(例如n=0;),它将负责数组的大小。通过检查后,在循环内增加这个变量的值,用这个变量的值增加数组的大小,用索引n-1填写结构字段:orders[n-1].xxx=XXX。

既然我们有一包订单,为什么不能直接拉出正确的订单?(必要的),并做我们想做的事? 例如,命令(i-4)
原因: