bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {// Объявление функции. Передаваемые параметры: sy = символ, op - тип, mn - магикdatetime t; // Переменная содержит время закрытия ордераdouble ocp, osl; // ocp - цена закрытия позиции, osl - цена СтопЛосс закрытой позицииint dg, i, j=-1, k=OrdersHistoryTotal(); // k содержит общее количество ордеров в историиif (sy=="0") sy=Symbol(); // Если в ф-цию передан sy равный 0 или NULL, то использовать символ графикаfor (i=0; i<k; i++) { // Цикл по массиву закрытых ордеровif (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбран ордер из массива закрытых ордеров, ...if (OrderSymbol()==sy || sy=="") { // ... если его символ совпадает с нашим, ...if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // ... если его тип Бай или Селл, ...if (op<0 || OrderType()==op) { // ... если тип ордера равен или -1 (имеется ввиду любой) или равен переданному в ф-цию, ...if (mn<0 || OrderMagicNumber()==mn) { // ... если его магик или любой (-1) или равен переданному в ф-цию (магику советника), ...if (t<OrderCloseTime()) { // ... если переменная t содержит время закрытия меньше, чем время закрытия выбранного ордера, то ...
t=OrderCloseTime(); // ... то присвоим переменной t время закрытия выбранного ордера (этот ордер закрыт позже предыдущего)
j=i; // Запишем в переменную j индекс найденного ордера с максимальным временем закрытия
}
}
}
}
}
}
} // По окончании цикла в переменной j находится индекс последнего закрытого ордераif (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { // Выберем его по индексу
dg=MarketInfo(sy, MODE_DIGITS); // Количество цифр после десятичного точки в цене инструмента, заданного переменной syif (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2; // Честно... точно не скажу, но вижу, что корректировка под йену
ocp=NormalizeDouble(OrderClosePrice(), dg); // Нормализуем цену закрытия ордера для дальнейшего сравнения с ценой СтопЛосс
osl=NormalizeDouble(OrderStopLoss(), dg); // Нормализуем цену СтопЛосс ордера для сравнения с ценой закрытияif (ocp==osl) return(True); // Если эти цены равны, значит поза закрыта по стопу, возвращаем значение "Истина"
}
return(False); // Возвращаем "Ложь"
}
你好,我对这个问题感兴趣。alpari是否提供一个服务器,你可以在那里上传你的顾问,以便它可以24小时 工作?你能不能当面回复一下?
它不工作,也许我需要改变这里的东西或把它放在开始之后。
我试着把你纸上的代码翻译成我理解的俄语,但没有用。
它太复杂了,特别是当每个条件中的条件跟在后面,八个条件中的一个条件。
当然,我不认为谁创造了这个代码是一个奇迹,但对我来说,它是一个完全的变态(在一个好的方面)。
我懒得给每个操作和条件加上注释,除了标准函数。
代码中存在一些冗余,但代码是可读的
有些东西对你不起作用,不是这个代码...:)
这就是所有的逻辑...维克多是对的--它是多余的,但尽可能的简单...:)
关于改变程序中的时期的问题...例如,有一个特定的操作顺序,应该适用于不同的时期......据我所知,以时间轴的形式来做比较容易......通过改变周期...我在文档中找到了一个返回周期值的函数......但我找不到改变它的函数......我错在哪里?
图形的周期 可以是以下任何数值。
非常感谢你,我只是需要一些澄清 ...对于一组操作人员在某一时期的工作,只需在他们前面指定一个时期就足够了,就像在这个表格中显示的那样?
为了给你的问题提供正确的答案,你至少需要看到一个具体需要设置周期的示例代码...
string trend() {int count,count_change; double bar_centr; string trend; bool clear; for (int i=10; i!=0;i--) { bar_centr = (High[i]-Low[i])/2+Low[i]); if (bar_centr>((High[i+1]-Low[i+1])/2+Low[i+1]) count++; if (bar_centr<((High[i+1]-Low[i+1])/2+Low[i+1] ) count--; } Print (count, " period "
,Period()); if (count>3) trend="buy"; if (count<-3) trend="sell"; if (count<3||count>-3) trend="uncertain"; return(trend);}
这个功能需要一致地应用于不同的时期 ...如果我用不同的时间段将它连接到终端的WINDOWS上,它就能工作 ...问题是,EA是否有可能处理几个不同的时期 ...
这个函数必须连续应用于不同时期......。如果我把EA连接到终端的windows上,用不同的时期,它就能工作......问题是,EA是否有可能处理几个不同的时期 ...
我知道你希望你的函数不仅对当前的图表和周期起作用,而且对传递给它的任何周期起作用 ...
现在,像这样调用你的函数
trend(Symbol(), Period()); // 它将返回EA在其中徘徊的图表和时期的值...
trend(USDJPY, PERIOD_D1); // 它返回USDJPY符号 和 "1天 "周期的值。
你可以输入1440代替PERIOD_D1--它将得到相同的结果...
如果在没有参数的情况下被调用,该函数将返回当前符号和周期的值(它们在默认情况下被设置)。
我知道你希望该函数不仅对当前的图形和周期起作用,而且对传递给它的任何图形起作用......。
现在像这样调用你的函数。
trend(Symbol(), Period()); // 它将返回EA在其中徘徊的图表和时期的值...
trend(USDJPY, PERIOD_D1); // 它返回USDJPY符号和 "1天 "周期的值。
你可以输入1440,而不是PERIOD_D1--这都是一样的...
全面的答案...非常感谢你...