[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 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--) ... У меня есть ощущение, что объявление на каждом тике затратнее, чем один раз на глобальном уровне, сразу же после extern parameters.   Или же разница в ресурсоёмкости одинакова?

  все равно, все переменные (место для переменной в памяти) создаются один раз при старте программы, в дальнейшем переменная должна быть проинициализированна в том месте где она встречается в тексте (объявление переменной),но это случается не всегда, так что если хотите что бы все работало как надо, не забывайте ее явно проинициализировать при объявлении. на скорость не влияет, можете хоть внутри цикла объявлять - проверено.
 
Shurkin:

Код исправил в соответствии с вашим.
При тестировании четыре ордера закрылись в порядке установки на первом тике, пятый - на следующем. Вероятно, здесь что-то ещё не так т.к. тестировал неоднократно.
Код программы и записи из журнала тестера привожу.
С уважением. Shurkin 

Все ясно. Замените

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

 на

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
Здравствуйте.Подскажите,как подсчитать сумму значений индикатора в каждом отдельном блоке гистограммы.Я написал индикатор,но он начинает работать только с момента его установки.На предыдущих барах - пусто! Не удаётся мне цикл "while"!Помогите,профессионалы.

	          
 

 Имеется следующая ситуация:

 

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
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() я получаю значения первой и второй точки цены обекта, имя, и значение цены объекта на текущем баре. Если объект найден должно быть, что из функции выходит в режиме trueиначе в false .

В старте, я прописал условие, что если объект не найден, то выходим из функции:

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 начинается главное окно и дальше подокна... Пока что это набросок для торгового эксперта, чисто сигнальный. Но выдаёт сообщения когда ему вздумается.