// Читаем отсортированный массив с лотами // 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] );
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
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
例如,这里https://docs.mql4.com/ru/basis/preprosessor/compilation
在目前的例子中,我希望能够以任何手数下无限多的订单,以不超过其限制。
当然,我们都知道限制,但我想这样做
我的出发点是,如果你在括号中指定一个元素,它将是最后一个元素
所以我得到了这种废话。我正期待着一个按顺序排列的...我希望结果(这种订单的手数*系数)被添加到订单中,而不是手数。
以及从那里检索数据的问题
我想得到我所看到的以下结果
我的Array[0][0.01]。
我的Array[1][0.01]。
我的Array[2][0.02]。
等...
那么实际的问题是什么呢?
你写了一个包含手数的数组,然后按手数排序,它将按开仓数排序,因为在你的案例中,每一个下一个仓位的开仓数都比较大。
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()
}
然后应用如下:计算总的位置数,如果少于三个,则不访问数组,如果多于三个,则读取数组并从中获取数据。
阵列的输出不是在写的那一刻,而是在读的那一刻。
阵列的输出不是在写的时候发生的,而是在读的时候发生的。
不对。在访问一个不存在的数组索引 的时候。
那么我写了什么?
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中不起作用。
然后以某种方式将其从函数中提取到流中。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中不起作用
结构将帮助你。你创建一个带有必要字段的结构,声明一个 这样的结构数组,在循环中通过打开时间填充订单数据,然后在其中搜索你需要的一切。通过索引检查结构的字段,并将其与必要的值进行比较。索引将按开盘时间显示订单号,关于这个具体订单的所有必要数据都将在结构的字段中给出。
这就是我们所得到的狗屎。
{
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批进行比较。
将开盘价相加,除以头寸数
我们需要一个命令条目来处理这种事情。
我们已经有了这种狗屎。
{
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?
由于循环索引i指的是任何订单,而不仅仅是你需要的订单,你应该在函数中声明一个变量(例如n=0;),它将负责数组的大小。通过检查后,在循环内增加这个变量的值,用这个变量的值增加数组的大小,用索引n-1填写结构字段:orders[n-1].xxx=XXX。