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

 
Ihor Herasko:

至少写一个区块并展示出来。下一步是在这里提出建议。

关于数组:在这里我在全局层面上声明了4个数组。

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

然后我在开仓 功能中把它们归零。

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

我现在如何填补它们?在我想做的例子中,应用了一个额外的变量,但我不明白如何使用它。

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

虽然不太清楚为什么会有这些数组,而我可以用相应的函数得到票据、头寸类型、开仓价格和开仓时间的值。

 
novichok2018:

关于数组:在这里我在全局层面上声明了4个数组。

然后我在开仓 功能中把它们归零。

我现在如何填补它们?我想用的例子应用了一个额外的变量,但我不明白如何使用它。

虽然不太清楚为什么会有这些数组,而我可以用相应的函数得到票据、头寸类型、开仓价格和开仓时间的值。

试着从头开始写,用Alert()输出所有的中间数据。比如说

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

如果你以某人为榜样,要完全接受并研究它。谁知道这个例子的作者用数组做什么?

 
novichok2018:

关于数组:在这里我在全局层面上声明了4个数组。

使用一个结构数组。它将更容易进入。下面是一个带有静态数组的变体。它更容易理解。但我自己也使用动态数组。但有了它们,代码会变得更大一些。

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

然后我把他们的位置开放 的功能归零。

不,你没有。因为声明的动态数组默认大小为零。所以在这种情况下,这四行代码什么都不做。

现在,你如何填写它们呢?我想用的例子有一个额外的变量,但我不明白如何使用它。

接下来--组织一个订单的循环,其中每个 "自己的 "订单被存储在一个数组中。

g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
   if (!OrderSelect(i, SELECT_BY_POS))
      continue;

   if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
      continue;

   if (OrderMagicNumber != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
      continue;

   if (g_nOrderCnt < MAX_ORDERS_CNT)
      continue;

   g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
   g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
   g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
   g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
   g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();

   ++g_nOrdersCnt;
}

虽然,我不太清楚这些数组有什么用,因为我可以用相应的函数得到票据、头寸类型、开仓价和开仓时间的值。

使用数组工作要快得多,也方便得多,因为一般来说,账户中存在的所有订单都不需要由这个特定的EA处理。而我们将因此而节省大量的精力和金钱。

此外,我上面提到的是一个一般的案例。当然,并不总是需要普遍主义。通常,这种数组是根据策略的要求创建的。例如,我们可以一次性按类型划分订单。买入,卖出,BuyStop,SellStop,BuyLimit,SellLimit。那么我们将需要四个这样的数组。但这样一来,我们在做交易决策时就不需要再去看整个未结订单的清单了。我们只需要知道某种类型的订单数量并参考必要的数组。

还有一件重要的事情要考虑:在处理一个tick的过程中改变订单阵列。很可能发生的情况是,在OnTick的入口处收到一个订单列表,而在中间的某个地方收到另一个。这将导致程序运行中出现难以捕捉的错误。而进入OnTick时已经形成的订单数组将不会改变(当然,除非你在程序执行过程中自己改变)。

 
STARIJ:

string s=FileReadString(F1); // 读取文本文件的字符串。
StringSplit(s, "," , a); // 将逗号分隔的字符串元素放入一个数组。
datetime T1=StrToTime(a[4]); // 进一步,转换 ...
int ord=StrToInteger(a[8])。
double Price=StrToDouble(a[12])。

谢谢你,这正是我想要的。



接下来,有5种产品被制成

我们抛出了一个警报读数(任何)。

例如,级别 "200"

当警报响起时,有东西打开姿势,有东西删除自己,有东西做其他事情。我想实现一种机制,以这种方式发出信号


P.S.

我已经完成了我想做的事情,我可以把它送去审查。棚子很完美。但禁止在这里发帖。

 
Ihor Herasko:

例如,可以一次性按类型划分订单。买入,卖出,BuyStop,SellStop,BuyLimit,SellLimit。那么我们将需要四个这样的数组。但这样一来,我们在做交易决策时就不需要再去看整个未结订单的清单了。我们只需要知道某种类型的订单数量并参考必要的数组。

这正是我所需要的,或者说只是为了买和卖。对于我的简单策略来说,最主要的是不要让未平仓的头寸相互干扰,看清平仓条件。也许,我们可以不使用数组?我不理解它们:如何创造它们,如何解决它们--我在黑暗中。也许我的情况在截图上会让你看得更清楚。

似乎代码中的一切都很简单,工作也很清楚,但这是唯一不被理解的情况。

 
novichok2018:

这正是我所需要的,或者说是只用于买卖。对于我的简单策略来说,最重要的是未结头寸不干扰对方的平仓条件。也许我们可以不使用数组?我不理解它们:如何创造它们,如何解决它们--我在黑暗中。也许我的情况在截图上会让你看得更清楚。

似乎代码中的一切都很简单,工作也很清楚,但这是唯一不被理解的情况。

当然,在最简单(和中等复杂度)的情况下,没有数组会更方便。而当你到了使用数百个订单的时候,区分订单就容易多了。例如,根据OrderType() - 一个是买入0,另一个是卖出1。你的交易员策略很好--你可以获得1天的收益,也可以损失半天的时间。我们唯一需要的是如何抓住这些箭。而且它们太频繁了。首先学习如何发出信号是有意义的:买入和卖出
 
LRA:
当然,在最简单(和中等复杂度)的情况下,没有数组是比较方便的。但是,当你到了使用数百个订单的地步--那么......

会不会是我这种情况的原因,日志中写道:2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138,并实实在在地重复到

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: 提醒:总订单=3 ?在截图中,你可以看到这段时间捕捉到了卖出的两个收盘条件。

开仓 的信号是由几个指标的组合触发的,并由一个指标关闭。而且他们并不经常工作:在5分钟内可能会沉默几天。例如,自今年2月1日以来,只有14个职位被触发。


 
novichok2018:

会不会是我这种情况的原因,日志中写道:2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138,并实实在在地重复到

2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: 提醒:总订单=3 ?在截图中,你可以看到这个时期捕捉到两个接近的条件

你是什么情况?你是说,终端正在做一个导致错误的日志条目?你知道在哪里找吗?你是如何实现的,这是一个非常罕见的错误。 你在截图中看到的是战斗的一半。如何向专家顾问解释这个问题? 你必须写一些数学条件--而不是查看截图,专家顾问用数字操作

 
LRA:

你是说终端机做了一个日志记录,导致了错误的发生? ...138是什么意思? 你知道去哪里找吗?

不,我是说,测试器在这个历史区间失败了,这使信号无法正常工作。因为重新报价 不可能持续24小时。

 
novichok2018:

不,我的意思是说,在历史上的这一点上,测试仪有一个小故障,这使得信号无法正常工作。因为重新报价不可能持续24小时。

测试器中的引证? 这是我第一次听说。测试器是理想的--它甚至没有滑动

...有东西在踢指标--呈上升趋势。我要买...明白了...虽然我想把TP调高还不够--它已经起作用了......

所以设置一个EA,如果它这样做,那么它将退出,并在下一个tick上继续。并在演示中进行尝试

原因: