[警告关闭!]任何新手问题,为了不给论坛添乱。专业人士,不要走过。没有你,哪里都不能去。 - 页 935

 

你好,我对这个问题感兴趣。alpari是否提供一个服务器,你可以在那里上传你的顾问,以便它可以24小时 工作?你能不能当面回复一下?

 
gheka:

它不工作,也许我需要改变这里的东西或把它放在开始之后。

我试着把你纸上的代码翻译成我理解的俄语,但没有用。

它太复杂了,特别是当每个条件中的条件跟在后面,八个条件中的一个条件。

当然,我不认为谁创造了这个代码是一个奇迹,但对我来说,它是一个完全的变态(在一个好的方面)。

我懒得给每个操作和条件加上注释,除了标准函数。


代码中存在一些冗余,但代码是可读的

 
关于计划中的时期变化的问题...例如,有一个特定的运算符序列 需要应用于不同的时期......据我所知,以cicle的形式来做这件事比较容易......通过改变周期...我在文档中找到一个返回周期值的函数......但我找不到改变它的函数......我做错了什么?
 

有些东西对你不起作用,不是这个代码...:)

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);                       // Количество цифр после десятичного точки в цене инструмента, заданного переменной sy
    if (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);                                          // Возвращаем "Ложь"
}

这就是所有的逻辑...维克多是对的--它是多余的,但尽可能的简单...:)

 
Skopcheny:
关于改变程序中的时期的问题...例如,有一个特定的操作顺序,应该适用于不同的时期......据我所知,以时间轴的形式来做比较容易......通过改变周期...我在文档中找到了一个返回周期值的函数......但我找不到改变它的函数......我错在哪里?

图形的周期 可以是以下任何数值。

恒定 价值 描述
PERIOD_M1 1 1分钟
PERIOD_M5 5 5分钟
PERIOD_M15 15 15分钟
PERIOD_M30 30 30分钟
PERIOD_H1 60 1小时
PERIOD_H4 240 4小时
PERIOD_D1 1440 1天
PERIOD_W1 10080 1周
PERIOD_MN1 43200 1个月
0 (零) 0 当前时间表的期限
 
非常感谢你,我只是需要一些澄清 ...对于一组操作人员在某一时期的工作,只需在他们前面指定一个时期就足够了,就像在这个表格中显示的那样?
 
Skopcheny:
非常感谢你,我只是需要一些澄清 ...对于一组操作人员在某一时期的工作,只需在他们前面指定一个时期就足够了,就像在这个表格中显示的那样?
为了正确回答你的问题,你至少需要看到一个需要指定特定时期的代码实例...
 
artmedia70:
为了给你的问题提供正确的答案,你至少需要看到一个具体需要设置周期的示例代码...


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是否有可能处理几个不同的时期 ...

 
Skopcheny:


这个函数必须连续应用于不同时期......。如果我把EA连接到终端的windows上,用不同的时期,它就能工作......问题是,EA是否有可能处理几个不同的时期 ...

我知道你希望你的函数不仅对当前的图表和周期起作用,而且对传递给它的任何周期起作用 ...

string trend(string sy="", int tf=0)
{
   int count,count_change;
   double bar_centr;
   string trend;
   bool clear;

   if (sy=="" || sy=="0") sy=Symbol();      
   if (tf==0) tf=Period();
   
   for (int i=10; i>0; i--)
      {
         bar_centr = (iHigh(sy,tf,i)-iLow(sy,tf,i))/2+iLow(sy,tf,i);
         if (bar_centr>((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tf,i+1)))
            count++;
         if (bar_centr<((iHigh(sy,tf,i+1)-iLow(sy,tf,i+1))/2+iLow(sy,tfi+1)))
            count--;
      }

   Print (count,"период ",tf);

   if (count>3) trend="покупка";
   if (count<-3) trend="продажа";
   if (count<3||count>-3) trend="неопределенность";

   return(trend);
}

现在,像这样调用你的函数

trend(Symbol(), Period()); // 它将返回EA在其中徘徊的图表和时期的值...

trend(USDJPY, PERIOD_D1); // 它返回USDJPY符号 和 "1天 "周期的值。

你可以输入1440代替PERIOD_D1--它将得到相同的结果...

如果在没有参数的情况下被调用,该函数将返回当前符号和周期的值(它们在默认情况下被设置)。

 
artmedia70:

我知道你希望该函数不仅对当前的图形和周期起作用,而且对传递给它的任何图形起作用......。

现在像这样调用你的函数。

trend(Symbol(), Period()); // 它将返回EA在其中徘徊的图表和时期的值...

trend(USDJPY, PERIOD_D1); // 它返回USDJPY符号和 "1天 "周期的值。

你可以输入1440,而不是PERIOD_D1--这都是一样的...




全面的答案...非常感谢你...
原因: