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

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
以下是广告内容
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
paladin80:
从减少程序执行的资源消耗的角度来看,哪里是声明变量类型(int、double等)的最佳位置。例如,int i可以全局声明,也可以在int start()中声明 ... for (int i=OrdersTotal()-1; i>=0; i--) ...我有一种感觉,在每个tick上声明比在全局层面上声明一次,就在extern参数之后,成本更高。 或者在资源密集度方面的差异是一样的?

所有的变量(内存位置)都是在程序启动时创建一次,然后必须在文本中出现的地方进行初始化(变量声明),但这并不总是发生,所以如果你想让它正常工作,不要忘记在声明时明确初始化。
 
舒尔金

纠正了代码以符合你的要求。
在测试时,四个订单按照设定的顺序在第一个tick上关闭,第五个在下一个tick上关闭。可能这里有别的问题,因为我已经反复测试过了。
我向你提供程序的代码和测试者的日志。
真诚的。舒尔金

这很清楚。替换

for(i=0, int k=0; i<OrdersTotal();i++,k++)//

到 。

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
你好,你能告诉我如何在每个独立的柱状图块中计算指标值的总和吗? 我写了一个指标,但它只有在被设置时才开始工作。 在以前的柱状图中--什么都没有!你知道吗?我不设法循环 "而"!帮助,专业人士。

	          
 

有以下情况。

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

我已经展示了一段存在误解的代码。所有的变量都被宣布为全局变量。在IsObjectFound() 函数中,我得到了该对象的第一个和第二个价格点的值,名称,以及该对象在当前条上的价格值。如果找到了对象,它应该以真 模式退出函数 否则以假 模式退出

在开始时,我规定了一个条件,如果没有找到对象,那么我就退出函数。

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

我在测试器中运行它,我没有画任何对象,什么都没有--一个光秃秃的图。然而,该函数并没有退出,也没有相应的打印。

 Print("В окне отсуствуют объекты, поиск продолжается...");

启动功能继续进行。这到底是怎么回事?

 
这一点也不好。
 
怎么了?
 

全局变量 是全局搜索。在没有看到数据模型的情况下,你能对该算法说些什么?

我将准确地追踪数据。而isObj真的是布尔值,以及所有这些......。

 
tara:

全局变量是全局搜索。在没有看到数据模型的情况下,你能对该算法说些什么?

我将准确地追踪数据。而isObj真的是布尔值,以及所有这些......。


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

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double objPrice1,                                // Первая координата цены луча     
       objPrice2,                                // Вторая координата цены луча
       objPriceCurr;                             // Цена объекта на заданном баре
int pt;

#define SIGNAL_BUY         0                     // Сигнал на покупку
#define SIGNAL_SELL        1                     // Сигнал на продажу
#define SIGNAL_NO         -1                     // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   if(Digits == 2 || Digits == 4)
     pt = Point;
   if(Digits == 1 || Digits == 3 || Digits == 5)
     pt = Point*10;
   if(Digits == 6)
     pt = Point*100;
   if(Digits == 7)
     pt = Point*1000;

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сигнализатор касания о луч                                                          |
//+-------------------------------------------------------------------------------------+
bool AlertByTouching(int signal)
{
   double priceDevBefore,
          priceDevAfter;
   
   if (signal == SIGNAL_SELL)
   {
      priceDevAfter = objPriceCurr + faustUs * pt;
      priceDevBefore = objPriceCurr - dernovich * pt;

      if (Bid <= priceDevAfter && Bid >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         
         return (true);
      }
   }
   if (signal == SIGNAL_BUY)
   {
      priceDevAfter = objPriceCurr - faustUs * pt;
      priceDevBefore = objPriceCurr + dernovich * pt;
      Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
      Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
      Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
      if (Ask >= priceDevAfter && Ask >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         
         return (true);
      }
   }
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
   if (!IsObjectFound())
      return (SIGNAL_NO);
   if (objPrice1 > objPrice2)
      return (SIGNAL_BUY);
   if (objPrice1 < objPrice2)
      return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
   
   if (signal != SIGNAL_NO)
      if (!AlertByTouching(signal))
         return (0);
   
   Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
  // Print("objPriceCurr = ", objPriceCurr);

  return (0);
}
isObj 是一个int。如果有的话,返回拥有该对象的窗口。如果它不存在,我理解它将返回-1。根据文档,主窗口从0 开始,然后是子窗口...到目前为止,这是一个交易专家顾问的纲要,纯粹是信号。但它想什么时候发信息就什么时候发。