[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 181

 
Activict:

下午好。我有这样一个问题。

我从其他专家顾问和感应器的代码碎片中艰难地重新设计了这个指标以满足自己的需要。这不是一个大的代码,它以我想要的方式工作。

问题是,它在内部进行一些计算,并在图表上显示出向上或向下的箭头。

请告知如何使专家顾问在图表上出现箭头时按正确的方向开立订单。

更确切地说,我只需要知道现在哪个箭头是活动的,我想我可以做其他的事情。

这里有一段代码可以让它更清晰,它是指标中的一个初始化部分

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

提前感谢大家

使用内置的iCustom功能来接收你在专家顾问中需要的自定义指标 的值。



double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

例如,你需要知道在最后一个完全形成的柱子上是否有一个向上或向下的箭头。


double Up=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 1, 1); // стрелка вверх
double Dw=iCustom(NULL, 0, name/* название индикатора */, /* настраиваемые параметры индикатора через запятую */, 2, 1); // стрелка вниз
 

谢谢你的答复是的,箭头有时会丢失。如果箭头消失了,这个方法是否会读出 "0"?

箭头只画在新出现的柱子上,之前的柱子不会重新画,在出现的那一刻,有必要打开一个交易,如果箭头消失了,就分别关闭。

 
有什么办法可以让EA比平时更频繁地使用程序代码向服务器发送请求?这样,就不会有一个请求,而是有两个,或者为此你可以重复程序的外壳......。如果有三个要求而不是一个,那么重复两次......??
 
Activict:

是的,箭头有时会丢失。如果箭头不见了,这个方法通过定制会不会读成'0'?

是的,会的。

激活

箭头只画在形成的柱子上,之前的柱子不会重新画,在发生的那一刻,有必要打开位置,如果箭头消失,则关闭。

因此,如果箭头是在一个完全形成的柱子上,它将不再消失。箭头可以在当前栏上多次出现和消失。
 
激活

спасибо за ответ! Да стрелки иногда пропадают. Этот способ через кастом будет считывать "0" если стрелка пропадет?

在指标的代码中被指定为 "空 "的值被视为与iCustom。通常情况下,它可以是0或EMPTY_VALUE。

EMPTY_VALUE在指标中是默认的,但如果你把SetIndexEmptyValue 放在init()中,它就会有所不同。

 
yellownight:
有什么办法可以让EA比平时更频繁地使用程序代码向服务器发送请求?这样,就不会有一个请求,而是有两个,或者为此你可以重复程序的外壳......。如果有三个要求而不是一个,那么重复两次......??
这对你没有任何好处。用请求轰炸服务器,你的账户可能会被完全禁用。我知道这种情况发生在那些 "过度请求 "和用太多的请求 "轰炸 "服务器的人身上。
 

我已经写了一个简单的指标。以下是代码。

//+------------------------------------------------------------------+
//|                                            AngleByLineFromMA.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string  h1 = "основные параметры машки";
extern int     maTF = 0;
extern int     maPeriod = 50;
extern int     maShiftByPrice = 0;
extern int     maMethod = 0;
extern int     maPrice = 0;
extern int     shiftBarsBack1 = 2;                       // Первое значение shift
extern int     shiftBarsBack2 = 7;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Другие переменные";
double         pointOfMaFirst,                           // Первая тока (начало отрисовки отрезка)
               pointOfMaLast,                            // Вторая тока отрезка (конец отрисовки отрезка)
               varsAngle[1000];                              // Буфер для хранения значение возвращаемых машкой

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
//#property indicator_minimum -45
//#property indicator_maximum 45
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {
    ObjectsDeleteAll();                                  // Очистим график от всего
    
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
    int i, countedBars = IndicatorCounted();
    int limit = Bars - countedBars;
    if (limit > 400) limit = 400;
        
    for(i = limit;i > 1;i--)
    {
      pointOfMaFirst = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1+i);   // Начальная точка прямой
      pointOfMaLast = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2+i);     // Крайняя точка прямой
    
      varsAngle[i] = pointOfMaFirst - pointOfMaLast;
      Print("varsAngle[i] = ", varsAngle[i]);
    }

    return(0);
  }
这里面只有一个缓冲区。指标值的类型为双数

在专家顾问中,我决定获得指标的值,并将其作为过滤器应用于交易中。

在这里,我写了一个简单的函数调用,这个指标的缓冲区在最后形成的酒吧。

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
测试仪中的斜率 值不正确。
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 16:57:26     2009.10.26 00:23  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647

为什么?该类型是正确的。这个电话也是正确的。该指标根本就能正常工作。这里是来自测试者的日志,但来自真实的当前市场。

2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0009
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.0011
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001
2013.02.26 16:57:05     AngleByLineFromMA simplest EURUSD,H1: varsAngle[i] = 0.001

为什么总是返回一些数字2147483647而不是需要的数字?

 
hoz:

我已经写了一个简单的指标。以下是代码。

它只有一个缓冲区。指标值为双倍 类型。

在专家顾问中,我决定获得指标的值,并将其作为过滤器应用于交易中。

在这里,我写了一个简单的函数调用,这个指标的缓冲区在最后形成的条形上。

测试仪中返回的斜率 值不正确。

为什么?该类型是正确的。这个电话也是正确的。该指标根本就能正常工作。这是测试器上的日志记录,以及来自真实的当前市场。

为什么总是返回一些数字2147483647而不是需要的数字?

在测试者开始工作时,历史上没有足够的条数来正确计算指标

//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF)<maPeriod) { Print("Недостаточно баров в истории для корректного расчёта значений индикатора!"); return(-1.0); }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   
   return(slope);
}
 
//+-------------------------------------------------------------------------------------+
//| Получаем направление фильтрующей МА                                                 |
//+-------------------------------------------------------------------------------------+
double GetSlopeOfMa()
{
   if(iBars(NULL, i_TF) < maPeriod)
   {
      Print("Недостаточно баров в истории для корректного расчёта значений индикатора!");
      return(0);
   }
   double slope = iCustom(NULL, i_TF, "AngleByLineFromMA simplest", 0, 1);
   Print ("slope = ", slope);
   Print ("iBars(NULL, i_TF) = ", iBars(NULL, i_TF));
   
   return(slope);
}

我从2007年开始从Dukascopy下载了一个故事...不可能没有足够的酒吧。MA期仅为50。

我粘贴了你的行文,但我更正了return(0)......并增加了图表上的条数 的输出。

在这里的日志中。

2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: iBars(NULL, i_TF) = 15895
2013.02.26 17:53:26	2009.10.26 00:22  D_Aleks_first_pattern EURUSD,H1: slope = 2147483647


 
hoz:

我从2007年开始从Dukascopy下载了一个故事...不可能没有足够的酒吧。MA期仅为50。

这是你的行,但我用return(0)纠正了它 ...

在这里,它是在日志中。


问题似乎出在指标上

 if (limit > 400) limit = 400;